我可以在测试运行时跳过JUnit测试吗?

时间:2012-05-02 08:15:44

标签: java testing junit

假设我想从我的IDE(Intellij IDEA或eclipse)4000 JUnit测试中手动运行;前1000次测试运行非常顺利(比如他们需要3分钟全部1000次),但测试1001单独使用超过30分钟。 有没有办法可以跳过测试1001(当它仍在运行时)并让测试1002(和其他人)继续前进。我不想@Ignore测试1001并重新运行套件,因为我已经有了测试1-1000的答案;我也不想选择1001-4000测试,因为它需要太多时间。

我会使用某种按钮 - 跳过电流测试 - 可以在测试运行时按下。

如果不存在此类功能,IDE开发人员或JUnit开发人员需要对其进行增强吗?

5 个答案:

答案 0 :(得分:12)

使用Assume的JUnit 4实际上非常简单。 Assume是一个辅助类,如Assert。不同之处在于Assert会使测试失败而Assume会跳过它。

对于仅适用于Windows文件系统的测试,常见用例为Assume.assumeTrue( isWindows() )

所以你可以做的是定义系统属性skipSlowTests并添加

Assume.assumeTrue( Boolean.getBoolean("skipSlowTests") )

在您通常想跳过的慢速测试开始时。创建一个Eclipse启动配置,将属性定义为true,您可以方便地在两者之间切换。

如果要运行慢速测试,请在Eclipse(或整个类)中选择方法,然后从上下文菜单中使用“Run as JUnit Test”。由于该属性默认为false,因此将运行测试。

答案 1 :(得分:8)

不,如果测试已经在运行,则无法跳过测试。

我建议您使用Categories将慢速测试与其他测试分开。

例如:

public interface SlowTests {
}

public class MyTest {

     @Test
     public void test1{
     }

     @Category(SlowTests.class)
     @Test
     public void test1001{
         // this is a slow test
     }
}

为快速测试创建测试套件。

@RunWith(Categories.class)
@ExcludeCategory(SlowTests.class)
@SuiteClasses(MyTest.class)
public class FastTestSuite {

}

如果您不想运行慢速测试(例如test1001),请执行FastTestSuite。如果要运行所有测试,请正常执行MyTest

答案 2 :(得分:4)

您要求的是在测试中期停止执行代码。如果没有在您的代码中挂钩以允许它,您就无法停止执行当前测试。您最好的解决方案是使用其他人建议的类别。

基本上,JUnit执行所有@Before方法(包括@Rules),然后执行@Test方法,然后执行@After方法(再次包括@Rules)。即使假设JUnit有一种机制来停止执行它的代码(它没有),大部分时间都花费在你的代码上。因此,要“跳过”已经启动的测试,您需要修改测试代码(以及可能正在测试的代码),以便您可以彻底停止它。干净地停止执行线程本身就是一个问题[*]。

那你有什么选择?

  1. 并行运行测试,然后您不必等待测试完成。这可能有用,但是并行化测试可能需要做很多工作。

  2. 停止执行测试,并修复您正在处理的测试。大多数IDE都可以选择终止运行测试的JVM。这绝对是最简单的选择。

  3. 实现自己的测试运行器,它在一个单独的线程中运行测试。然后,该测试运行器要么等待线程完成执行,要么在某处检查一个标志,以便它停止。这听起来很复杂,因为您需要管理线程,还要在正在运行的jvm中设置标志。也许在某个地方创建一个文件?这个跑步者将失败当前正在运行的测试,你可以继续下一个。请注意,中途“停止”测试可能会使某些内容处于不一致状态,或者您最终可能会并行处理。

  4. 那里有并行的JUnit运行器,我认为你不会得到IDE开发人员的帮助(至少在短期内)。另外,看看TestNG,它允许并行运行东西。

    对于使用类别,我使用的一个解决方案是使用maven surefire或类似方法分别运行长时间运行的测试,而不是通过IDE。这包括在我的机器上的其他地方检查源代码并在那里构建。

    [*]:Java, how to stop threadsRegarding stopping of a thread

答案 3 :(得分:1)

我认为更常见的解决方案是拥有两个测试套件:一个用于快速测试,另一个用于慢速测试。这通常是划分单元测试(快速)和集成测试(慢速)的方式。

你不太可能对这样的东西进行JUnit或IntelliJ的修改。最好改变你使用它们的方式 - 它会让你更快地得到答案。

答案 4 :(得分:-1)

您可以修改您的最新内容并执行类似

的操作
public void theTest(){
    if (System.getProperty("skipMyTest") == null){
         //execute the test
    }
}

如果要跳过测试,则传递环境变量