我是否应该通过单元测试来覆盖代码,即使它已经被集成测试覆盖了?
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 文章中提出了同样的两点。
假设我们有一些使用 REST API 的 Web 服务,为了说明,有一些使用数据库的工作。在我看来,测试此应用程序的最基本方法是集成测试,它从 REST API 的顶部对其进行测试,以验证它是否在整体上正常工作。但是使用一些模拟技术的单元测试呢?在专业开发中(当然人力资源有限)真的有必要用单元测试覆盖代码,即使它已经被集成测试覆盖了吗?
谢谢
好问题。当然,答案将基于意见,但希望它们基于真实世界的经验。
就我而言,这些年来我编写了数千个 JUnit/TestNG 测试,并且我碰巧为 Java 开发了一个高级测试库(模拟 + 代码覆盖率 + 集成测试)。
所以,IMO,当你已经有了一个好的集成测试套件时,编写单元测试是没有必要的,而且效率不高。
当然,集成测试确实需要更长的时间才能 运行,但它们应该仍然足够快,开发人员不会气馁 运行 对它们进行测试。这才是重要的:如果开发人员在开发新代码或修改时仍然可以 高效地 运行 一次测试,一次测试 class 等,那就没问题了。因此,避免集成测试方法(例如,Selenium)也会执行测试 slow/painful.
另一个针对集成测试的批评是,它们使找出测试失败的根本原因变得更加困难。不过,这在实践中并不是一个足够大的问题。
Martin Fowler 在他的 Unit Test 文章中提出了同样的两点。