java - 在 Windows 批处理文件中从 Maven 运行并行 Cucumber 测试时出现问题

标签 java maven batch-file cucumber maven-surefire-plugin

我在 Maven 项目中有一套 Cucumber Selenium 测试,并且最近配置了 Surefire 插件来并行运行我的测试。只需执行与此类似的命令即可正常工作,其中 test.runner.directory 是在 pom.xml 中声明的属性,用于保存我的 Cucumber 测试运行程序的文件路径值:

mvn -Dtest.runner.directory=mytestsrunnerdirectory clean test

接下来,我想编写一个 Windows 批处理文件来包装此调用。这是我对 .bat 文件的尝试,其中测试运行程序的文件路径作为参数传入:

set testrunnerdirectory=%1
echo Running Seleium tests with Maven.
call mvn -Dtest.runner.directory=%testrunnerdirectory% clean test
echo Maven build completed

执行时,这会成功并行运行我的测试,但随后脚本就会挂起。我看到窗口中出现的测试的所有输出,并且观察到所有测试均成功运行和完成,但我从未收到“构建成功”消息,并且脚本从未打印出我的最终回显消息。最终测试完成后,它会无限期地挂起。

有趣的是,如果我将 test.runner.directory 设置为仅包含单个测试运行程序的目录,则一切正常(显然这仅启动单个测试线程)并且脚本完成它的全部。但似乎启动多个线程会以某种方式抛出它,并且在某些时候焦点无法返回到原始命令窗口。

一如既往,我将非常感谢任何想法/建议。谢谢。

最佳答案

我通过使用 pom.xml 中的插件解决了这个问题:cucumber-jvm-parallel-plugin

最初,我尝试配置 Surefire 来运行我自己编写的测试运行程序,如下面的代码片段所示:-

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.20.1</version>
            <configuration>
                <forkCount>5</forkCount>
                <reuseForks>false</reuseForks>
                <testFailureIgnore>true</testFailureIgnore>
                <includes>
                    <include>*TestRunner.java</include>
                </includes>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.apache.maven.surefire</groupId>
                    <artifactId>surefire-junit47</artifactId>
                    <version>2.20.1</version>
                </dependency>
            </dependencies>
        </plugin>

根据我最初的问题,这使我的测试运行正常,但导致我的批处理脚本挂起并且永远无法完成。使用 cucumber-jvm-parallel-plugin 的新方法如下面的代码片段所示:

        <plugin>
            <groupId>com.github.temyers</groupId>
            <artifactId>cucumber-jvm-parallel-plugin</artifactId>
            <version>1.0.1</version>
            <executions>
                <execution>
                    <id>generateRunners</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>generateRunners</goal>
                    </goals>
                    <configuration>
                        <glue>mystepdefinitionspackage</glue>
                        <featuresDirectory>myfeatures</featuresDirectory>
                        <cucumberOutputDir>myoutput</cucumberOutputDir>
                        <format>json,html</format>
                        <tags>"@MyTag"</tags>
                    </configuration>
                </execution>
            </executions>
        </plugin>

这个插件动态生成测试运行程序,surefire 只需要配置即可获取这些生成的测试运行程序:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.20.1</version>
            <configuration>
                <forkCount>10</forkCount>
                <reuseForks>true</reuseForks>
                <includes>
                    <include>**/Parallel*IT.class</include>
                </includes>
            </configuration>
        </plugin>

这非常有效。我的测试并行运行,并且脚本正常完成而不会挂起。感谢您对我的问题感兴趣。

关于java - 在 Windows 批处理文件中从 Maven 运行并行 Cucumber 测试时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46709329/

相关文章:

java - 使用AOP后注入(inject)的bean变为null

java - Spring 中 session 过期的监听器

maven - 我如何解释依赖路径?

maven - 将 Artifact 部署到没有文件扩展名的Maven存储库

java - 将带有生成的 webapp 文件夹的 Maven 项目部署到 Apache Tomcat

java - 如何每隔 2 小时自动启动 Tanuki Software Wrapper

python - 批处理文件: Run command for every file of certain extension

java - 如何在RabbitMq上进行 "topic-like"消费?

windows - 用于从文件名中删除特殊字符的批处理文件脚本 (Windows)

java - 应该使用什么数据结构来表示街道网络?