2

我决定在我已经开始的项目上尝试 TDD 和 BDD,受到以下问题的回答的鼓舞: 我是否应该在尚未使用 TDD 的项目上开始使用它

我正在努力真正开始。我的项目(开源,托管在http://gitorious.org/rubots中)类似于游戏,使用 Ruby 封装并连接到控制服务器和物理模拟环境。该脚本被执行,然后出现一个 GUI,当用户单击开始时,启动了 2 个外部 c++ 程序,其中一个是物理模拟,它们由具有 Ruby 绑定的库控制。没有办法重置模拟和控制程序,它们应该重新启动。启动它们并使它们处于工作状态大约需要 5 秒钟。在这种情况下,任何移动之前的整个启动阶段的任何测试都需要,并且模拟取决于还应提供的外部配置文件。

开始编写测试用例真的值得吗?如何?每个测试都带有 :before 或类似的启动游戏、启动应用程序等?然后每次测试至少需要 5 秒(如果我必须提交命令并等待模拟实体回答,则需要更多时间)。

我错过了一些东西。我是否应该不仅跳过 BDD 和 TDD,还要跳过此类应用程序的测试单元?

4

2 回答 2

6

在 RubyConf 2007 上, Atomic Object的William Bereza发表了关于用 Ruby 增强嵌入式开发的演讲,其中他描述了他们如何将Atomic Object 所代表的原则(敏捷、BDD、自动化测试……)应用于涉及自主机器人的嵌入式项目车辆。几个月前,他曾在O'Reilly OSCON 2007上发表过同样的演讲。

Atomic Objects 网站上有大量资源:

还有一个关于 Ward Cunningham 和 TDDing 嵌入式系统的精彩故事,Robert C. Martin(“Uncle Bob”)在 RailsConf 2009 的主题演讲中讲述了这个故事(故事大致从 15:50 到 17:20)。故事是这样的:

鲍勃来拜访沃德,沃德把他带到地下室,在那里他盯着屏幕上的小圆圈,好像这是宇宙中最酷的东西,他兴奋得像一个小孩在圣诞节打开她的第一辆自行车。他所做的是试图弄清楚如何完全 TDD 一个嵌入式设备(在本例中是一个视频转换器),而无需接触该设备. 他所做的事情如下:他开始使用模拟在 JUnit 中编写单元测试。然后让测试通过,依此类推,就像你通常做的那样。然后他用为设备生成适当的汇编代码的方法替换了所有方法。由于所有逻辑都是用 Java 编写(和测试)的,因此“叶”方法本身是非常简单的方法,它们只执行非常简单的事情,例如“将一个int写入寄存器”或“bool从标志寄存器中读取一个”代码非常简单,以至于“显然是正确的”。

而且,果然,当他组装他生成的代码并刷新设备时,它第一次工作,他没有在设备上尝试过代码,也没有他写过任何实质性的汇编代码。

所以,这是两种方法:在 Atomic Object 的情况下,他们用 C 编写软件,用 Ruby 编写测试,并从 Ruby 代码生成测试。在 Ward 的案例中,他用 Java 编写测试代码,并从 Java 代码生成代码

于 2009-08-31T12:02:53.390 回答
2

这就是存根的用途。基本上,您创建一个代表访问昂贵服务(如您的情况)或做其他事情的对象的测试替身。这允许您在测试时隔离对象并更快地运行测试。

这不仅仅是为了加快速度。假设您正在编写一些中间件代码来通过 Paypal 进行交易。您可能不想在运行测试时实际使用 Paypal 服务,这可能很昂贵(字面意思)。

摩卡适合这种事情。或者只是创建一个对象,其行为就像您的 Web 服务对象行为一样(因为这是 Ruby,如果它像鸭子一样走路......)。

于 2009-08-31T02:43:36.613 回答