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

m3t*_*man 5 java testing junit

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

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

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

Aar*_*lla 13

使用JUnit 4时,这实际上非常简单Assume.Assume是一个帮手类Assert.不同之处在于,Assert将使测试失败而Assume将跳过它.

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

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

Assume.assumeTrue( Boolean.getBoolean("skipSlowTests") )
Run Code Online (Sandbox Code Playgroud)

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

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


dog*_*ane 8

不,如果测试已经在运行,则不能跳过测试.

我建议你做的是Categories将慢速测试与其他测试分开.

例如:

public interface SlowTests {
}

public class MyTest {

     @Test
     public void test1{
     }

     @Category(SlowTests.class)
     @Test
     public void test1001{
         // this is a slow test
     }
}
Run Code Online (Sandbox Code Playgroud)

为快速测试创建一个测试套件.

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

}
Run Code Online (Sandbox Code Playgroud)

现在执行FastTestSuiteif,如果你不想运行慢速测试(例如test1001).MyTest如果要运行所有测试,请执行正常操作.


Mat*_*ell 4

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

基本上,JUnit 执行所有 @Before 方法(包括 @Rules),然后执行 @Test 方法,然后执行 @After 方法(同样包括 @Rules)。即使假设 JUnit 有一种停止执行其代码位的机制(事实上并没有),大部分时间还是花在了代码上。因此,要“跳过”已经开始的测试,需要您修改测试代码(以及可能正在测试的代码),以便可以干净地停止它。干净地停止正在执行的线程本身就是一个问题[*]。

那么你有什么选择呢?

  1. 并行运行测试,这样您就不必等待测试完成那么长时间。这可能有效,但并行测试可能需要大量工作。

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

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

那里有并行的 JUnit 运行程序,我认为您不会从 IDE 开发人员那里得到太多帮助(至少在短期内)。另外,看看 TestNG,它允许并行运行。

对于使用类别,我使用的一种解决方案是使用 Maven Surefire 或类似工具单独运行长时间运行的测试,而不是通过 IDE。这涉及到在我的机器上的其他地方检查源代码并在那里进行构建。

[*]:Java,如何停止线程关于停止线程