究竟什么是集成测试 - 与单元相比

时间:2013-05-23 18:36:26

标签: java php unit-testing testing integration-testing

我开始在我的项目中使用单元测试,并且正在编写在方法/功能级别进行测试的测试。

我理解这一点,这是有道理的。

但是,什么是集成测试?根据我的阅读,它将测试范围扩展到测试应用程序的更大功能。

这意味着我编写了一个新的测试套件来测试更大的东西,例如(在电子商务网站上)结账功能,用户登录功能,购物篮功能。那么在这里我会编写3个集成测试吗?

这是否正确 - 如果没有,有人可以解释其含义。

此外,集成测试是否涉及ui(此处的Web应用程序上下文),并将使用selenium等自动化。或者仍然是在代码级别进行集成测试,但是将差异类和代码区域捆绑在一起。

5 个答案:

答案 0 :(得分:32)

考虑像这样的方法PerformPayment(double amount, PaymentService service);

单元测试将是您为service参数创建模拟的测试。

集成测试将是您使用实际外部服务的测试,以便您测试该服务是否正确响应您的输入数据。

答案 1 :(得分:3)

单元测试是测试代码在实际类中的测试。此类的另一个依赖项被模拟或忽略,因为重点是测试代码类中。

集成测试是涉及来自目标应用程序的磁盘访问,应用程序服务和/或框架的测试。集成测试从其他外部服务运行隔离

我举一个例子。您有一个Spring应用程序,并且您进行了大量的单元测试以确保业务逻辑正常运行。完善。但是你需要保证什么样的测试:

  • 您的应用服务可以开始
  • 您的数据库实体已正确映射
  • 您有所有必要的注释按预期工作
  • 您的过滤器工作正常
  • 您的API正在接受某种数据
  • 您的主要功能真正在基本情景中工作
  • 您的数据库查询按预期工作
  • 等等...

单元测试无法做到这一点,但作为开发人员,您需要保证所有事情都能正常运行。这是集成测试的目标。

理想情况是独立于应用程序在生产环境中使用的其他外部系统运行的集成测试。您可以使用Wiremock for Rest调用,像H2这样的内存数据库,从一些调用外部系统的特定类中模拟bean等来实现这一点。

有点好奇,Maven有一个特定的集成测试插件:maven failsafe plugin,执行名称以 IT 结尾的测试类。示例:UserIT.java

关于集成测试意味着什么的混淆

有些人将“集成测试”理解为涉及与当前系统使用的其他外部系统“集成”的测试。这种测试只能在您所有系统启动并运行的环境中进行。没有什么是假的,没有任何嘲笑。

这可能只是一个命名问题,但我们缺乏测试(我理解为集成测试),它们考虑了上述项目的必要性。相反,我们正在寻求单元测试(仅测试类)的定义到集成测试(整个真实系统)。如果没有集成测试,它的中间是什么?

您可以阅读Martin Fowler关于此混淆的更多信息on this article。他将“整合测试”一词分为两个含义:“宽泛”和“狭隘”的整合测试:

  

窄集成测试

     
      
  • 只运用我的服务中代码的那部分代码   单独的服务
  •   
  • 使用这些服务的测试双打   过程或远程
  •   
  • 因此包括许多狭窄的测试,通常没有   范围大于单元测试(通常使用相同的测试运行)   用于单元测试的框架)
  •   
     

广泛的集成测试

     
      
  • 需要所有服务的实时版本,需要进行大量测试   环境和网络访问
  •   
  • 通过所有人练习代码路径   服务,而不仅仅是负责交互的代码
  •   

答案 2 :(得分:1)

单元测试是在一个类或一段代码中测试业务逻辑的地方。例如,如果您正在测试方法的特定部分应该调用存储库,则单元测试将检查以确保调用存储库的接口的方法被调用的次数与您期望的相同,否则会失败测试。

另一方面,集成测试是测试实际服务或存储库(数据库)行为是否正确。它会根据您传入的数据检查您是否检索了预期结果。这与您的单元测试相关联,这样您就可以知道应该检索哪些数据以及它对该数据的作用。

答案 3 :(得分:0)

据我所知,硒测试应该在另一个测试套件中。即使您正确地编写它们,这些测试本质上也是最脆弱的测试。在这里,您可以通过示例框架使用Specflow或其他类型的规范。也许您可以将这些测试称为验收测试。这些也适用于开发人员和业务专家。 集成或模块测试通常不使用UI。集成测试会运行一些正在协同工作的类。这些是比硒测试更低级别的测试,并且更容易维护。这些测试仅供开发人员使用。

答案 4 :(得分:0)

这是一个好的单元测试满足的一些约束。满足这些约束也需要良好的可测试代码。

  1. 无I / O - 磁盘或网络
  2. 只有一个断言(如果是多个,它们应该是彼此的微小变化)
  3. 不运用(掩盖)比声明的更多的生产代码
  4. 这些约束通常不适用于集成测试。