【问题标题】:Spring Integration Test Naming ConventionsSpring 集成测试命名约定
【发布时间】:2020-11-19 11:08:38
【问题描述】:

我有一个用于创建和获取员工的休息控制器。为了测试这些端点,我有两个类。在其中,我模拟了服务层并进行状态代码检查,例如:

Mockito.when(employeeService.createEmployee(any(Employee.class))).then(returnsFirstArg());
this.employeeClient.createEmployee(this.testEmployee)
    .andExpect(status().isCreated());

另一方面,我启动了一个 docker postgres 数据库并且不模拟任何东西。这些测试涉及多个端点,例如“如果我创建一个员工,然后获取所有员工,则应该返回创建的员工”。

这两个类都创建了一个应用上下文——第一个使用WebMvcTest注解,第二个使用SpringBootTest。出于这个原因,我将它们都视为集成测试。

那么我怎么称呼这些测试呢?我目前正在使用 EmployeeControllerTestEmployeeContorllerIT(使用故障安全插件运行 IT),但第一个名称有点误导,因为它不是真正的单元测试。

我曾考虑使用EmployeControllerMockedIT 作为第一个,但不相信这是正确的方法。

【问题讨论】:

  • 我不确定是否有任何命名约定,因为除了 *Test 之外的任何内容都需要某种设置才能在您的构建中运行测试。但是为什么在这里需要两个单独的测试呢?难道你不能有一个可以做所有事情的测试吗,从模拟的 http 调用到业务逻辑和数据库验证?将现有的 SpringBootTest 更改为使用 MockMVC 应该不难。
  • 分开,因为在非模拟测试类中,为每个测试准备了一个新的 postgres docker db。不希望对所有模拟服务层的测试产生这种开销。
  • 是的,我可以将 SpringBootTest 类更改为使用 MockMvc。但是那个类正在做我想要一个真正的数据库的东西,即验证所有代码是否按预期与数据库一起工作。

标签: java spring spring-boot


【解决方案1】:

如果您在模拟响应,我会说它是一个单元测试,因为您正在测试与网络和第三方系统(如数据库)隔离的代码模块。

如果您针对您无法控制的(真实)第 3 方代码/系统运行测试,则它是一个集成(或功能)测试。

功能测试将调用您的服务,就好像您的系统是一个我们不知道内部细节的黑盒(相对于我们知道并且可以访问更改的白盒,内部和调用代码好像我们正在调用方法而不是发送 HTTP 请求)。

功能测试可以针对真/假服务器运行,但通常会有一个正在运行的应用程序等待请求。这里的重点是响应不是“模拟”的,请求是真实的,从您的代码到第三方代码/系统,并且该系统应该像真实服务器一样响应。

我们不会在功能测试中伪造响应,但可能会从真/假服务器提供任意响应来模拟我们期望接收的数据。可能是我们编写了一个虚假的 HTTP 服务来“模拟”一个真实的 API。它将通过网络提供完全相同类型的响应,并通过网络调用。或者我们可以启动一个 dockerised 数据库并向它发送查询并接收它的响应。数据库将是一个真正的数据库服务器,而不是我们在代码中预先指定的模拟响应。

(网络服务的)功能测试将从您的应用程序外部开始,并确保通过网络层响应请求。即,您将发出一个 HTTP 请求来调用该服务。

Web 服务的集成测试将在应用程序级别(而不是通过网络层)调用服务,因此您可以直接调用 Controller 类或调用一些应该从内部连接/集成数据库的代码应用程序。集成测试将测试您的代码是否与第三方代码/库/数据库正确集成。您的测试应提醒您注意任何情况,如果第 3 方代码(您无法控制的代码/系统)发生更改,从而导致您的软件崩溃。

【讨论】:

  • 谢谢,这是有道理的。我想这有点令人困惑,因为对于这两种情况,我都在访问同一个 REST 端点并得到响应。只是一方面我在模拟服务层 + 数据库,另一方面我正在启动一个真正的数据库以再次运行测试。所以,是的,在这个网络环境中,基于模拟的单元测试与集成测试的区别确实有意义,我将其保留为 EmployeeControllerTestEmployeeControllerIT
猜你喜欢
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多