Java 在测试运行时,我可以跳过JUnit测试吗?
假设我想从IDE(IntellijIDEA或eclipse)手动运行4000个JUnit测试;前1000个测试运行得非常顺利(假设它们总共需要3分钟),但测试1001单独运行就需要30分钟以上。 是否有一种方法可以跳过测试1001(当它仍在运行时),让测试1002(和其他测试)继续进行。我不想@忽略测试1001并重新运行套件,因为我已经有了测试1-1000的答案;此外,我不想选择测试1001-4000,因为它需要太多时间 我会选择某种按钮-跳过当前测试-在测试运行时可以按下该按钮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开发人员或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有停止执行其代码位的机制(它没有),大部分时间都花在代码上。因此,要“跳过”已经开始的测试,需要修改测试代码(可能还有它正在测试的代码),以便可以干净地停止它。干净地停止正在执行的线程本身就是一个问题[*] 那么你有什么选择
[*]:,使用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中,实际上可以在中途停止测试。