37

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

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

但是,什么是集成测试?从我读到的内容来看,它将测试范围扩大到测试应用程序的更大功能。

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

这是正确的 - 如果不是,有人可以解释是什么意思。

此外,集成测试是否涉及 ui(此处为 Web 应用程序上下文),并且会使用 selenium 之类的工具来自动化。还是集成测试仍然在代码级别,但将不同的类和代码区域联系在一起。

4

5 回答 5

44

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

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

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

于 2013-05-23T18:42:09.733 回答
10

单元测试是测试代码在实际类中的测试。这个类的另一个依赖被mock或忽略了,因为重点是测试类内部的代码。

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

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

  • 您的应用程序服务可以启动
  • 您的数据库实体已正确映射
  • 您拥有所有必要的注释按预期工作
  • Filter的工作正常
  • 您的 API 正在接受某种数据
  • 您的主要功能确实在基本场景中工作
  • 您的数据库查询按预期工作
  • ETC...

这不能通过单元测试来完成,但作为开发人员,您需要保证所有的东西都正常工作。这是集成测试的目标。

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

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

对集成测试意味着什么的困惑

有些人将“集成测试”理解为涉及“集成”到当前系统使用的其他外部系统的测试。此类测试只能在您已启动并运行所有系统的环境中进行。没有虚假,没有嘲笑。

这可能只是一个命名问题,但我们缺少满足上述项目必要性的测试(我理解为集成测试)。相反,我们正在将单元测试(仅限测试类)定义为“集成”测试(整个真实系统)。如果不是集成测试,那么中间是什么?

您可以在Martin Fowler的这篇文章中阅读更多关于这种混淆的信息。他将“集成测试”一词分为两个含义:“广泛”和“狭义”集成测试:

狭窄的集成测试

  • 只执行我的服务中与单独服务对话的那部分代码
  • 使用这些服务的测试替身,无论是在进程中还是远程
  • 因此由许多范围狭窄的测试组成,通常范围不比单元测试大(并且通常使用与单元测试相同的测试框架运行)

广泛的集成测试

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

您可以获得更多关于这篇文章的详细信息。

于 2018-01-10T12:14:00.427 回答
2

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

另一方面,集成测试是测试实际服务或存储库(数据库)行为是否正确。它正在检查是否根据您传入的数据检索预期结果。这与您的单元测试相关,以便您知道应该检索哪些数据以及它如何处理这些数据。

于 2013-05-24T10:05:15.607 回答
0

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

于 2013-05-23T21:56:40.723 回答
0

以下是一个好的单元测试要满足的几个约束条件。满足这些约束还需要良好的可测试代码。

  1. 无 I/O - 磁盘或网络
  2. 只有一个断言(如果有多个,它们应该是彼此的微小变化)
  3. 不行使(覆盖)比它所断言的更多的生产代码

这些约束通常不适用于集成测试。

于 2013-05-24T09:55:01.827 回答