Как сделать повторную попытку JUnit Test в SuiteClass, если она не удалась? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть следующий класс RetryRule:

public class RetryRule implements TestRule {
    private int retryCount;

    public RetryRule(int retryCount) {
        this.retryCount = retryCount;
    }

    public Statement apply(Statement base, Description description) {
        return statement(base, description);
    }

    private Statement statement(final Statement base, final Description description) {
        return new Statement() {
            @Override
            public void evaluate() throws Throwable {
                Throwable caughtThrowable = null;

                for (int i = 0; i < retryCount; i++) {
                    try {
                        base.evaluate();
                        return;
                    }
                    catch (Throwable t) {
                        caughtThrowable = t;
                        System.err.println(description.getDisplayName() + ": run " + (i + 1) + " failed.");
                    }
                }
                System.err.println(description.getDisplayName() + ": giving up after " + retryCount + " failures.");
                if (caughtThrowable != null) {
                    throw caughtThrowable;
                }
            }
        };
    }
}

И следующий SuiteClass:

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
MakeBookingTest.class,
PaymentTest.class
})

public class TestSuite {
}

У него есть два класса тестирования .. MakeBookingTest и PaymentTest .Каждый из них имеет несколько тестов JUnit.

Я хочу, чтобы их повторили в случае неудачи.Есть идеи, как мне этого добиться?

РЕДАКТИРОВАТЬ: Для лучшего понимания вы можете использовать мой код, чтобы привести пример, что добавить.Благодарю.Цените это.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Во-первых, я согласен с GhostCat.
Испытательный код Flakey является реальной проблемой.

Но если " flakeyness " отсутствует в вашем коде (например, плохое сетевое соединение с внешним веб-сервисом), то может быть полезно повторно запустить тесты.

В этом случае вы можете сделать следующее.

Сначала создайте аннотацию интерфейса.(Это будет использоваться для указания того, какие тесты требуют повторной попытки.)

@Retention(RetentionPolicy.RUNTIME)
public @interface Retry {}

Затем TestRule, который будет применен к нашему тесту.(Это правило будет проверять неудачу, если присутствует аннотация Retry)

public class RetryRule implements TestRule {
    @Override
    public Statement apply(Statement base, Description method) {
        return new Statement() {
            @Override 
            public void evaluate() throws Throwable {
                try {
                    base.evaluate();
                } catch (Throwable t) {
                    Retry retry = method.getAnnotation(Retry.class);
                    if (retry != null) {
                        base.evaluate();
                    } else {
                        throw t;
                    }
                }
            }
        };
    }
}

Наконец, в нашем тесте мы собрали все вместе

public class RetryTest {
    private static int count = 0;

    @Rule
    public RetryRule rule = new RetryRule();

    @Test
    @Retry
    public void testToRetry() throws Exception {
        callMyFlakeyCode();
    }
}
0 голосов
/ 26 февраля 2019

Отдельный отказ от ответа, основанный на данном комментарии:

Иногда это терпит неудачу, потому что они могут быть ненадежными.Но 99% времени, если я перезапущу ... это работает.

В таких случаях тратить свое время и силы на то, чтобы убедить вашу настройку теста выполнить «повторные прогоны» ... скорее всего: плохие инвестиции.

Ваша проблемане делать повторных попыток.Ваша реальная проблема в том, что у вас плохие тесты.Вы вкладываете все свое время и силы в понимание причины , почему ваши тесты не надежны, а затем вы исправляете эту проблему.

Все остальное усложняет ваши настройки без веской причины.Вы пишете специальный код, который нуждается в обслуживании, и что еще хуже: все будущие читатели должны понимать: «Да, эти тесты есть, мы просто повторяем их, пока они не пройдут».Это послание, с которым рано или поздно люди пойдут.

...