我在接受采访时问了这个问题,最好的方法是什么?
我知道TDD的生命周期如下
1- Write the test
2- Run the test (there is no implementation code, test does not pass)
3- Write just enough implementation code to make the test pass
4- Run all tests (tests pass)
5- Refactor
6- Repeat
让我们说我想创建一个软件并遵循TDD。我应该在哪里设计软件?例如,我想设计一个软件来启用用户注册,使他们能够访问他们的个人资料并搜索产品。
根据我应该编写的测试步骤,让我们说注册,然后编写代码让它通过然后尝试重构它,如何设计软件? 我有点困惑。
TDD是关于对软件进行新的更改并对其进行测试,设计如何?让我们说我正在开发一个应用程序,它具有以下功能,注册,会员资料,访问搜索功能(仅限会员)搜索产品,第二搜索功能可供公众和会员访问,关于我们页面,联系我们页面,两次搜索的产品付款。
我应该开始考虑设计,在完成设计之后开始编写测试然后实现代码,让我们说注册部分,然后成员资料,成员搜索功能,关于我们,联系我们,公共搜索功能和最终产品分别付款?
答案 0 :(得分:2)
你应该总是考虑设计。瀑布模型和TDD(或任何XDD)之间不同的大设计是瀑布使用“Big Upfront Design”,其中在编写任何代码之前完成完整的设计,并且最终的设计是一成不变的。
这导致了问题,因为后期需求发生变化或开发后的额外清晰度会影响整体设计,在更改软件方面的时间和金钱都非常昂贵。
TDD仍然有一个设计前期,它只是没有一成不变。并且希望由于您的代码是以TDD风格编写的,因此它经过了全面测试并且模块化,因此任何下游设计变更都很便宜,并且不会在其他模块中产生连锁反应。敏捷宣言的一部分是YAGNI(你根本不需要它),它用于保持设计尽可能简单。如果后来证明你需要一个更复杂的设计,它就不会像通过瀑布那样昂贵。
总结一下:
在TDD的每一步之前,期间和之后总是考虑设计,不要让它变得比你现在所知道的更复杂。
这是我发现的博客文章,更详细地介绍了这一点: http://www.javacodegeeks.com/2014/09/agile-myth-6-agile-means-no-upfront-design.html