在编写测试之前设计模型或编写设计模型的测试是否是正确的TDD实践?

时间:2010-10-21 13:35:28

标签: model tdd domain-driven-design

我正在构建一个DDD系统,我们已经为已经设置的系统提供了纸上的所有要求。关于我们如何构建我需要意见的域模型存在分歧。

我的偏好是采用这些要求并勾勒出一个基本的域模型,其中包含类,它们的属性和行为以及白板或visio上的关系的大纲。然后,我接着开始构建单元测试,用于逐个构建和测试我的模型。

我的同事似乎认为这不是很好的TDD + DDD练习。他们认为你不应该勾勒出任何东西并开始构建测试,并在你完成测试的“感觉”时设计你的模型。

在构建DDD模型时,哪一种被认为是“正确的”TDD技术?

4 个答案:

答案 0 :(得分:7)

与任何类型的软件工程问题一样,答案往往是“两者兼而有之”。

你不能真正编写任何测试,除非你已经某些想知道你将要测试什么,但你也可以使用你的测试来影响你的模型设计。也许这一切都发生在你的大脑内部,或者你可能记录了这个过程,但是(在我看来)你最终将不得不同时使用这两个想法。

就个人而言,我会做几个用例,对域模型进行一次尝试,然后为它编写测试,看看测试会引发哪些设计问题。冲洗并重复。这一切都应该与团队的其他成员合作完成。

答案 1 :(得分:3)

我不知道如何在不了解您所谈论的数据项的情况下编写测试。

 Thing myThing = getThingById( 87 );
 assert(Thing is Blue);

如果不了解Thing的存在,或者它有id和颜色,则无法编写测试。换句话说,在写作中,即使是最简单的测试,至少还有一个胚胎数据模型。草拟非正式模型可以帮助您推断您的测试。

诀窍是避免在编写测试之前陷入详细的实现,所以我可以理解为什么人们只提供测试的建议。

一个让我感兴趣的问题 - 鉴于我们在什么阶段可以通过许多不同的数据模型(考虑非规范化)来满足相同的测试,我们是否会开始构建更好的数据模型?

答案 2 :(得分:0)

如果我理解正确,你想在进行任何设计之前开始编码。那是错的。对于敏捷开发,您需要在执行任何其他操作之前进行一些设计。当然,它应该尽可能灵活,不应该深入细节。通过单元测试来细化细节。

答案 3 :(得分:0)

TDD最重要的好处之一是,它可以让您以不同的方式考虑您的应用程序,就像DDD和我们在开发中尝试的许多其他实践一样。没有太多细节的详细思考是最重要的。