Maven结构中的验收测试?

Acceptance test within maven structure?

我的问题是关于基于 docker 的验收测试的目录位置。

我的项目是一个 Spring 基于引导的命令行应用程序,它从 table 中提取数据并构建电子表格。它有单元测试和基于 JUnit 的验收测试。验收测试的 JUnit 运行器是标准的 JUnit 运行器,而不是基于 Spring 的运行器。

最后,我有一个验收测试结构,它针对专门为每个测试创建的专用 DB2 实例测试 Docker 组件。此时,有一个 docker-compose 文件:

docker-compose 结束后,将对生成的电子表格和预期文件进行比较。如果它们是逐字节等效的,则认为测试已通过。

鉴于上面的验收测试 docker 负载很重,并且从 Java 端删除了几个步骤,将此测试放在 /src/test/acceptance 下是否仍然合适?

您可以参考 https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html 最好有单独的目录进行测试。我建议将所有测试都置于测试之下并有单独的文件夹,test/acceptance/docker-test 或其他东西,但总的来说这取决于你。 单独的文件夹确实有助于 运行 和分离不同的测试。

有很多方法可以解决这个问题。一般来说maven有两个插件:surefire和failsafe。它们在配置方面非常相似,但是 surefire 主要针对 运行ning 单元测试,failsafe 用于集成测试。

所以,首先您可能想使用故障安全插件配置验收测试。您将:

  • 运行 他们在不同的构建阶段(至少在单元测试之后 运行)
  • 如果您的构建被破坏并且一些单元测试没有成功,您甚至不想 运行 acceptance/failsafe 测试 - 它可能会节省一些构建时间。
  • 您将获得不同的集成和单元测试报告(从技术上讲,这些插件会创建不同的报告文件夹 surefire-reportsfailsafe-reports

现在要物理分离测试,您可以:

  • 仅仅依靠命名约定。这些插件寻找不同命名的测试,比如:SampleTest.class 将是 运行 with surefire 而 SampleTestIT.class 将是 运行 with the filesafe plugin。当然,它在 pom 文件中的插件配置级别都是可定制的。 通常单元测试需要在概念上与真正的 class 放在同一个包中。例如:如果你在 com.myorg.Foo.java 中有一个 class Foo,那么你将它放在 src/main/java/com/myorg/Foo.java 中,它对应的单元测试将在 src/main/java/com/myorg/FooTest.java 中。对于集成测试通常不是这种情况,所以您可以简单地创建一个文件夹 it 或其他东西,然后自动将它们与不同的插件一起使用 运行,同样因为您将以不同的方式命名测试。

另一种方法是在同一个模块中将文件夹分开,上面已经介绍过了。所以从技术上讲,你维护 src/test/javasrc/test/resources,在它旁边你会有类似 src/it/javasrc/it/resources 的东西。可能您仍会像我上面描述的那样同时使用 surefire 和 failsafe 插件。您仍将 运行 在同一个 Maven 生命周期中进行两种类型的测试。

最“激进”的方法是将验收测试分离到不同的maven模块。这将使您能够 运行 模块在不同的构建步骤中分别进行验收测试。例如,这在 CI 工具中可能很方便。当然,您可以使用属性或 Maven 配置文件实现类似的效果。