我决定在我已经开始的项目上尝试TDD和BDD,鼓励这样的问题的答案: Should I start using TDD on a project that doesn't use it already
我正在努力真正开始。 我的项目(opensource,托管在http://gitorious.org/rubots)类似于游戏,并使用Ruby来包装并连接到控制服务器和物理模拟环境。 执行脚本,然后出现GUI,当用户点击启动时,启动外部c ++程序,其中一个是物理模拟,它们由具有Ruby绑定的库控制。 没有办法重置模拟和控制程序,它们应该重新启动。启动它们并使它们处于工作状态需要5秒钟。 在此上下文中,在任何移动之前,任何测试都需要整个启动阶段,并且模拟依赖于应该提供的外部配置文件。
开始编写测试用例真的值得吗? 怎么样?每个测试都有:开始游戏之前或类似,启动应用程序等?然后每个测试至少需要5秒钟(如果我必须提交命令并等待模拟实体回答,则会更多)。
我错过了什么。我是否应该不仅跳过BDD和TDD,还要跳过这种应用的测试单元?
答案 0 :(得分:6)
在RubyConf 2007上,Atomic Object的William Bereza发表了关于Enhancing Embedded Development with Ruby的讨论,其中他描述了他们如何应用principles that Atomic Object stands for(敏捷,BDD,自动化测试......)涉及自动机器人车辆的嵌入式项目。几个月前,他在O'Reilly OSCON 2007发表了同样的演讲。
Atomic Objects网站上有大量资源:
还有一个关于Ward Cunningham和TDDing嵌入式系统的伟大故事,Robert C. Martin(“鲍勃叔叔”)在his keynote at RailsConf 2009期间讲述的(故事大致从15:50到17:20) 。这个故事是这样的:
鲍勃来看望沃德,沃德把他带到了地下室,在那里他正盯着屏幕上的小圆圈,就像宇宙中最酷的东西一样,他很兴奋,就像一个小孩在圣诞节时打开她的第一辆自行车。他做了什么,试图弄清楚如何完全TDD嵌入式设备(在这种情况下是一个视频转换器),而不用触摸任何设备。他做了什么,如下:他已经开始使用模拟在JUnit中编写单元测试。然后进行测试通过,依此类推,就像你通常做的那样。然后他将所有方法替换为为设备生成适当汇编代码的方法。由于所有逻辑都是用Java编写(并经过测试)的,因此“叶子”方法本身就是非常简单的方法,只能执行非常简单的操作,例如“将int
写入寄存器”或“读取{{1}从一个标志寄存器“,汇编代码非常简单,以至于”显然是正确的“。
当然,当他汇总他生成的代码并刷新设备时,它第一次工作,没有他曾经尝试过设备上的代码,也没有他编写任何实际的汇编代码。
所以,这是两种方法:在Atomic Object的情况下,他们用C语言编写软件,用Ruby编写测试,并从Ruby代码生成 tests 。在Ward的案例中,他用Java编写了测试和代码,并从Java代码中生成了代码。
答案 1 :(得分:2)
这就是存根的用途。基本上,您创建一个Test Double代表访问昂贵服务(如您的情况)或执行其他操作的对象。这允许您在测试时隔离对象并具有更快的运行测试。
这不仅仅是为了加快速度。假设您正在编写一些中间件代码来通过Paypal进行交易。您可能不希望在运行测试时实际使用Paypal服务,这可能很昂贵(字面意思)。
Mocha对这类事情有好处。或者只是创建一个像你的web服务对象一样的对象(因为如果它像鸭子一样行走,这就是Ruby ......)。