OK,所以@Ignore
注解有利于标志着一个测试用例不应该运行。
但是,有时我想根据运行时信息忽略测试。 一个例子是,如果我有一个需要有一定的内核数量的机器上运行并发测试。 如果这个测试中单处理器的机器上运行,我不认为这是正确的,只是通过测试(因为它尚未运行),它肯定不会是正确的测试失败,打破构建。
所以,我希望能够忽略在运行测试,这似乎是一个正确的结果(因为测试框架将允许编译通过,但记录的测试无法运行)。 我相当肯定的是,注释不会给我这样的灵活性,并怀疑我需要手动创建测试套件有关的类。 然而,该文件没有提到这事,并通过寻找API它也不清楚如何做到这一点编程方式(即我怎么编程方式创建的实例Test
或类似等同于通过创建@Ignore
注释?)。
如果有人做了,在过去类似的东西,或者有我还能怎样去这一个好主意,我会很高兴听到这个消息。
JUnit的方法是在运行时要做到这一点org.junit.Assume
。
@Before
public void beforeMethod() {
org.junit.Assume.assumeTrue(someCondition());
// rest of setup.
}
你可以做一个@Before
方法或在测试本身,而不是在@After
方法。 如果您在测试本身去做,你的@Before
方法将得到运行。 你也可以做到这一点内@BeforeClass
防止类的初始化。
假设故障会导致测试被忽略。
编辑:要与比较@RunIf
从JUnit的-EXT注释,其样本代码是这样的:
@Test
public void calculateTotalSalary() {
assumeThat(Database.connect(), is(notNull()));
//test code below.
}
更何况,这是很容易捕捉到并使用从连接Database.connect()
方法,这种方法。
你应该检出Junit-ext
项目。 他们有RunIf
执行条件测试,如注释:
@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
//your code there
}
class DatabaseIsConnected implements Checker {
public boolean satisify() {
return Database.connect() != null;
}
}
[从他们的教程取代码示例]
在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 */
}
}
快速注: Assume.assumeTrue(condition)
忽略的步骤,但其余通过测试。 测试失败,使用org.junit.Assert.fail()
的条件语句中。 作品同样喜欢Assume.assumeTrue()
但未能通过测试。