我决定尝试在我已经开始的项目中尝试TDD和BDD,鼓励这样的问题的答案: 我应该开始在不使用它的项目上使用TDD
我正在努力真正开始它.我的项目(opensource,托管在http://gitorious.org/rubots中)类似于游戏,并使用Ruby来包装并连接到控制服务器和物理模拟环境.执行脚本,然后出现GUI,当用户点击启动时,启动外部c ++程序,其中一个是物理模拟,它们由具有Ruby绑定的库控制.没有办法重置模拟和控制程序,它们应该重新启动.启动它们并使它们处于工作状态需要5秒钟.在此上下文中,在任何移动之前,任何测试都需要整个启动阶段,并且模拟依赖于应该提供的外部配置文件.
它真的值得开始编写测试用例吗?怎么样?每个测试都有:开始游戏之前或类似,启动应用程序等?然后每个测试至少需要5秒钟(如果我必须提交命令并等待模拟实体回答,则会更多).
我错过了什么.我是否应该不仅跳过BDD和TDD,还要跳过这种应用的测试单元?
在RubyConf 2007上,Atomic Object的 William Bereza 发表了关于使用Ruby增强嵌入式开发的演讲,其中他描述了他们如何将Atomic Object所代表的原则(敏捷,BDD,自动化测试......)应用于涉及自动机器人的嵌入式项目车辆.几个月前,他在O'Reilly OSCON 2007上发表了同样的演讲.
Atomic Objects网站上有大量资源:
敏捷嵌入式软件开发,
论文,
演讲和
免费软件包括
SysTiR(Ruby中的系统测试)和
Unity - (嵌入式)C的紧凑测试框架
还有一个关于Ward Cunningham和TDDing嵌入式系统的伟大故事,Robert C. Martin("鲍勃叔叔")在RailsConf 2009的主题演讲中讲述过(故事大致从15:50到17:20).这个故事是这样的:
鲍勃来看望沃德,后者把他带到地下室,在那里他盯着屏幕上的小圆圈,就像宇宙中最酷的东西一样,他很兴奋,就像一个小孩在圣诞节时打开她的第一辆自行车.他做了什么,试图找出如何完全TDD嵌入式设备(在这种情况下是一个视频转换器),而根本没有触及设备.他做了什么,如下:他已经开始使用模拟在JUnit中编写单元测试.然后进行测试通过,依此类推,就像你通常做的那样.然后他将所有方法替换为为设备生成适当汇编代码的方法.由于所有逻辑都是用Java编写(和测试)的,因此"叶子"方法本身就是非常简单的方法,只做了非常简单的事情,比如"写入int
寄存器"或" bool
从标志寄存器中读取"组件.代码非常简单,"显然是正确的".
当然,当他汇总他生成的代码并闪存设备时,它第一次工作,没有他曾经尝试过设备上的代码,也没有他编写任何实质的汇编代码.
所以,这是两种方法:在Atomic Object的情况下,他们用C语言编写软件,用Ruby编写测试,并从Ruby代码生成测试.在病房的情况下,他写了测试,并在Java代码和生成的代码从Java代码.