Unit testing 关于测试驱动开发的一些困惑

Unit testing 关于测试驱动开发的一些困惑,unit-testing,testing,tdd,testdrivendesign,Unit Testing,Testing,Tdd,Testdrivendesign,根据TDD中的以下步骤: 步骤1:编写单元测试 步骤2:运行单元测试 步骤3:为模块编写代码 步骤4:再次运行所有测试 步骤5:清理代码 步骤6:重复这些步骤 问题1:在TDD中,我们主要编写单元测试。集成测试和系统测试在上述步骤中适用于哪些方面? 考虑以下示例: 假设我们有一个必须开发的特性。然后根据TDD,我们将在短迭代中开发此功能。假设我们将此功能划分为两个模块–模块1和模块2。我正在为您编写迭代步骤 按照上述步骤在TDD中开发这些模块(问题2)请纠正我在以下步骤中的错误: **迭代1:*

根据TDD中的以下步骤:

步骤1:编写单元测试

步骤2:运行单元测试

步骤3:为模块编写代码

步骤4:再次运行所有测试

步骤5:清理代码

步骤6:重复这些步骤

问题1:在TDD中,我们主要编写单元测试。集成测试和系统测试在上述步骤中适用于哪些方面?

考虑以下示例:

假设我们有一个必须开发的特性。然后根据TDD,我们将在短迭代中开发此功能。假设我们将此功能划分为两个模块–模块1和模块2。我正在为您编写迭代步骤 按照上述步骤在TDD中开发这些模块(问题2)请纠正我在以下步骤中的错误

**迭代1:**

步骤1:我们为模块1编写单元测试

步骤2:为模块1运行此单元测试(此测试将失败)

步骤3:为模块1开发代码

步骤4:再次运行模块1的单元测试(此测试将通过)

**迭代2:**

步骤1:为模块2编写单元测试

步骤2:运行模块2的单元测试

步骤3:为模块2编写代码

步骤4:运行模块1的单元测试和模块2的单元测试。(问题3:在这一步中,当模块2处于测试中时,我们为什么要运行模块1的单元测试?如果您说这样做是因为要测试模块2是否破坏模块1的功能,那么我的问题是,我们只测试模块2。它还没有与模块1集成,那么它将如何破坏模块1?

**迭代3:**

步骤1:创建集成测试(我在这里吗?

步骤2:运行集成测试(它们将失败,因为模块1和模块2尚未集成)

步骤3:集成模块1和模块2

步骤4:运行所有测试(模块1、模块2的单元测试和集成测试)

(问题4:为什么在这一步中我们要运行模块1和模块2的单元测试?

迭代4(集成所有模块时):

步骤1:创建系统测试

步骤2:运行系统测试(它们将失败)


第三步:(问题5:)我应该在这里写什么代码至于系统测试,我们不写任何代码,根据TDD原则,首先我们写测试,然后我们写开发代码,所以我们在这里写什么代码?

测试驱动开发倾向于关注单元,因此关注单元测试。一种附属方法,行为驱动开发,或BDD,驱动程序在更高的层次上进行设计,从而在更高的层次上进行测试;验收测试和集成测试可能在BDD中发挥作用。TDD并不排除集成测试,但它们不是实践的一部分。实践就是,正如您所说,一次编写一个关于一点点功能的微小测试,使该测试通过,清理您的代码e、 迭代。这就是所有的单元测试


如果第一个功能正常工作,那么将第二个功能与之集成应该可以很好地工作——至少在理论上是这样。TDD为您提供了这两个工作功能,但您当然需要集成它们,当然还需要测试来验证集成是否有效。但这不是TDD实践的一部分。什么TDD说明的是,当集成测试失败时,这是某个较小的功能单元失败的结果,并且您没有充分测试该功能单元。与其尝试修复它,不如编写演示失败的单元测试。使该测试通过,您的集成测试现在也将通过。同样的道理对于系统测试。

测试驱动开发倾向于关注单元,因此关注单元测试。一种附属的方法,即行为驱动开发,或BDD,驱动更高级别的设计,从而驱动更高级别的测试;验收测试和集成测试可能在BDD中发挥作用。TDD不排除集成测试,但y不是实践的一部分。实践是,正如你所说的,一次编写一个关于一点点功能的小测试,通过测试,清理代码,然后迭代。这就是所有的单元测试


如果第一个功能正常工作,那么将第二个功能与之集成应该可以很好地工作——至少在理论上是这样。TDD为您提供了这两个工作功能,但您当然需要集成它们,当然还需要测试来验证集成是否有效。但这不是TDD实践的一部分。什么TDD说明的是,当集成测试失败时,这是某个较小的功能单元失败的结果,并且您没有充分测试该功能单元。与其尝试修复它,不如编写演示失败的单元测试。使该测试通过,您的集成测试现在也将通过。同样的道理对于系统测试。

在我看来,您的工作流程稍微有点倒退。在这本优秀的书中,建议您从更高级别的测试开始,通常是一个“集成测试”,它代表您想要添加的功能,并使其成为您想要看到的行为的驱动因素

当集成测试通过时,您就知道您已经完成了该特性

一旦测试失败(作者称之为外部循环)然后开始内部循环上的TDD过程,即为实现所需功能所需的类创建测试。通过创建测试,编写代码使其通过。然后运行所有测试。外部测试可能仍会失败。然后执行另一个单元测试,然后执行所需的实现。重复此过程直到您创建了外部测试通过所需的所有类

然后再次重复这个过程,写一个新的o