TDD 与软件设计之间的关系是什么?

Whats the relationship between TDD and software design?

我在接受采访时被问到这个问题,最好的回答方式是什么?

我知道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 是对软件进行新的更改并对其进行测试,那么设计呢?

更新

假设我正在开发一个应用程序,它具有以下功能、注册、会员资料、访问搜索功能(仅限会员)以搜索产品、public 和会员可以访问的第二个搜索功能,关于我们页面,联系我们页面,两次搜索的产品付款。

我是否应该开始考虑设计,完成设计后开始编写测试,然后是注册部分的实现代码,然后是会员资料、会员搜索功能、关于我们、联系我们、public 搜索功能和最终产品付款分别是什么?

您应该始终考虑设计。瀑布模型和 TDD(或任何 XDD)之间的最大设计不同是瀑布使用 "Big Upfront Design",其中在编写任何代码之前完成完整的设计,最终设计是一成不变的。

这导致了问题,因为以后的需求更改或开发开始后的额外清晰度会影响整体设计,在更改软件的时间和金钱方面非常昂贵。

TDD 仍然有一个预先的设计,它不是一成不变的。希望由于您的代码是用 TDD 风格编写的,它已经过全面测试和良好的模块化,因此任何下游设计更改的成本都很低,并且不会在其他模块中引起连锁反应。

敏捷宣言的一部分是 YAGNI(您不会需要它),它用于使设计尽可能简单。如果后来发现您需要一个更复杂的设计,那么更改它不会像通过 Waterfall 进行更改那样昂贵。

总结一下:

在 TDD 中的每个步骤之前、期间和之后始终考虑设计,不要让它变得比您目前所知道的需要的复杂。

这是我发现的一篇博客文章,其中更详细地介绍了这一点: http://www.javacodegeeks.com/2014/09/agile-myth-6-agile-means-no-upfront-design.html