有条件忽略测试JUnit 4中有条件忽略测试JUnit 4中(Conditionally ignor

2019-05-08 15:53发布

OK,所以@Ignore注解有利于标志着一个测试用例不应该运行。

但是,有时我想根据运行时信息忽略测试。 一个例子是,如果我有一个需要有一定的内核数量的机器上运行并发测试。 如果这个测试中单处理器的机器上运行,我不认为这是正确的,只是通过测试(因为它尚未运行),它肯定不会是正确的测试失败,打破构建。

所以,我希望能够忽略在运行测试,这似乎是一个正确的结果(因为测试框架将允许编译通过,但记录的测试无法运行)。 我相当肯定的是,注释不会给我这样的灵活性,并怀疑我需要手动创建测试套件有关的类。 然而,该文件没有提到这事,并通过寻找API它也不清楚如何做到这一点编程方式(即我怎么编程方式创建的实例Test或类似等同于通过创建@Ignore注释?)。

如果有人做了,在过去类似的东西,或者有我还能怎样去这一个好主意,我会很高兴听到这个消息。

Answer 1:

JUnit的方法是在运行时要做到这一点org.junit.Assume

 @Before
 public void beforeMethod() {
     org.junit.Assume.assumeTrue(someCondition());
     // rest of setup.
 }

你可以做一个@Before方法或在测试本身,而不是在@After方法。 如果您在测试本身去做,你的@Before方法将得到运行。 你也可以做到这一点内@BeforeClass防止类的初始化。

假设故障会导致测试被忽略。

编辑:要与比较@RunIfJUnit的-EXT注释,其样本代码是这样的:

@Test
public void calculateTotalSalary() {
    assumeThat(Database.connect(), is(notNull()));
    //test code below.
}

更何况,这是很容易捕捉到并使用从连接Database.connect()方法,这种方法。



Answer 2:

你应该检出Junit-ext项目。 他们有RunIf执行条件测试,如注释:

@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
    //your code there
}

class DatabaseIsConnected implements Checker {
   public boolean satisify() {
        return Database.connect() != null;
   }
}

[从他们的教程取代码示例]



Answer 3:

在JUnit 4中,为你另一种选择可能是创建一个注释来表示的测试需要,以满足您的自定义标准,然后再扩展用自己和使用反射的默认运行,你的基础上自定义条件决定。 它可能是这个样子:

public class CustomRunner extends BlockJUnit4ClassRunner {
    public CTRunner(Class<?> klass) throws initializationError {
        super(klass);
    }

    @Override
    protected boolean isIgnored(FrameworkMethod child) {
        if(shouldIgnore()) {
            return true;
        }
        return super.isIgnored(child);
    }

    private boolean shouldIgnore(class) {
        /* some custom criteria */
    }
}


Answer 4:

快速注: Assume.assumeTrue(condition)忽略的步骤,但其余通过测试。 测试失败,使用org.junit.Assert.fail()的条件语句中。 作品同样喜欢Assume.assumeTrue()但未能通过测试。



文章来源: Conditionally ignoring tests in JUnit 4