unit-testing - 支持集成测试而不是单元测试是错误的吗?

标签 unit-testing mocking integration-testing

我们正在运行一个项目,在开发开始很久之后我们就开始采用测试驱动设计。

我们有单元测试和集成测试。集成测试在真实数据库上运行,在测试运行之前以已知状态初始化。

当我们编写测试时,我们开始注意到,即使对于可以以“标准方式”进行测试的类,在隔离和使用模拟对象的情况下,它实际上变得更快、更干净(阅读:更短且更容易理解的代码) 只使用真实的对象/服务直接与数据库对话,而不是用复杂的模拟对象设置使测试类困惑。

这种做法有什么问题吗?

最佳答案

一点问题都没有。相反,根据我的经验,我认为支持单元测试是错误的。您的团队对测试“变得更快、更干净”的看法与我多年前和从那时起的看法相同。

我什至会建议您完全放弃单元测试,并继续投资于集成测试。我这样说是因为有人开发了一个带有非常复杂的模拟 API 的测试库,多年来一直怀疑孤立的单元测试,然后最终得出集成测试的结论(在编写了两种类型的许多测试之后) 如此好多了。

不过,有一个更正:单元测试“隔离并使用模拟对象”不是“标准方式”。您可能知道,Kent Beck 是 "father" of TDD和 JUnit 的发明者。但是你猜怎么着,Kent 在他的 TDD 单元测试中根本没有使用模拟。严格来说,发明 TDD 的人编写的“单元”测试更接近于集成 测试,因为它们没有努力将被测单元与其依赖项隔离开来。 (这是对单元测试的常见误解。有关准确定义,请参阅 Martin Fowler 的 this article。)

关于unit-testing - 支持集成测试而不是单元测试是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11629265/

相关文章:

ruby-on-rails - Rspec 模拟:ActiveRecord::AssociationTypeMismatch

c# - 如何为 asp.net web api 编写集成测试

spring - Spring 3.2 中发布的新 Spring MVC 测试框架是否测试 web.xml 配置?

junit - Jacoco Sling Junit 集成 - 测试执行

c# - 具有单元测试功能的 Signalr hub

javascript - 让 Jasmine 等待异步函数完成

c++ - 如何实现一个支持模板协变的泛型工厂?

java - 如何使用 Mockito 和 JUnit 检查方法中的 if 语句?

mocking - 如何模拟 Kotlin 单例对象?

javascript - Node.js - 如何使用 promise 测试 HTTPS 请求