Unit testing 单元测试,测试驱动开发

Unit testing 单元测试,测试驱动开发,unit-testing,tdd,nunit,Unit Testing,Tdd,Nunit,我和我的同事就单元测试和测试驱动开发进行了辩论。主题如下: 1) 在编写功能代码之前编写单元测试并不构成测试驱动的开发方法 我认为编写单元测试确实构成了测试驱动的开发,它是TDD的一部分 2) 一套单元测试只是TDD的副产品 单元测试套件不是TDD的副产品 你说呢?在编写功能代码之前编写单元测试是TDD的全部要点。因此,单元测试套件不是副产品,而是中心单元 测试驱动开发(TDD)是一个软件开发过程,它依赖于非常短的开发周期的重复:首先,开发人员编写一个失败的自动测试用例,定义所需的改进或新功能

我和我的同事就单元测试和测试驱动开发进行了辩论。主题如下:

1) 在编写功能代码之前编写单元测试并不构成测试驱动的开发方法

我认为编写单元测试确实构成了测试驱动的开发,它是TDD的一部分

2) 一套单元测试只是TDD的副产品

单元测试套件不是TDD的副产品


你说呢?

在编写功能代码之前编写单元测试是TDD的全部要点。因此,单元测试套件不是副产品,而是中心单元

测试驱动开发(TDD)是一个软件开发过程,它依赖于非常短的开发周期的重复:首先,开发人员编写一个失败的自动测试用例,定义所需的改进或新功能,然后生成代码以通过该测试,最后将新代码重构到可接受的标准

1) 在编写功能代码之前编写测试是进行TDD的必要条件,但它本身并不构成TDD,至少根据经典定义,其中重要的一点是,通过测试是驱动设计的因素(而不是一些正式的设计文档)


2) 同样,经典观点认为重要的一点是,设计是从测试中演变而来的,这迫使它变得非常模块化。这是(或曾经是)一个新颖的概念,测试可能(也应该)影响设计,并且可能经常被拒绝或忽略,因此TDD支持者开始觉得需要强调它。但是说测试本身只是“一个副产品”在我看来是适得其反的夸张。

这实际上取决于你的测试做什么

就我而言,TDD意味着代码类、属性和方法的创建是因为首先要为它们编写测试。事实上,一些开发工具允许您直接从测试屏幕创建代码存根

为已经创建的类中的方法编写单元测试不是TDD。编写代码以使您的测试用例通过是非常困难的

TDD将为您提供比标准单元测试更大的测试覆盖率。它还将把您的想法集中在代码的需求上,尽管根据定义生产产品似乎需要更长的时间,但它在构建时或多或少都经过了全面测试

最后,您总是会得到一套单元测试


然而,必须采取务实的方法来了解这一点,因为一些领域在TDD环境中是出了名的难以产生的,例如WPF MVVM风格的视图或带有javascript的网页。

TDD都是关于红-绿-重构的

当您在测试前有代码时,没有红色,这是不好的,因为您的测试或测试中可能有错误,然后您认为您正在测试,并从一开始就变为绿色。只有在添加了由该测试测试的代码之后,才应该是红色,然后变为绿色


谢谢。你能详细解释一下为什么单元测试不构成测试驱动的开发吗?@Pingpong:正如我所写的:TDD意味着设计应该受到测试的影响。如果您在编写测试之前完成了设计,那么即使您在开始实施设计之前编写了测试,您也不是在做经典的TDD。谢谢。我可以用另一种方式问一下,我使用单元测试工具来执行TDD。例如,通过使用NUnit以红、绿、重构周期首先编写测试代码。因此,单元测试似乎是TDD的一部分。@PingPong-一部分,但不是全部:必要但不充分。同意。如果测试套件真的是一个副产品,那么您可以随时将其删除,并继续您的TDD。但是你不能把它们拿走,因为它们是重构步骤所必需的。因此,在取消测试之后开发的任何新特性都将是测试优先,而不是测试驱动的。TDD是testfirst的超集。2.你可以这样说,考虑到你正在使用TDD来驱动设计,而不是仅仅测试你所拥有的。在这种情况下,你可以说设计就是产品,测试就是奖励。