Java 集成测试到底是什么?与单元测试相比

Java 集成测试到底是什么?与单元测试相比,java,php,unit-testing,testing,integration-testing,Java,Php,Unit Testing,Testing,Integration Testing,我开始在我的项目中使用单元测试,并且正在编写在方法/功能级别进行测试的测试 我理解这一点,这是有道理的 但是,什么是集成测试?从我所读到的内容来看,它将测试范围向上移动,以测试应用程序的更大功能 这意味着我要编写一个新的测试套件来测试更大的东西,比如(在电子商务站点上)结帐功能、用户登录功能、购物篮功能。所以这里我要写3个集成测试 这是正确的吗?如果不是,有人能解释一下这是什么意思吗 此外,集成测试是否涉及ui(此处为web应用程序上下文),是否会使用selenium之类的工具来实现自动化。或者

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

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

但是,什么是集成测试?从我所读到的内容来看,它将测试范围向上移动,以测试应用程序的更大功能

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

这是正确的吗?如果不是,有人能解释一下这是什么意思吗


此外,集成测试是否涉及ui(此处为web应用程序上下文),是否会使用selenium之类的工具来实现自动化。或者,集成测试仍然是在代码级别上进行的,但将不同的类和代码区域捆绑在一起。

考虑这样一种方法
PerformPayment(双倍金额,PaymentService)

单元测试是为
服务
参数创建模拟的测试


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

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

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

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

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

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


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

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

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

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

    • 您的应用程序服务可以启动
    • 您的数据库实体已正确映射
    • 您已经按照预期完成了所有必要的注释
    • 您的
      过滤器
      工作正常
    • 您的API正在接受某种数据
    • 您的主要功能是在基本场景中工作
    • 您的数据库查询正在按预期工作
    • 等等
    这不能通过单元测试来完成,但是作为开发人员,您需要保证所有的事情都正常工作。这是集成测试的目标

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

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

    关于集成测试意味着什么的困惑 有些人将“集成测试”理解为一种测试,涉及到与当前系统使用的其他外部系统的“集成”。此类测试只能在所有系统都已启动并运行的环境中进行。没有虚假,没有嘲弄

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

    你可以阅读马丁·福勒关于这一困惑的更多内容。他将“集成测试”一词分为两种含义:“广义”和“狭义”集成测试:

    窄集成测试

    • 在我的服务中,只练习与用户对话的那部分代码 单独服务
    • 使用这些服务的测试加倍,或者 进程或远程
    • 因此,由许多范围狭窄的测试组成,通常没有 范围大于单元测试(通常与相同的测试一起运行