Jer*_*edM 7 java parallel-processing junit multithreading maven
我正在使用Maven在并行类中运行多个JUnit测试.我有清理任务,需要在所有JUnit测试运行后发生.为了处理这个清理工作,我在一些测试中添加了一个关闭钩子.当我没有并行运行时,关闭挂钩正确执行,但是当我并行运行时,我没有看到关闭挂钩的输出(参见示例).有什么我做错了吗?System.exit
在并行执行JUnit测试时,JVM是否退出使用?
根据Surfire文档文档,并行线程在同一进程中执行,因此我希望Runtime.getRuntime是相同的进程,即使它是在不同的测试和线程之间调用的. Maven Surfire插件 - 分叉选项和并行测试执行
使用parallel选项时要记住的重要事项是:并发发生在同一个JVM进程中.这在内存和执行时间方面是有效的,但您可能更容易受到竞争条件或其他意外且难以重现的行为的影响.
这是我单元测试的一个例子:
@Test
public void test()
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
System.out.println("Test clean up triggered");
}
});
}
Run Code Online (Sandbox Code Playgroud)
这是我的pom的相关部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<parallel>classes</parallel>
<threadCount>10</threadCount>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
编辑:
当我在@BeforeClass
方法中添加关闭挂钩时,问题得到解决.当我在@Test
方法中添加它时,我遇到了问题.我希望能够随时添加钩子.
你的 shutdown Hooks 实际上被调用了,我相信问题来自于system.out.println
与 maven 的 shutdown hooks 相关的调用。
直接用Eclipse测试,我有输出:
Test clean up triggered
Run Code Online (Sandbox Code Playgroud)
并尝试稍微不同的测试版本:
@Test
public void test()
{
System.out.println("Testing");
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
try {
Files.createFile(Paths.get("test1"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
assertTrue(true);
}
Run Code Online (Sandbox Code Playgroud)
我可以在我的主管的根目录中看到调用后创建的文件“test1”mvn clean test
测试用: