java - 如何根据条件自动跳过某些 JUnit 测试?

标签 java junit junit-rule

我想要一种简单的方法来为我的 JUnit 测试分配优先级值,这样我就可以说“只运行优先级 1 测试”、“运行优先级 1、2 和 3 测试”等。我知道我可以包括类似 Assume.assumeTrue("Test skipped for priority " + priority, priority <= 2); 的行在每个测试开始时(其中 priority 是我要运行的最高值优先级测试,2 是此特定测试的优先级值),但是在每个测试开始时复制粘贴一行不会似乎是一个很好的解决方案。

我已经尝试使用一个简单的注释编写一个解决方案,该注释无论如何都会被我正在使用的 JUnit 规则检测到:

public class Tests {
    @Rule
    public TestRules rules = new TestRules();
    @Test
    @Priority(2)
    public void test1() {
        // perform test
    }
}

public class TestRules extends TestWatcher {
    private int priority = 1; // this value is manually changed to set the priority of tests to run
    @Override
    protected void starting(Description desc) {
        Priority testCasePriority = desc.getAnnotation(Priority.class);
        Assume.assumeTrue("Test skipped for priotity " + priority, testCasePriority == null || testCasePriority.value() <= priority);
    }
}

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Priority {
    public int value() default 0;
}

虽然这似乎有效(正确的测试在 Eclipse JUnit View 中显示为已跳过),但测试仍在执行,即 test1() 中的任何代码仍在运行。

有谁知道我怎样才能得到 Assume在我的规则中实际跳过测试?

最佳答案

TestWatcher.starting 抛出的异常将被忽略,并在测试结束时重新抛出。

您应该实现 TestRule 而不是 TestWatcher :

public class TestRules implements TestRule {
    private int priority = 1; // this value is manually changed to set the priority of tests to run

     public Statement apply(final Statement base, final Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                Priority testCasePriority = desc.getAnnotation(Priority.class);
                Assume.assumeTrue("Test skipped for priotity " + priority, testCasePriority == null || testCasePriority.value() <= priority);

                base.evaluate();
            }
        };
    }
}

关于java - 如何根据条件自动跳过某些 JUnit 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35430765/

相关文章:

java - Java 集成测试中的 void 方法

java - 为什么 JUnit 中的 @Rule 注释字段必须是公开的?

java - 如何在 JUnit 4.12 中组合 @Rule 和 @ClassRule

java - 如何使用 QuerydslPredicate 按子对象属性进行过滤?

java - 在 TreeSet 和 TreeMap 中使用 hashCode() 和 equals()

java - 不能在 Intent 上附加额外的内容

java - JUnit 如何测试构造函数?

junit - 我可以使用哪种断言方法来检查数组中的元素是否唯一?

java - 仅在 Windows 上运行单元测试

java - 如何映射已在 ORACLE 中创建但在 Hibernate 实体中创建的 "CREATE UNIQUE INDEX"