2016-02-16 5 views
4

Мне бы хотелось, чтобы простой способ присвоить значение приоритета моим тестам JUnit, чтобы я мог сказать «запустить только тесты с приоритетом 1», «выполнить приоритет 1, 2 и 3 теста» и т. Д. Я знаю, что могу просто включить строка, такая как Assume.assumeTrue("Test skipped for priority " + priority, priority <= 2); в начале каждого теста (где 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; 
} 

В то время как это, кажется, работает (правильные тесты показаны как пропускаются в 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-condition-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

У меня есть другие 'start()', 'failed() 'и' finished() 'в моем подклассе' TestWatcher', просто ли они воссоздаются в «TestRule» или стоит создать отдельный «TestRule» для моего метода «Assume» в дополнение к моему существующему «TestWatcher» 'подкласс? – Dave

+1

Посмотрите на источник TestWatcher: это просто простая делегирующая реализация TestRule. Вы можете легко переназначить свой TestWatcher из TestRule: https://github.com/junit-team/junit/blob/master/src/main/java/org/junit/rules/TestWatcher.java –

Смежные вопросы