Maven结构中的验收测试?
Acceptance test within maven structure?
我的问题是关于基于 docker 的验收测试的目录位置。
我的项目是一个 Spring 基于引导的命令行应用程序,它从 table 中提取数据并构建电子表格。它有单元测试和基于 JUnit 的验收测试。验收测试的 JUnit 运行器是标准的 JUnit 运行器,而不是基于 Spring 的运行器。
最后,我有一个验收测试结构,它针对专门为每个测试创建的专用 DB2 实例测试 Docker 组件。此时,有一个 docker-compose 文件:
- 专门为此测试启动一个 DB2 容器实例。
- 启动 Flyway 迁移容器以加载测试数据。
- 启动执行上述操作的容器Spring引导命令行应用程序。
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-reports
和 failsafe-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/java
和 src/test/resources
,在它旁边你会有类似 src/it/java
和 src/it/resources
的东西。可能您仍会像我上面描述的那样同时使用 surefire 和 failsafe 插件。您仍将 运行 在同一个 Maven 生命周期中进行两种类型的测试。
最“激进”的方法是将验收测试分离到不同的maven模块。这将使您能够 运行 模块在不同的构建步骤中分别进行验收测试。例如,这在 CI 工具中可能很方便。当然,您可以使用属性或 Maven 配置文件实现类似的效果。
我的问题是关于基于 docker 的验收测试的目录位置。
我的项目是一个 Spring 基于引导的命令行应用程序,它从 table 中提取数据并构建电子表格。它有单元测试和基于 JUnit 的验收测试。验收测试的 JUnit 运行器是标准的 JUnit 运行器,而不是基于 Spring 的运行器。
最后,我有一个验收测试结构,它针对专门为每个测试创建的专用 DB2 实例测试 Docker 组件。此时,有一个 docker-compose 文件:
- 专门为此测试启动一个 DB2 容器实例。
- 启动 Flyway 迁移容器以加载测试数据。
- 启动执行上述操作的容器Spring引导命令行应用程序。
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-reports
和failsafe-reports
)
现在要物理分离测试,您可以:
- 仅仅依靠命名约定。这些插件寻找不同命名的测试,比如:
SampleTest.class
将是 运行 with surefire 而SampleTestIT.class
将是 运行 with the filesafe plugin。当然,它在 pom 文件中的插件配置级别都是可定制的。 通常单元测试需要在概念上与真正的 class 放在同一个包中。例如:如果你在com.myorg.Foo.java
中有一个 classFoo
,那么你将它放在src/main/java/com/myorg/Foo.java
中,它对应的单元测试将在src/main/java/com/myorg/FooTest.java
中。对于集成测试通常不是这种情况,所以您可以简单地创建一个文件夹it
或其他东西,然后自动将它们与不同的插件一起使用 运行,同样因为您将以不同的方式命名测试。
另一种方法是在同一个模块中将文件夹分开,上面已经介绍过了。所以从技术上讲,你维护 src/test/java
和 src/test/resources
,在它旁边你会有类似 src/it/java
和 src/it/resources
的东西。可能您仍会像我上面描述的那样同时使用 surefire 和 failsafe 插件。您仍将 运行 在同一个 Maven 生命周期中进行两种类型的测试。
最“激进”的方法是将验收测试分离到不同的maven模块。这将使您能够 运行 模块在不同的构建步骤中分别进行验收测试。例如,这在 CI 工具中可能很方便。当然,您可以使用属性或 Maven 配置文件实现类似的效果。