2014-11-27 1 views
1

Я хочу, чтобы только часть подмножества моих тестовых методов выполнялась в производственной среде. Я комментирую такие методы тестирования с помощью аннотации @ProdAllowed. Я также написал небольшой пользовательский JUnit бегун, который переопределяет метод runChild так он работает только для @ProdAllowed методов в то время как на «PROD» окружающая среда:Отметить тест как проигнорированный в соответствии с условием

public class ProdAwareRunner extends BlockJUnit4ClassRunner { 

    public ProdAwareRunner(Class<?> klass) throws InitializationError { 
     super(klass); 
    } 

    @Override 
    protected void runChild(FrameworkMethod method, RunNotifier notifier) { 
     ProdAllowed annotation = method.getAnnotation(ProdAllowed.class); 

     String env = CreditCheckSuite.getEnv().trim(); 
     if (annotation != null || "DEV".equalsIgnoreCase(env) || "UAT".equalsIgnoreCase(env)) { 
      super.runChild(method, notifier); 
     } else { 
      notifier.fireTestIgnored(null); // this probably needs to be changed 
     } 
    } 
} 

Это работает довольно хорошо, но я хочу немного больше - чтобы это пропущенной методы испытаний должны быть отмечены в Eclipse, поскольку игнорируется (сейчас они помечены как не работают, что это не совсем то, что я хочу)

+1

встроенный механизм в JUnit [использует категории] (http://www.hascode.com/2012/ 12/приработки категоризированы-тесты-с использованием JUnit-Maven-и-аннотированный-тест-люкс /). – cheffe

ответ

2

Вы можете жет rule путем расширения TestWatcher

public class DoNotRunOnProd extends TestWatcher { 
    protected void starting(Description description) { { 
    ProdAllowed annotation = description.getAnnotation(ProdAllowed.class); 
    String env = CreditCheckSuite.getEnv().trim(); 
    if ((annotation == null) && !"DEV".equalsIgnoreCase(env) && !"UAT".equalsIgnoreCase(env)) { 
     throw new AssumptionViolatedException("Must not run on production.") 
    } 
    } 
} 

и добавить его к тесту

public class Test { 
    @Rule 
    public final TestRule doNotRunOnProd = new DoNotRunOnProd(); 

    ... 
} 
+0

Кажется, что в наши дни правила заменяют бегунов, нет необходимости писать пользовательский бегун здесь. +1 –

+0

Мой главный вопрос в последнем предложении исходного сообщения - я бы хотел, чтобы не были аннотированные тесты, отмеченные как игнорируемые в то время как на PROD. Благодаря вашему подходу Eclipse отмечает не прошедшие аннотированные тесты, что на самом деле не то, что я хочу видеть. – kabeen

0

Это уже реализовано (и активно используется) в TestNG Groups:

public class Test1 { 
    @Test(groups = { "dev", "uat" }) 
    public void testMethod1() { 
    } 

    @Test(groups = {"uat", "prod"}) 
    public void testMethod2() { 
    } 

    @Test(groups = { "prod" }) 
    public void testMethod3() { 
    } 
} 
Смежные вопросы