Повторно запустить не полностью тестовый скрипт с использованием 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, это очень хороший вопрос. Я пытался найти какое-то решение, но мне не удалось найти чистое решение для этой задачи. Я могу только предложить сделать обходной путь, который в конечном итоге сработает. Итак, чтобы перезапустить пакет, вам нужно выполнить следующие шаги:

  1. Вам нужно создать @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.

Если после успешной повторной попытки вам понадобится "зеленая сборка", вам нужно написать кучу другого мрачного кода.

  1. Вам нужно создать @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);

В ретриере вы можете передать количество попыток повтора.

Я надеюсь, что кто-то может предложить лучшее решение!

Более гибким решением является написание собственного бегуна. Я описал этот ответ в следующем посте:

Как перезапустить неудачные тесты JUnit немедленно?

Используя Eclipse, в представлении Junit у вас есть кнопка "Перезапустить тесты - сначала ошибки"

Вы также можете увидеть этот ответ: Как немедленно повторно запустить неудачные тесты JUnit?

Другие вопросы по тегам