Повторно запустить не полностью тестовый скрипт с использованием JUnit
Я нашел какое-то решение для повторного запуска неудачного @Test на этом форуме в разделе Как перезапустить неудачные тесты JUnit немедленно?, В моем случае я выполняю тест из командной строки. И я хочу повторить полный тест, если он не пройден. Ниже приведен мой шаблон тестового скрипта, и я хочу перезапустить все (от начала до конца), если он потерпит неудачу
@BeforeClass
public static void Start(){
...
}
@Test
public void Test_One(){
...
}
@Test
public void Test_Two(){
...
}
@AfterClass
public static void End(){
...
}
Я узнаю в методе End(), если мой тестовый скрипт потерпел неудачу. Если это не удается, я хотел бы запустить все как
@BeforeClass
@Test (all @Test)
@AfterClass
Возможно ли это с помощью JUnit? Я не уверен, что шаблон, который я использую, является правильным:(
3 ответа
JanakiL, это очень хороший вопрос. Я пытался найти какое-то решение, но мне не удалось найти чистое решение для этой задачи. Я могу только предложить сделать обходной путь, который в конечном итоге сработает. Итак, чтобы перезапустить пакет, вам нужно выполнить следующие шаги:
Вам нужно создать @ClassRule, чтобы выполнить весь набор. All Suite вы можете повторить, используя следующий код:
Открытый класс Retrier реализует TestRule {
private int retryCount; private int failedAttempt = 0; @Override public Statement apply(final Statement base, final Description description) { return new Statement() { @Override public void evaluate() throws Throwable { base.evaluate(); while (retryNeeded()){ log.error( description.getDisplayName() + " failed"); failedAttempt++; } }
}
retryNeeded () - метод, который определяет, нужно ли вам повторить попытку или нет
Это повторит все тесты в вашем наборе. Очень важно, что повтор будет идти после метода @AfterClass.
Если после успешной повторной попытки вам понадобится "зеленая сборка", вам нужно написать кучу другого мрачного кода.
- Вам нужно создать @Rule, который не позволит "опубликовать" неудачный результат. Как пример:
public class FailedRule extends TestWatcher {
@Override public Statement apply(final Statement base, final Description description) { return new Statement() { @Override public void evaluate() throws Throwable { List<Throwable> errors = new ArrayList<Throwable>(); try { base.evaluate(); } catch (AssumptionViolatedException e) { log.error("", e.getMessage()); if (isLastRun()) { throw e; } } catch (Throwable t) { log.error("", t.getMessage()); if (isLastRun()) { throw t; } } }; }; } }
isLastRun () - методы, чтобы проверить, является ли это последний запуск, и провалить тест только в том случае, если ir последний запуск.
Только последняя попытка должна быть опубликована, чтобы пометить, что тест не пройден, и построить "красный" 3. И, наконец, в вашем тестовом классе вам нужно зарегистрировать два правила:
@Rule public FailedRule ruleExample = new FailedRule (); @ClassRule public static Retrier retrier = new Retrier (3);
В ретриере вы можете передать количество попыток повтора.
Я надеюсь, что кто-то может предложить лучшее решение!
Более гибким решением является написание собственного бегуна. Я описал этот ответ в следующем посте:
Используя Eclipse, в представлении Junit у вас есть кнопка "Перезапустить тесты - сначала ошибки"
Вы также можете увидеть этот ответ: Как немедленно повторно запустить неудачные тесты JUnit?