3

基于 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
}

这可能吗?

4

3 回答 3

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
}
于 2012-07-25T19:27:26.893 回答
3

实际上,我认为这种情况下最好的解决方案是编写自己的org.junit.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"),请参阅上面示例源的注释。您的配置对象可以定义测试是否应该运行,因此您可以对测试进行分组,这在您有很多需要分组的测试时非常有用。

于 2012-07-25T19:51:00.953 回答
0

看着类似的问题,我发现了另一个解决方案:Conditionally ignoring tests in JUnit 4

它介绍了 org.junit.Assume 和(Junit-ext 的另一个解决方案)@RunIf 注释的使用。

我希望该链接可以缩短任何在这里查看的人的搜索时间:)

于 2017-07-13T10:30:51.103 回答