TDD是否包含集成测试?

Jon*_*ott 31 tdd integration-testing unit-testing

我正在研究一些包含数据库访问的代码.测试驱动开发是否包括集成测试以及通常的单元测试?

谢谢!

Ser*_*kiy 37

TDD的黄金法则规定:永远不要在没有测试失败的情况下编写新功能.

如果您不遵循此规则,那么您正在部分执行TDD(例如,仅为应用程序中的多个类编写单元测试).这比没有好(至少你知道这些类做了所需的,但你不能确定应用程序的其他部分是否正常工作,这些类可以与它们集成),但这并不能保证你的应用程序按预期工作.因此,您需要通过编写失败验收测试来启动每个功能,该测试指导您的应用程序设计并定义应用程序行为(外部循环).虽然此测试失败,但您的应用程序未实现该功能.然后你应该为单独的单元编写单元测试,这些单元将涉及这个特性(内部循环).外循环验证功能中涉及的所有类是否按预期一起工作.

以下图片来自伟大的书"面向对象的软件","测试指导"演示了TDD中的这两个反馈循环:

TDD

回答你的问题是 - TDD包括集成测试.这是不打破TDD黄金法则的唯一方法.

  • 如果验收测试部分重复单元测试怎么办?说我有`callApi(routeName)`功能,里面使用`getRouteConfig(routeName)`.如果内部`getRouteConfig`调用完成,我应该测试`callApi`以获得正确的配置吗? (2认同)

gui*_*e31 8

AFAIK,TDD最初没有区分单元测试和集成测试.对于您需要设置的资源而言,集成测试通常要花费更多,这就是为什么即使在早期的TDD文献中,模拟也被认为是一种良好的实践.

从测试驱动开发示例("模拟对象"模式):

解决方案大多数时候都不使用真正的数据库

但是,如果需要,它不应该阻止您编写一些其他测试来验证您的生产代码是否与真实数据库或昂贵的资源相匹配:

如果模拟对象的行为与真实对象不同,该怎么办?您可以通过为Mock对象设置一组测试来减少此策略,该测试也可以在真实对象可用时应用于该对象.

总而言之,我猜整个集成与单元测试的东西是正交的TDD.换句话说:有一个小的红色/绿色/重构反馈循环,因为你的原子构建块不能确定你应该选择哪种整体应用程序开发工作流程或者哪些其他反馈循环应该包围它 - 它可能被接受为@lazyberezovsky解释,从内到外或从内到外,以集成为中心或以隔离为中心等,只要您对测试优先方法保持真实.