Maison >Java >javaDidacticiel >Comment puis-je donner une seconde chance aux tests JUnit ayant échoué ?

Comment puis-je donner une seconde chance aux tests JUnit ayant échoué ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-29 06:35:021016parcourir

How Can I Give Failing JUnit Tests a Second Chance to Pass?

Exécuter des tests JUnit ayant échoué pour une seconde chance

Dans JUnit, il est possible de configurer les tests pour avoir une seconde chance de réussir lorsqu'ils échouent initialement. Cela peut être particulièrement utile pour les tests qui peuvent échouer par intermittence en raison de facteurs externes, tels que des problèmes de réseau ou des réponses lentes du serveur. Voici deux méthodes pour y parvenir :

Utiliser une TestRule

Une TestRule vous permet de définir une logique personnalisée à exécuter avant et après chaque méthode de test. Pour créer une TestRule pour réessayer les tests ayant échoué :

<code class="java">public class RetryTestRule implements TestRule {

    private int retryCount;

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

    @Override
    public Statement apply(Statement base, 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;
                    }
                }
                throw caughtThrowable;
            }
        };
    }
}

Dans votre classe de test, appliquez la règle aux tests souhaités :

<code class="java">@Rule
public RetryTestRule retry = new RetryTestRule(3);

Utilisation d'un TestRunner personnalisé

Vous pouvez également définir un TestRunner personnalisé qui remplace la méthode runChild() pour contrôler la manière dont chaque méthode de test est exécutée :

<code class="java">public class RetryTestRunner extends BlockJUnit4ClassRunner {
    private int retryCount;

    public RetryTestRunner(Class<?> testClass) {
        super(testClass);
        Annotation annotation = AnnotationUtils.getAnnotation(testClass, Retry.class);
        if (annotation != null) {
            retryCount = ((Retry) annotation).value();
        }
    }

    @Override
    protected void runChild(FrameworkMethod method, RunNotifier notifier) {
        for (int i = 0; i < retryCount; i++) {
            try {
                super.runChild(method, notifier);
                return;
            } catch (Throwable t) {
                if (i == retryCount - 1) {
                    throw t;
                }                
            }
        }
    }
}</code>

Dans votre classe de test, utilisez le TestRunner personnalisé avec @RunWith :

<code class="java">@RunWith(RetryTestRunner.class)
@Retry(3)
public class MyTestClass {}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn