集成与单元测试
您应该将单元测试和集成测试完全分开。您的单元测试应该只测试一件事和一件事,并且完全隔离系统的其余部分。单位的定义很松散,但通常可以归结为方法或功能。
对每个单元进行测试很有意义,这样您就可以知道它们的算法正确实现,并且如果实现存在缺陷,您可以立即知道哪里出了问题。
由于您在单元测试时进行了完全隔离的测试,因此您可以使用存根和模拟对象来像其他应用程序一样工作。这就是进行集成测试的地方。单独测试所有单元非常棒,但是您确实需要知道这些单元是否在实际协同工作。
这意味着知道模型是否实际存储在数据库中,或者在算法X失败后是否真正发出警告。
测试驱动开发
退后一步,看看测试驱动开发(TDD),需要考虑几件事。
- 在实际编写可以通过的代码之前,请先编写单元测试。
- 您使测试通过,编写足够的代码来完成此任务。
- 现在测试通过了,该退后一步了。使用此新功能是否可以重构?您可以安全地执行此操作,因为所有内容都已通过测试。
集成优先vs集成最后
集成测试通过以下两种方式之一适合此TDD周期。我认识一些喜欢事先写信的人。他们将集成测试称为端到端测试,并将端到端测试定义为完全测试用例整个路径的测试(例如,设置应用程序,引导应用程序,进入控制器,执行它,检查结果,输出等...)。然后,他们开始进行第一个单元测试,使其通过,再添加第二个,使其通过,等等。慢慢地,越来越多的集成测试部分也通过,直到功能完成。
另一种样式是通过单元测试构建功能单元测试,然后添加认为必要的集成测试。两者之间的最大区别在于,在进行集成测试时,首先必须考虑应用程序的设计。这种不同意TDD与应用程序设计以及测试有关的前提。
实用性
在我的工作中,我们将所有测试都放在同一个项目中。但是有不同的组。持续集成工具首先运行标记为单元测试的工具。只有那些成功了,执行集成测试的速度也会变慢(因为它们发出了真实的请求,使用了真实的数据库等)。
顺便说一句,我们通常对一个类使用一个测试文件。
建议阅读
- 在测试的指导下不断发展的面向对象软件本书是集成测试优先方法的一个非常好的例子
- 单元测试的技巧,dot.net中的示例单元测试的技巧,dot.net中的示例:D非常好的书,介绍了单元测试的原理。
- 罗伯特·马丁(TDC)上的罗伯特·C·马丁(Robert C. Martin)(免费文章):还要阅读他所链接的前两篇文章。