JUnitCore停止

时间:2012-02-16 13:22:27

标签: java unit-testing testing junit junit4

我想停止/销毁一个以

开头的正在运行的JUnitCore
JUnitCore.run(Request.aClass(ClassToRun));

与RunNotifier上的pleaseStop()类似。

有什么想法吗?

http://junit.sourceforge.net/javadoc/org/junit/runner/package-summary.html

4 个答案:

答案 0 :(得分:7)

选项1: 最好的选择是编写自己的Runner实现,继承自org.junit.runners.BlockJUnit4ClassRunner并在执行上下文中声明它,例如作为原始Java命令行的Main Class。

获得JUnit源代码的启发(它非常小),主要是org.junit.runners.ParentRunner并自行覆盖runChildren方法,以便在触发停止命令时有机会退出执行循环

Runner的工厂为Request。首先,你调用

   (new JUnitCore()).run(Request.runner(new MyStoppableRunner().aClass(ClassToRun))

选项2: 如果在您的上下文中无法使用您自己的运行器(例如在Eclipse中启动),由于在已使用的运行程序中注册了RunListener实现,您可以获得对运行测试用例的线程的引用。

如果触发了停止命令,您的听众可能会抛出RuntimeException甚至是Error,希望它会使原始测试运行器崩溃。

<强>加成

这两个选项是基本的,因为目的是检查停止条件,不要继续循环方法或测试类。

如果处于睡眠或等待状态,您可能想要尝试中断测试线程。为此,应创建看门狗线程,以便在不活动超时后调用测试线程上的interrupt

答案 1 :(得分:2)

据我所知,目前还没有这样的方法。 所以第一个答案应该是:不可能...... 但是使用Java字节码增强框架,没有什么是不可能的...... 所以我可以建议你编写一个Java Interface Closeable或类似的东西...使用你选择的Java字节码增强框架(asm,bcel,javaassist或任何其他)并增强JunitCore类来实现这个接口。一旦完成你将能够为您的测试停止这个外观...

public interface Closeable{
   public void stopMe();
}

嗨,字节码增强当然不是银弹......但是分叉和修补一个开源项目需要对你的项目管理进行大的改动......谁会记得5年后的这个小补丁以及之后的3个版本?添加一个小类来增强字节码以满足您的需求是一个务实但但始终不是一个完美的答案....我很好Yves,尝试将该功能添加到JUnit将是最好的解决方案,但它需要远远超过技术知识......当然,在使用这种技术时你可能会遇到类加载奇怪的问题....对于集成测试,我建议使用TestNG而不是JUnit,它提供了许多增强功能,同时提供兼容性层....

HTH 杰罗姆

答案 2 :(得分:0)

我想提供另一个简单的解决方案来停止JUnitCore:

JUnitCore jUnitCore = new JUnitCore();
Field field = JUnitCore.class.getDeclaredField("fNotifier");
field.setAccessible(true);
RunNotifier runNotifier = (RunNotifier) field.get(jUnitCore);
runNotifier.pleaseStop();

对Matthew Farwell的信任,他将我的想法转化为代码。

答案 3 :(得分:0)

我需要停止所有运行进程/线程,因为我正在使用Docker映像中的java -jar test.jar从主要方法中执行测试套件。测试完成后,我无法提取正确的退出代码。我去了:

final JUnitCore engine = new JUnitCore();
engine.addListener(new TextListener(System.out));
final Result testsResult = engine.run(AllTestSuite.class);
 if (testsResult.wasSuccessful()) {
   System.out.println("Tests complete with success!!!");
   System.exit(0);
 }
   System.out.println("Tests complete with "+ result.getFailureCount() + " failures!!!");
   System.exit(1);