Отметить тест как проигнорированный в зависимости от условия

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 как игнорируемые (сейчас они отмечены как не запущенные, что не совсем то, что я хочу)

Теги:
junit
junit4

2 ответа

2
Лучший ответ

Вы можете написать правило, расширив 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 помечает не аннотированные тесты как пройденные, что не совсем то, что я хочу видеть.
0

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

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

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

    @Test(groups = { "prod" })
    public void testMethod3() {
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню