我应该将单元测试和集成测试分开吗?


17

我必须为一个项目编写单元测试和集成测试。

  • 是否应将所有测试放入单个测试文件夹中
  • 还是应该将单元测试和集成测试分别放在单独的测试文件夹中
  • 还是应该将它们放在单独的项目中

如果将它们放在一起,这种方法是否有优点或缺点?


1
如果您在CI环境中操作,则重要的是,由于集成测试并不总是在构建服务器上运行,因此可以很容易地(通过属性等)识别它们。
罗比·迪

Answers:


18

通常,是的,应该将集成测试和单元测试放入不同的文件夹中。通常,程序员不会在这两种测试之间划清界限,而只是编写任何有用的测试。但是集成测试往往比较慢,因为它们通常涉及:

  • 数据库查询
  • 网络请求
  • 时间依赖性行为
  • 大量数据

相比之下,单元测试将模拟任何昂贵的操作,因此单元测试倾向于快速运行(实际上,运行测试最慢的部分通常是测试框架本身)。

当程序员在系统上工作时,他们处于编辑测试周期。他们获得测试反馈的速度越快,周期越短,他们的生产力就越高。因此,我们只想运行快速完成的重要测试。完整的测试套件只能作为QA流程的一部分执行,例如在CI服务器上。

这意味着应该对大型测试套件进行分类。我们只能为特定组件选择单元测试吗?我们可以排除慢速测试吗?一种简单的方法是在不同目录中维护不同的测试套件。如果您只有很少的测试,则只要程序员可以轻松选择测试的子集,一个目录也可以。

允许程序员快速获得反馈的任何方法都是好的。如果不定期执行,最全面的测试套件无关紧要。

进一步阅读:


分离文件夹时,是否将每个文件夹与生产代码放在同一包中(以便可以测试受保护的方法)?例如,您为单元测试创​​建一个maven模块,为集成测试创建另一个maven模块。这样,您可以将它们分开,并且仍然可以轻松地测试受保护的方法。
ihebiheb

@ihebiheb在Java中,使用包可见性的做法已被广泛反对。在某些情况下,使用它并从单元测试中访问这些API可能会有所帮助。但总的来说,这是不必要的。集成式测试永远不需要访问包私有成员。是否将测试放入单独的Maven项目中取决于您要如何运行和部署它们。在Java / Maven中,我并不是要告诉您这里什么才是明智的。
阿蒙
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.