我已经阅读了许多有关TDD的书籍和网站,它们都很有道理,特别是Kent Beck的书。然而,当我尝试自己进行TDD时,我发现自己盯着键盘想开始从哪里下手。您是否有使用的过程?您的思维过程是什么?您如何确定您的第一个测试?
大多数关于此主题的书籍都很好地描述了TDD是什么,但并未说明如何在真实的非平凡应用中实践TDD。您如何进行TDD?
int main(int argc, char *argv[]) {
int result = 0;
myApp &mw = getApp(); // Singleton method to return main app instance
if(mw.initialize(argc, argv) == kErrorNone) {
result = mw.run();
}
mw.shutdown();
return(result);
}
问题在于你正在盯着键盘想要写哪些测试。
相反,先考虑你想要编写的代码,然后找到其中的第一个小部分,再尝试思考可以迫使你编写该小部分代码的测试。
一开始最好是以非常小的片段来工作。即使在一天内,你也会逐渐地处理更大的代码块。但任何时候,当你卡住了,只需考虑下一个你想要编写的最小代码片段,然后为其编写测试。
我同意,启动这个过程确实很难。
我通常尝试将第一组测试想象成电影剧本,也许只是电影的第一场景。
演员1告诉演员2世界有麻烦了,演员2递回一个包裹,演员1打开包裹等等。
显然这是一个奇怪的例子,但我经常发现通过可视化交互是克服最初障碍的好方法。还有其他类似的技术(用户故事、RRC卡等),对于更大的团队也很有效,但听起来你是独自一人,可能不需要额外的负担。
此外,我相信你最不想做的事情就是再读一本书,但MockObjects.com的人们正在撰写一本早期草稿阶段的书,目前标题为Growing Object-Oriented Software, Guided by Tests。目前供审查的章节可能会给你一些关于如何开始TDD并持续进行下去的进一步见解。
有时候你不知道如何进行TDD,因为你的代码不是“测试友好”的(易于测试)。
通过一些良好的实践,你的类可以变得更容易被隔离地测试,从而实现真正的单元测试。
我最近发现了一篇谷歌员工的博客,其中描述了如何设计你的类和方法,使它们更容易测试。
这是他最近的一个演讲,我推荐观看。
他强调了将业务逻辑与对象创建代码分离(即避免将逻辑与“new”运算符混合在一起),使用依赖注入模式。他还解释了德米特法则对可测试代码的重要性。他主要关注Java代码(和Guice),但他的原则应该适用于任何语言。
如果您已经有了自己的设计 - 正如您在Jon LimJap的回答评论中所指出的那样,那么您并没有进行纯TDD,因为TDD是使用单元测试让您的设计出现的过程。
话虽如此,并非所有的商店都允许严格的TDD,而且您手头上已经有了一个设计,所以让我们使用它并进行TDD - 尽管更好的说法是测试驱动编程,但这不是重点,因为这也是我开始TDD的方式。
我认为你不应该从TDD开始。说真的,你的规格在哪里?你是否已经就系统的一般/粗略总体设计达成了共识,这可能适用于你的应用程序?我知道TDD和敏捷开发反对大量预先设计,但这并不意味着你在通过实现该设计的方式进行TDD之前不应该首先进行预先设计。