【问题标题】:Is it possible to run in parallel mode integration tests written in Spock Framework for Spring Boot是否可以在 Spock Framework for Spring Boot 中以并行模式运行集成测试
【发布时间】:2017-05-11 13:37:03
【问题描述】:

基本 Spock 规范是:

@SpringBootTest(classes = ApplicationTestConfig.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource("/application.properties")
abstract class SpringBootTestSpecification extends Specification {

项目由 maven 3.3.9 构建,带有故障安全插件:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <executions>
        <execution>
            <id>integration-tests</id>
            <phase>integration-test</phase>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
            <configuration>
                <skip>false</skip>
                <includes>
                    <include>**/*SpecIT.java</include>
                </includes>
                <argLine>-Dfile.encoding=UTF-8</argLine>
            </configuration>
        </execution>
    </executions>
</plugin>

我想以并行模式运行我的测试,但我想确保不会影响其他人(应用程序使用嵌入式数据库运行并为不同的测试准备不同的数据)。

【问题讨论】:

    标签: spring-boot maven-3 integration-testing spock maven-failsafe-plugin


    【解决方案1】:

    如果每个测试的嵌入式数据库都是相同的(相同的文件/url/名称),即使它可能被截断或重新创建,并行化测试可能无法按预期工作,因为一个测试可能正在运行而另一个可能会尝试重新播种数据。

    如果每个测试以某种方式连接到一个唯一的数据库,我的猜测是测试可以并行化。

    http://maven.apache.org/components/surefire/maven-failsafe-plugin/examples/fork-options-and-parallel-execution.html

    确保将 JUnit4 配置为通过方法、类等将它们并行化。

    如果您感到好奇,几个月前我发表了一篇博文Integration Testing using Spring Boot, Postgres and Docker,其中每个测试都连接到在不同容器中运行的Postgres DB。我不记得涉及并行运行测试,但这是可行的。

    【讨论】:

    • 您可以设计您的测试,使它们不会截断或重新创建数据库。确保他们不对正在执行的唯一测试做出假设是完全可行的:不要依赖固定 ID,而是明确使用测试创建的 ID,不要假设任何关于最后插入的东西,不要'不期望一个表准确地包含一些行等。
    • @ymajoros,如果你不知道数据库的状态,你会反对什么?您说:“不要依赖固定 ID,而是明确使用测试创建的 ID”。这意味着现在选择数据的测试取决于之前插入它的测试。您正在施加测试顺序,与选择相关的测试将失败,不是因为任何选择逻辑,而是因为与插入相关的测试失败。这是一个非常糟糕的设计。
    • 不,其实恰恰相反。选择数据的测试应该创建自己的数据集,而不是依赖任何其他数据集。您实际上不知道数据库的状态,也不应该对此做出任何假设。
    • @ymajoros 现在测试一个选择测试本身变得冗长和复杂,因为你首先需要保存数据,当你有 50 个表和十几个连接时,祝你好运保持测试简单易读。
    • 所以,您的测试现在有了一个设置方法。没什么大不了的。
    猜你喜欢
    • 2018-03-17
    • 2014-08-15
    • 2017-06-28
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2015-06-10
    • 2015-07-23
    相关资源
    最近更新 更多