根据Config参数启用/禁用junit测试的最佳方法是什么?假设我有一个Config类,它指示使一组给定测试无效的软件状态。
我可以将测试的主体放在测试方法中的if语句中,例如:
@Test
public void someTest() {
if(Config.shouldIRunTheTests()) {
//do the actual test
}
}
这看起来很糟糕,因为当我真的想要跳过这些测试时,我实际上得到了这些案例的测试通过。 想要像:
@Test[Config.shouldIRunTheTests()]
public void someTest() {
//do the actual test
}
这可能吗?
答案 0 :(得分:3)
实际上,看起来我发现谷歌的这个: http://old.nabble.com/How-to-enable-disable-JUnit-tests-programatically---td23732375.html
编辑:
这对我有用:
@Test
public void someTest() {
org.junit.Assume.assumeTrue(Config.shouldIRunTheTests());
//do the actual test
}
答案 1 :(得分:3)
实际上我认为这个案例的最佳解决方案是编写自己的org.junit.Runner
。它看起来并不那么复杂。一个简单的样本是:
The Runner:
package foo.bar.test;
import org.junit.runner.Description;
import org.junit.runner.Runner;
import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.JUnit4;
import org.junit.runners.model.InitializationError;
public class MyRunner extends Runner {
private final Runner runner;
public MyRunner(final Class<?> klass) throws InitializationError {
super();
this.runner = new JUnit4(klass);
}
@Override
public Description getDescription() {
return runner.getDescription();
}
@Override
public void run(final RunNotifier notifier) {
for (Description description : runner.getDescription().getChildren()) {
notifier.fireTestStarted(description);
try {
// here it is possible to get annotation:
// description.getAnnotation(annotationType)
if (MyConfiguration.shallExecute(description.getClassName(), description.getMethodName())) {
runner.run(notifier);
}
} catch (Exception e) {
notifier.fireTestFailure(new Failure(description, e));
}
}
}
}
测试用例:
package foo.bar.test;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(MyRunner.class)
public class TestCase {
@Test
public void myTest() {
System.out.println("executed");
}
}
配置类:
package foo.bar.test;
public class MyConfiguration {
public static boolean shallExecute(final String className, final String methodName) {
// your configuration logic
System.out.println(className + "." + methodName);
return false;
}
}
这很酷的是你可以实现自己的注释,例如:@TestKey("testWithDataBase")
,请参阅上面示例源的注释。并且您的配置对象可以定义测试是否应该运行,因此您可以对测试进行分组,当您需要对大量测试进行分组时,这些测试非常有用。
答案 2 :(得分:0)
考虑到类似的问题,我发现了另一个解决方案:Conditionally ignoring tests in JUnit 4
介绍了org.junit.Assume和(Junit-ext的另一个解决方案)@RunIf注释的使用。
我希望这个链接可以缩短搜索到这里的任何人的搜索:)