使用maven进行集成测试:在测试之前运行jar并在之后终止

Eug*_*Loy 6 java testing integration-testing maven

我有一个可运行的jar,我希望在集成测试开始(on pre-integration-test)之前在一个新进程中运行,并在集成测试完成(on post-integration-test)后终止它.

我可以使用的一件事是maven-antrun-pluginexec-maven-plugin来启动新进程pre-integration-test但是如何终止呢?

也许有一个更好的解决方案,我想要实现的目标?

PS:我在Windows和Linux上都构建了我的项目,因此可移植性对我很重要.

l8A*_*ain 9

您可以使用BV开源的maven-process-plugin分别在集成前和集成后阶段启动和停止任何过程.自述文件中有一个例子可以完全满足您的需求(启动一个可运行的jar).希望有所帮助.

主要的想法是写一个有两个目标的maven插件 - 开始和停止.开始在预集成阶段运行并运行您想要运行的任何进程.Java的流程构建器可用于启动运行jar等流程.将已启动的流程存储在数据结构(如Map或Stack)中."停止"将停止它已启动的所有进程.由于这是一个普遍的问题,我建议使用上面的插件来轻松启动和停止任何进程以进行集成测试.只需添加以下插件:

<plugin>
        <groupId>com.bazaarvoice.maven.plugins</groupId>
        <artifactId>process-exec-maven-plugin</artifactId>
        <version>0.4</version>
        <executions>
            <!--Start process-->
            <execution>
                <id>start-jar</id>
                <phase>pre-integration-test</phase>
                <goals><goal>start</goal></goals>
                <configuration>
                    <workingDir>app</workingDir>
                    <arguments>
                        <argument>java</argument>
                        <argument>-jar</argument>
                        <argument>app.jar</argument>
                    </arguments>
                </configuration>
            </execution>
            <!--Stop Process-->
            <execution>
                <id>stop-jar-process</id>
                <phase>post-integration-test</phase>
                <goals><goal>stop-all</goal></goals>
            </execution>
        </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)


Aar*_*lla 0

如果这只是 Linux,我会将 PID 写入一个文件,然后稍后使用该 PID 终止进程。

我的猜测是,您可以在 Windows 上实现类似的目标,但您需要一些非标准工具。

另一种方法是在新进程中打开一个套接字并侦听该套接字上的终止命令。这适用于所有平台,但您需要修改 JAR。

注意:如果您需要并行运行多个集成测试,这也会导致问题。