tdd - 如何使用硬件进行 TDD

  显示原文与译文双语对照的内容
76 4

所有我工作的项目与一个硬件,这通常是软件的主要目的。是否有有效的方法可以将TDD应用到与硬件一起工作的代码中?

更新: 抱歉,我的问题不清晰。

我使用的硬件是一个捕获摄像机图像的帧抓取器。然后我处理这些图像,显示它们并将它们保存到磁盘。我可以以通过使用以前捕获的图像在磁盘上捕获图像来模拟所有发生的处理。

但这是我想测试的与硬件的实际交互。例如,当没有相机时,我的软件正确地处理,是否正确启动和停止抓取 等等 。

我正在寻找一些具体的例子来说明人们如何处理这种情况。

时间:原作者:0个回答

58 0

将你的测试套件分为两个部分:

第一部分针对实际硬件运行测试。这里部分用于构建 Prototype 。通过编写自动测试,如果你有任何疑问是否正确工作,你可以以再次运行它们。

第二部分是针对Prototype进行。这里部件自动运行。

在确保硬件正确连接之后,部件 #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")); }
}
原作者:
140 2

创建一个薄层,用于控制硬件,并使用系统测试( 手动或者自动) 来确保控制层按预期工作。然后创建一个控制层的虚拟/模拟实现,它的行为像实际硬件的接口一样。

几年前我正在编写用SQUID磁强计测量的软件。硬件很大,不可以移动和昂贵的( 视频 ),因这里无法总是能够访问硬件。我们有关于设备( 通过串行端口)的通信协议的文档,但文档不是 100%精确的。

有助于我们创建一个监听来自一个串行端口的数据的软件,并将它的重定向到它的他串行端口。然后,我们能够找到旧程序( 我们正在替换) 与硬件的通讯,并反向工程程序。它们是这样连锁的:旧程序 <-> 虚拟环路串行端口 <-> 我们的数据记录器 <。> 实际串行端口 <-> 硬件。

那时我们没有使用 TDD 。虽然在硬件上编写了 模拟器,但是我们可以独立测试程序,因为我们不知道硬件应该如何工作,所以在最后我们不需要编写精确的模拟器,所以我们不需要这样做。如果我们已经经更好地知道了硬件,我们可以以为它创建一个 模拟器,这将使程序更容易开发。使用实际硬件测试最有价值,后来我们应该花更多的时间测试硬件。

原作者:
...