我是否应该通过单元测试来覆盖代码,即使它已经被集成测试覆盖了?

Should I cover the code by unit tests even it already has been covered by integration tests?

假设我们有一些使用 REST API 的 Web 服务,为了说明,有一些使用数据库的工作。在我看来,测试此应用程序的最基本方法是集成测试,它从 REST API 的顶部对其进行测试,以验证它是否在整体上正常工作。但是使用一些模拟技术的单元测试呢?在专业开发中(当然人力资源有限)真的有必要用单元测试覆盖代码,即使它已经被集成测试覆盖了吗?

谢谢

好问题。当然,答案将基于意见,但希望它们基于真实世界的经验。

就我而言,这些年来我编写了数千个 JUnit/TestNG 测试,并且我碰巧为 Java 开发了一个高级测试库(模拟 + 代码覆盖率 + 集成测试)。

所以,IMO,当你已经有了一个好的集成测试套件时,编写单元测试是没有必要的,而且效率不高。

当然,集成测试确实需要更长的时间才能 运行,但它们应该仍然足够快,开发人员不会气馁 运行 对它们进行测试。这才是重要的:如果开发人员在开发新代码或修改时仍然可以 高效地 运行 一次测试,一次测试 class 等,那就没问题了。因此,避免集成测试方法(例如,Selenium)也会执行测试 slow/painful.

另一个针对集成测试的批评是,它们使找出测试失败的根本原因变得更加困难。不过,这在实践中并不是一个足够大的问题。

Martin Fowler 在他的 Unit Test 文章中提出了同样的两点。