Я хочу, чтобы только некоторые подмножества моих тестовых методов выполнялись в рабочей среде. Я комментирую такие методы тестирования с помощью @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 как игнорируемые (сейчас они отмечены как не запущенные, что не совсем то, что я хочу)
Вы можете написать правило, расширив 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();
...
}
Это уже реализовано (и активно используется) в группах TestNG:
public class Test1 {
@Test(groups = { "dev", "uat" })
public void testMethod1() {
}
@Test(groups = {"uat", "prod"} )
public void testMethod2() {
}
@Test(groups = { "prod" })
public void testMethod3() {
}
}