2016-02-16 72 views
4

我想要一个简单的方法来为我的JUnit测试分配一个优先级值,以便我可以说'只运行优先级1测试','运行优先级1,2和3测试'等。我知道我可以包含在每次测试开始时(例如priority是我想要运行的最高优先级测试,2是此特定测试的优先值),但是在每次测试开始时拷贝粘贴一行不会似乎是非常好的解决方案。如何根据条件自动跳过某些JUnit测试?

我曾尝试使用由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跳过查看)仍然执行测试,即test1()中的任何代码仍在运行。

有没有人有任何想法如何我可以在我的规则Assume实际上跳过测试?

+1

这可能帮助: - http://stackoverflow.com/questions/1689242/conditionally-ignoring-tests-in-junit-4 –

+0

...或者这可能有所帮助:http://www.codeaffine.com/2013/11/18/a-junit-rule-to-conditionally-ignore-tests/ – SiKing

回答

3

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(); 
      } 
     }; 
    } 
} 
+0

我有其他'starting()','failed ()''和'finished()'方法,这些在TestRule中很容易重新创建,还是值得为我的'Assume'方法创建一个单独的'TestRule',除了我现有的'TestWatcher '子类? – Dave

+1

看看TestWatcher的源代码:它只是一个简单的委托TestRule实现。您可以轻松地从TestRule中重新实现您的TestWatcher:https://github.com/junit-team/junit/blob/master/src/main/java/org/junit/rules/TestWatcher.java –