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

Java 在测试运行时,我可以跳过JUnit测试吗?,java,testing,junit,Java,Testing,Junit,假设我想从IDE(IntellijIDEA或eclipse)手动运行4000个JUnit测试;前1000个测试运行得非常顺利(假设它们总共需要3分钟),但测试1001单独运行就需要30分钟以上。 是否有一种方法可以跳过测试1001(当它仍在运行时),让测试1002(和其他测试)继续进行。我不想@忽略测试1001并重新运行套件,因为我已经有了测试1-1000的答案;此外,我不想选择测试1001-4000,因为它需要太多时间 我会选择某种按钮-跳过当前测试-在测试运行时可以按下该按钮 如果这样的功能

假设我想从IDE(IntellijIDEA或eclipse)手动运行4000个JUnit测试;前1000个测试运行得非常顺利(假设它们总共需要3分钟),但测试1001单独运行就需要30分钟以上。 是否有一种方法可以跳过测试1001(当它仍在运行时),让测试1002(和其他测试)继续进行。我不想@忽略测试1001并重新运行套件,因为我已经有了测试1-1000的答案;此外,我不想选择测试1001-4000,因为它需要太多时间

我会选择某种按钮-跳过当前测试-在测试运行时可以按下该按钮


如果这样的功能不存在,则需要由IDE开发人员或JUnit开发人员对其进行增强?

您可以修改您的thest并执行以下操作

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

如果要跳过测试,请传递环境变量。否,如果测试已经在运行,则不能跳过测试

我建议你做的是把你的慢测试和其他测试分开

例如:

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

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


对于类似这样的东西,您很难对JUnit或IntelliJ进行修改。最好改变你使用它们的方式——这会让你更快地找到答案。

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

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

那么你有什么选择

  • 并行运行测试,那么您不必等待测试完成的时间那么长。这可能是可行的,但是并行化测试可能需要很多工作

  • 停止执行测试,并修复您正在处理的测试。大多数IDE都有一个选项可以杀死运行测试的JVM。这绝对是最简单的选择

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

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

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


    [*]:,

    使用JUnit4使用
    假设
    实际上非常简单<代码>假设
    是类似于
    断言
    的助手类。区别在于,
    Assert
    将使测试失败,而
    asure
    将跳过它

    对于只在(比如)Windows文件系统上工作的测试,常见的用例是
    aspect.assumeTrue(isWindows())

    因此,您可以定义一个系统属性
    skipSlowTests
    并添加

    Assume.assumeTrue( Boolean.getBoolean("skipSlowTests") )
    
    在通常要跳过的慢速测试开始时。创建一个Eclipse启动配置,该配置将属性定义为
    true
    ,您可以方便地在两者之间切换


    如果您想运行一个缓慢的测试,请在Eclipse(或整个类)中选择该方法,并从上下文菜单中使用“RunasJUnitTest”。由于默认情况下属性为
    false
    ,测试将运行。

    听起来这些测试是集成测试,应该由CI解决方案运行,而不是在开发端的IDE上运行。特别是如果单个测试需要那么长的时间。深入研究并检查为什么需要这么长时间,并减少测试的运行时间。单元测试必须快速。这正是它的本质,但我想首先知道为什么所有失败的测试都失败(或花费太多),然后继续调查。我不知道为什么test1失败(或花费太多时间)调查test1,然后看看test2失败的原因,然后调查等等。为了做到这一点,我必须先停止测试,修改它们,然后重新运行它们。我想在运行时停止它。谢谢你的回答。我还想知道您对第二个问题的看法:“如果这样的功能不存在,那么需要由IDE开发人员或JUnit开发人员对其进行增强?”我猜这必须由两个团队完成。JUnit库需要对测试转化器API进行更改,以允许跳过测试,IDE将需要更改以调用此新API。在JunIT5中,实际上可以在中途停止测试。