假设我想从我的IDE(Intellij IDEA或eclipse)4000 JUnit测试中手动运行;前1000次测试运行非常顺利(比如他们需要3分钟全部1000次),但测试1001单独使用超过30分钟。 有没有办法可以跳过测试1001(当它仍在运行时)并让测试1002(和其他人)继续前进。我不想@Ignore测试1001并重新运行套件,因为我已经有了测试1-1000的答案;我也不想选择1001-4000测试,因为它需要太多时间。
我会使用某种按钮 - 跳过电流测试 - 可以在测试运行时按下。
如果不存在此类功能,IDE开发人员或JUnit开发人员需要对其进行增强吗?
答案 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有一种机制来停止执行它的代码(它没有),大部分时间都花费在你的代码上。因此,要“跳过”已经启动的测试,您需要修改测试代码(以及可能正在测试的代码),以便您可以彻底停止它。干净地停止执行线程本身就是一个问题[*]。
那你有什么选择?
并行运行测试,然后您不必等待测试完成。这可能有用,但是并行化测试可能需要做很多工作。
停止执行测试,并修复您正在处理的测试。大多数IDE都可以选择终止运行测试的JVM。这绝对是最简单的选择。
实现自己的测试运行器,它在一个单独的线程中运行测试。然后,该测试运行器要么等待线程完成执行,要么在某处检查一个标志,以便它停止。这听起来很复杂,因为您需要管理线程,还要在正在运行的jvm中设置标志。也许在某个地方创建一个文件?这个跑步者将失败当前正在运行的测试,你可以继续下一个。请注意,中途“停止”测试可能会使某些内容处于不一致状态,或者您最终可能会并行处理。
那里有并行的JUnit运行器,我认为你不会得到IDE开发人员的帮助(至少在短期内)。另外,看看TestNG,它允许并行运行东西。
对于使用类别,我使用的一个解决方案是使用maven surefire或类似方法分别运行长时间运行的测试,而不是通过IDE。这包括在我的机器上的其他地方检查源代码并在那里构建。
[*]:Java, how to stop threads,Regarding stopping of a thread
答案 3 :(得分:1)
我认为更常见的解决方案是拥有两个测试套件:一个用于快速测试,另一个用于慢速测试。这通常是划分单元测试(快速)和集成测试(慢速)的方式。
你不太可能对这样的东西进行JUnit或IntelliJ的修改。最好改变你使用它们的方式 - 它会让你更快地得到答案。
答案 4 :(得分:-1)
您可以修改您的最新内容并执行类似
的操作public void theTest(){
if (System.getProperty("skipMyTest") == null){
//execute the test
}
}
如果要跳过测试,则传递环境变量