2012-05-02 299 views
4

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

我会做某种按钮 - 跳过当前测试 - 当测试运行时可以按下这个按钮。

如果这样的功能不存在,它的增强需要由IDE开发人员或JUnit开发人员完成吗?

+0

听起来像这些测试是集成测试,应该由CI解决方案运行,而不是在开发端的IDE上运行。特别是如果单个测试需要那么长时间。深入研究并检查为什么需要这么长时间并减少测试的运行时间。单元测试必须快速。 – khmarbaise

+0

就是这样,但我首先要知道为什么所有失败的测试都失败(或需要太多),然后继续调查。我不明白为什么test1失败(或者花费太多)调查test1,然后看看为什么test2失败并进行调查等。 – m3th0dman

回答

4

你要求的是在中间测试时停止执行你的代码。您无法停止执行当前的测试,因为您的代码中没有挂接以允许它。您最好的解决方案是使用其他人建议的类别。基本上,JUnit执行所有@Before方法(包括@Rules),然后执行@Test方法,然后执行@After方法(再次包括@Rules)。即使假设JUnit有一种停止执行代码位的机制(大多数情况下,大部分时间都在中,您的代码为)。因此,为了“跳过”已经开始的测试,您需要修改测试代码(以及可能测试的代码),以便彻底停止测试。干净地停止正在执行的线程本身就是一个问题[*]。

那么你有什么选择?

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

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

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

有一些平行的JUnit跑步者,我不认为你会从IDE开发者那里得到很多帮助(至少在短期内)。另外,看看TestNG,它允许并行运行。

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

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

-1

您可以通过修改thest并做类似

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

,如果你想跳过测试

+0

为了做到这一点,我必须先停止测试,修改它们然后重新运行它们。我想在运行时停止它。 – m3th0dman

7

没有通过环境变量,你不能跳过测试,如果他们已经在运行。

我建议你做的是用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 { 

} 

现在执行的FastTestSuite,如果你不想跑慢测试(例如test1001)。如果要运行所有测试,则正常执行MyTest

+0

感谢您的回答。我还想知道你对第二个问题的看法:“如果这种功能不存在,那么它的增强需要由IDE开发人员或JUnit开发人员完成?” – m3th0dman

+0

我想这两个团队都必须完成。 JUnit库需要更改测试运行器API以允许跳过测试,并且IDE需要更改以调用此新API。 – dogbane

1

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

对于这样的事情,你很难得到对JUnit或IntelliJ的修改。更好地改变你使用它们的方式 - 它会让你更快地得到答案。

9

这实际上是使用JUnit 4相当简单使用AssumeAssume是一个帮助类,如Assert。不同的是,Assert将使测试失败,而Assume将跳过它。

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

所以你能做的就是定义一个系统属性skipSlowTests并在你平时想跳过慢测试的开头添加

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

。创建一个Eclipse启动配置,该配置将属性定义为true,并且您可以方便地在两者之间切换。

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

相关问题