TDD,如何编写即使对象不存在也将编译的测试

gri*_*egs 6 tdd visual-studio-2012

我正在使用VS 2012,但这并不重要.

重要的是我通过先编写所有测试然后创建代码来尝试做一些TDD.

但是,应用程序将无法编译,因为我的对象或方法都不存在.

现在,在我看来,我应该能够创建我的所有测试,但仍然运行我的应用程序,所以我可以调试等.测试不应该阻止编译,因为缺少对象和方法.

我认为它的重点在于,当您开发测试时,您可以开始看到重复等,以便您可以在编写单行代码之前进行重构.

所以问题是,有没有办法做到这一点,还是我做错了?

编辑 我正在使用VS2012和C#

Joh*_*ers 5

测试驱动开发是关于非常小的迭代。您没有预先定义所有测试。您根据一项需求的一小部分创建一项测试。然后您实现代码以通过该测试。一旦它通过,您就可以处理需求的另一部分。

这个想法是,尝试预先完成所有设计(无论是创建详细的类图还是创建一堆测试)意味着您会发现更改设计中的弱点成本太高,因此您不会改进您的设计代码。

这是一个例子。假设您决定使用继承来关联两个对象,但是当您开始实现这些对象时,您发现测试它们变得很困难。您会发现单独测试每个对象并通过收容将它们关联起来会容易得多。正在发生的事情是测试将您的设计推向更松散耦合的方向。这是 TDD 的一个非常好的结果 - 您正在使用测试来改进设计。

如果您事先编写了所有测试并假设您的继承设计决策是一个不错的选择,那么您要么会放弃大量工作,要么会说“现在做出这样的更改太难了,所以我会只是接受这种次优设计。”

您当然可以提前创建与业务规则相关的验收测试。这些被称为行为测试(行为驱动开发的一部分,或 BDD),它们非常适合从用户的角度测试软件的功能。但那些不是单元测试。单元测试用于从开发人员的角度测试代码。提前创建单元测试违背了 TDD 的目的,因为它会使测试变得更加困难,它会阻止你改进你的代码,并且经常会导致实践的反叛和失败。这就是为什么正确地做这件事很重要。


Gis*_*shu 5

我看到一个小问题

首先编写我的所有测试,然后创建代码。

你不需要先写所有的测试,你只需要一个,让它失败,让它通过并重复。这意味着理想情况下,您应该在任何时候都有一个失败的测试。

从这个意义上说,编译失败算作失败的测试。所以下一步是让它通过——即添加存根或返回默认值以使其编译。然后测试将是红色的......然后努力让它变成绿色。


Pre*_*gha 2

不。这是关于编码足以验证所需用例的实现

您可以尽早定义测试用例,但是为了编写测试用例,您需要迭代地编写测试,让它失败。然后编写一些代码,确保代码通过。

然后冲洗并重复,直到覆盖所有测试用例,

编辑以解决评论。

当您构建代码时,您的编程设计和错误就会被识别出来。极限编程使您能够毫不费力地更改代码,因为测试基础可以保护您的需求。您的意图是好的,但现实是,当您通过构建代码和测试库发现设计问题和缺陷时,您将重构/重新设计测试用例。

然而,恕我直言,在非常一般的情况下,无法编译的测试实际上是一个失败的元测试,需要在继续之前进行纠正。它告诉你写一些代码!