【问题标题】:Exactly what is integration testing - compared with unit究竟什么是集成测试 - 与单元相比
【发布时间】:2013-05-23 18:36:25
【问题描述】:

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

我明白这一点,这是有道理的。

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 那么这些是在 ui 级别完成的吗?使用 selenium 说,或者是否编写了另一个测试套件,类似于单元测试套件但范围更广?
    • 不一定。考虑使用外部资源的 PaymentService,例如数据库或 3rd 方 API。访问可能需要几秒钟(在糟糕的一天),或者它可能只是一个长时间运行的过程。单元测试太慢了(因此模拟出来),但你仍然想测试它以确保它正确执行。这就是集成测试的用武之地。它们不是您重复运行的测试,通常在执行发布之前或让 CI 运行它们。
    【解决方案2】:

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

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

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

    • 您的应用程序服务可以启动
    • 您的数据库实体映射正确
    • 所有必要的注释都按预期工作
    • 您的Filter 工作正常
    • 您的 API 正在接受某种数据
    • 您的主要特点是真正在基本场景中工作
    • 您的数据库查询按预期工作
    • 等等……

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

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

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

    关于集成测试的含义的困惑

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

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

    您可以阅读 Martin Fowler 撰写的有关这种混淆的更多信息 on this article。他将“集成测试”一词分为两种含义:“广义”和“狭义”集成测试:

    窄集成测试

    • 只执行我的服务中与 单独的服务
    • 使用这些服务的测试替身,无论是在 进程或远程
    • 因此由许多范围狭窄的测试组成,通常没有 范围比单元测试更大(并且通常使用相同的测试运行 用于单元测试的框架)

    广泛的集成测试

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

    您可以在this article 上获得更多详细信息。

    【讨论】:

    • Martin Fowler 的那篇文章不错。他使用术语“系统/端到端测试”和“狭义集成测试”而不是模棱两可的“集成测试”。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-11
          • 1970-01-01
          • 1970-01-01
          • 2018-10-22
          • 1970-01-01
          • 2014-06-27
          相关资源
          最近更新 更多