Условно игнорирование тестов в JUnit 4
Итак,@Ignore
аннотация хороша для маркировки того, что тестовый случай не должен запускаться.
однако иногда я хочу игнорировать тест, основанный на информации о времени выполнения. Например, если у меня есть тест параллелизма, который нужно запустить на машине с определенным количеством ядер. Если бы этот тест был запущен на однопроцессорной машине, я не думаю, что было бы правильно просто пройти тест (поскольку он не был запущен), и, конечно, было бы неправильно провалить тест и сломать строй.
поэтому я хочу иметь возможность игнорировать тесты во время выполнения, так как это кажется правильным результатом (поскольку тестовая среда позволит пройти сборку, но записать, что тесты не были запущены). Я уверен, что аннотация не даст мне такой гибкости, и подозреваю, что мне нужно будет вручную создать набор тестов для данного класса. Однако в документации ничего об этом не говорится и просматривается API это тоже не понятно, как это будет сделано программно (т. е. как программно создать экземпляр Test
или аналогично, что эквивалентно тому, что создано @Ignore
аннотации?).
Если кто-то сделал что-то подобное в прошлом, или имеет яркую идею о том, как еще я мог бы пойти об этом, я был бы рад услышать об этом.
4 ответов
путь JUnit должен сделать это во время выполнения org.junit.Assume
.
@Before
public void beforeMethod() {
org.junit.Assume.assumeTrue(someCondition());
// rest of setup.
}
вы можете сделать это @Before
метод или в самом тесте, но не в @After
метод. Если вы делаете это в самом тесте, ваш @Before
метод будет работать. Вы также можете сделать это в @BeforeClass
для предотвращения инициализации класса.
ошибка предположения приводит к игнорированию теста.
Edit: для сравнения с @RunIf
аннотация от junit-ext, их пример кода будет выглядеть так:
@Test
public void calculateTotalSalary() {
assumeThat(Database.connect(), is(notNull()));
//test code below.
}
не говоря уже о том, что гораздо проще захватить и использовать соединение из Database.connect()
метод таким образом.
вы должны оформить заказ Junit-ext
. У них есть RunIf
аннотация, которая выполняет условные тесты, например:
@Test
@RunIf(DatabaseIsConnected.class)
public void calculateTotalSalary() {
//your code there
}
class DatabaseIsConnected implements Checker {
public boolean satisify() {
return Database.connect() != null;
}
}
[пример кода, взятый из учебника]
в JUnit 4 другим вариантом для вас может быть создание аннотации, чтобы обозначить, что тест должен соответствовать вашим пользовательским критериям, а затем расширить бегун по умолчанию с вашим собственным и с помощью отражения, основывая свое решение на пользовательских критериях. Это может выглядеть примерно так:
public class CustomRunner extends BlockJUnit4ClassRunner {
public CTRunner(Class<?> klass) throws initializationError {
super(klass);
}
@Override
protected boolean isIgnored(FrameworkMethod child) {
if(shouldIgnore()) {
return true;
}
return super.isIgnored(child);
}
private boolean shouldIgnore(class) {
/* some custom criteria */
}
}
небольшое примечание: Assume.assumeTrue(condition)
игнорирует остальные шаги, но проходит тест.
Чтобы не пройти тест, используйте org.junit.Assert.fail()
внутри условного оператора. Работает так же, как Assume.assumeTrue()
но не проходит тест.