我工作的所有项目都与一个硬件接口,这通常是软件的主要目的.有没有什么方法可以将TDD应用到与硬件配合使用的代码中?
更新:对不起我的问题更清楚.
我使用的硬件是一个帧捕获器,可以从相机中捕获图像.然后我处理这些图像,显示它们并将它们保存到磁盘.我可以使用先前捕获的存储在磁盘上的图像模拟捕获图像后发生的所有处理.
但这是我想要测试的与硬件的实际交互.例如,当没有连接相机时,我的软件是否正确应对,它是否正确启动和停止抓取等等.但这与硬件相关联,我不知道如何在硬件不存在时测试它或如果我甚至想要这样做?
第二次更新:我也在寻找人们如何处理这种情况的一些具体例子.
创建一个用于控制硬件的薄层,并使用完整硬件进行系统测试(手动或自动),以确保控制层按预期工作.然后创建一个控制层的伪/模拟实现,其外部行为类似于真实硬件的接口,并在为程序的其余部分执行TDD时使用它.
几年前,我正在编写用SQUID磁力计进行测量的软件.硬件很大,不可移动且昂贵(视频),因此无法始终访问硬件.我们有关于设备通信协议的文档(通过串口),但文档并非100%准确.
对我们非常有帮助的是创建一个软件,该软件监听来自一个串口的数据,记录并将其重定向到另一个串口.然后我们能够找出旧程序(我们正在替换)如何与硬件进行通信,以及对协议进行反向工程.它们链接如下:旧程序< - >虚拟环回串行端口< - >我们的数据记录器< - >真实串行端口< - >硬件.
那时我们没有使用TDD.我们考虑过为硬件编写一个仿真器,以便我们可以单独测试程序,但由于我们并不确切知道硬件应该如何工作,因此很难编写一个精确的仿真器,所以最后我们没有做到这一点.如果我们更好地了解硬件,我们可以为它创建一个模拟器,这将使开发程序变得更加容易.使用真实硬件进行测试是最有价值的,事后我们应该花更多时间来测试硬件.
将测试套件分为两部分:
第一部分针对实际硬件运行测试。这一部分用于构建模型。通过为此编写自动测试,如果对样机是否正常工作有任何疑问,可以再次运行它们。
第二部分与样机相对。这部分将自动运行。
在确保硬件正确连接等之后,第1部分将手动运行。一个好主意是创建一套针对工厂返回的测试并运行两次测试的测试套件:真正的“驱动程序”,并曾经反对您的模拟对象的出厂。这样,您可以确保您的模拟完全像真实的一样工作:
class YourTests extends TestCase { public IDriver getDriver() { return new MockDriver (); } public boolean shouldRun () { return true; } public void testSomeMethod() throws Exception { if (!shouldRun()) return; // Allows to disable all tests assertEquals ("1", getDriver().someMethod()); } }
在我的代码中,我通常使用系统属性(-Dmanual = yes)切换手动测试:
class HardwareTests extends YourTests { public IDriver getDriver() { return new HardwareDriver (); } public boolean shouldRun () { return "yes".equals (System.getProperty("manual")); } }