{"id":2619,"date":"2024-03-18T10:08:36","date_gmt":"2024-03-18T09:08:36","guid":{"rendered":"https:\/\/ittester.sk\/non-classifiee\/reexecution-des-tests-ayant-echoue-dans-testng\/"},"modified":"2024-10-22T14:06:05","modified_gmt":"2024-10-22T12:06:05","slug":"reexecution-des-tests-ayant-echoue-dans-testng","status":"publish","type":"post","link":"https:\/\/ittester.sk\/fr\/tests-automatises\/tutoriel-testng\/reexecution-des-tests-ayant-echoue-dans-testng\/","title":{"rendered":"R\u00e9ex\u00e9cution des tests ayant \u00e9chou\u00e9 dans TestNG"},"content":{"rendered":"\n<p>Dans cet article, nous allons apprendre \u00e0 rejouer les cas de test qui ont \u00e9chou\u00e9 en utilisant TestNG. Nous explorerons deux approches pour y parvenir, \u00e0 savoir l&rsquo;utilisation du fichier testng-failed.xml et l&rsquo;impl\u00e9mentation de l&rsquo;IRetryAnalyzer de TestNG.<\/p>\n\n<h2 class=\"wp-block-heading\"><strong>Table des mati\u00e8res<\/strong><\/h2>\n<div class=\"wp-block-aioseo-table-of-contents\"><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-opatovne-spustenie-neuspesnych-testov-pomocou-suboru-testng-failed-xml\">Op\u00e4tovn\u00e9 spustenie ne\u00faspe\u0161n\u00fdch testov pomocou s\u00faboru testng-failed.xml<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-kedy-pouzit\">Kedy pou\u017ei\u0165?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-ako-to-dosiahnut\">Ako to dosiahnu\u0165?<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-automaticke-opakovanie-neuspesnych-testov-pomocou-iretryanalyzer\">Automatick\u00e9 opakovanie ne\u00faspe\u0161n\u00fdch testov pomocou IRetryAnalyzer<\/a><ul><li><a class=\"aioseo-toc-item\" href=\"#aioseo-kedy-pouzivat\">Kedy pou\u017e\u00edva\u0165?<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-ako-to-dosiahnut\">Ako to dosiahnu\u0165?<\/a><\/li><\/ul><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-snippet\">Snippet<\/a><\/li><li><a class=\"aioseo-toc-item\" href=\"#aioseo-vystup-testu\">V\u00fdstup testu<\/a><\/li><\/ul><\/div>\n<h2 class=\"wp-block-heading\" id=\"aioseo-opatovne-spustenie-neuspesnych-testov-pomocou-suboru-testng-failed-xml\">Red\u00e9marrez les tests qui ont \u00e9chou\u00e9 en utilisant le fichier testng-failed.xml<\/h2>\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-kedy-pouzit\">Quand l&rsquo;utiliser ?<\/h3>\n\n<p>Parfois, en tant que testeurs de l&rsquo;automatisation des tests, il nous est seulement demand\u00e9 d&rsquo;ex\u00e9cuter les tests d\u00e9faillants signal\u00e9s par l&rsquo;outil d&rsquo;automatisation des tests apr\u00e8s avoir corrig\u00e9 certains bogues. Le fait de n&rsquo;ex\u00e9cuter que les tests qui ont \u00e9chou\u00e9 permet de v\u00e9rifier rapidement les corrections de bogues.<\/p>\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-ako-to-dosiahnut\">Comment y parvenir ?<\/h3>\n\n<p>Il est relativement facile de n&rsquo;ex\u00e9cuter que les tests qui ont \u00e9chou\u00e9, car TestNG fournit un support naturel pour cela. Lorsqu&rsquo;une suite de tests est ex\u00e9cut\u00e9e \u00e0 l&rsquo;aide du fichier testng.xml, le fichier testng-failed.xml est cr\u00e9\u00e9 dans le dossier test-output apr\u00e8s l&rsquo;ex\u00e9cution du test. Plus tard, nous pourrons ex\u00e9cuter ce fichier tout comme le fichier testng.xml. \u00c9tant donn\u00e9 que ce fichier ne stocke que les tests qui ont \u00e9chou\u00e9, l&rsquo;ex\u00e9cution de ce fichier n&rsquo;entra\u00eenera que l&rsquo;ex\u00e9cution des tests qui ont \u00e9chou\u00e9.<\/p>\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-automaticke-opakovanie-neuspesnych-testov-pomocou-iretryanalyzer\">R\u00e9essai automatique des tests ayant \u00e9chou\u00e9 avec IRetryAnalyzer<\/h2>\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-kedy-pouzivat\">Quand l&rsquo;utiliser ?<\/h3>\n\n<p>Parfois, des \u00e9checs qui ne sont pas dus \u00e0 des probl\u00e8mes dans l&rsquo;application apparaissent dans le rapport d&rsquo;ex\u00e9cution du test. La cause premi\u00e8re de ces probl\u00e8mes peut \u00eatre li\u00e9e \u00e0 la configuration de l&rsquo;environnement de test ou \u00e0 un probl\u00e8me occasionnel du serveur. Pour s&rsquo;assurer que les \u00e9checs signal\u00e9s dans le rapport de test sont r\u00e9els et qu&rsquo;il ne s&rsquo;agit pas de cas isol\u00e9s, nous pouvons r\u00e9ex\u00e9cuter les cas de test qui ont \u00e9chou\u00e9 afin d&rsquo;\u00e9liminer les r\u00e9sultats de test faussement n\u00e9gatifs dans les rapports de test.<\/p>\n\n<h3 class=\"wp-block-heading\" id=\"aioseo-ako-to-dosiahnut\">Comment y parvenir ?<\/h3>\n\n<p>Pour r\u00e9essayer automatiquement les cas de test qui ont \u00e9chou\u00e9 pendant l&rsquo;ex\u00e9cution du test, nous devons impl\u00e9menter l&rsquo;interface IRetryAnalyzer fournie par TestNG. L&rsquo;interface IRetryAnalyzer fournit des m\u00e9thodes pour contr\u00f4ler la r\u00e9p\u00e9tition des tests. Nous allons surcharger la m\u00e9thode retry() de IRetryAnalyzer pour nous assurer que le test est ex\u00e9cut\u00e9 en cas d&rsquo;\u00e9chec avec la limite de r\u00e9p\u00e9tition sp\u00e9cifi\u00e9e. Gr\u00e2ce aux commentaires de l&rsquo;extrait, c&rsquo;est compr\u00e9hensible.<\/p>\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-snippet\">Extrait<\/h2>\n\n<pre class=\"wp-block-code\"><code>package com.artoftesting.test;\n\nimport org.testng.IRetryAnalyzer;\n\nimport org.testng.ITestResult;\n\npublic class RetryAnalyzer implements IRetryAnalyzer {\n\n\u00a0\/\/Counter to keep track of retry attempts\n\n\u00a0int retryAttemptsCounter = 0;\n\n\u00a0\/\/The max limit to retry running of failed test cases\n\n\u00a0\/\/Set the value to the number of times we want to retry\n\n\u00a0int maxRetryLimit = 1;\n\n\u00a0\/\/Method to attempt retries for failure tests\n\n\u00a0public boolean retry(ITestResult result) {\n\n\u00a0if (!result.isSuccess()) {\n\n\u00a0if(retryAttemptsCounter &lt; maxRetryLimit){\n\n\u00a0retryAttemptsCounter++;\n\n\u00a0return true;\n\n\u00a0}\n\n\u00a0}\n\n\u00a0return false;\n\n\u00a0}\u00a0\n\n}<\/code><\/pre>\n\n<p>Dans l&rsquo;exemple, nous allons cr\u00e9er une m\u00e9thode de test factice et la faire \u00e9chouer intentionnellement en utilisant la m\u00e9thode assert.fail(). Ici, nous d\u00e9finissons l&rsquo;attribut retryAnalyzer de l&rsquo;annotation @Test en utilisant la classe RetryAnalyzer.class que nous avons cr\u00e9\u00e9e ci-dessus.<\/p>\n\n<pre class=\"wp-block-code\"><code>@Test(retryAnalyzer = RetryAnalyzer.class)\n\n\u00a0\u00a0\u00a0\u00a0public void intentionallyFailingTest(){\n\n\u00a0\u00a0\u00a0\u00a0\u00a0System.out.println(\"Executing Test\");\n\n\u00a0\u00a0\u00a0\u00a0\u00a0Assert.fail(\"Failing Test\");\n\n\u00a0\u00a0\u00a0\u00a0}<\/code><\/pre>\n\n<h2 class=\"wp-block-heading\" id=\"aioseo-vystup-testu\">Sortie d&rsquo;essai<\/h2>\n\n<p><strong>===============================================<\/strong><\/p>\n\n<p><strong>Suite de tests<\/strong><\/p>\n\n<p><strong>Total des tests ex\u00e9cut\u00e9s : 2, \u00c9checs : 1, Sauts : 1<\/strong><\/p>\n\n<p><strong>===============================================<\/strong><\/p>\n\n<p>Ici, nous pouvons observer que le nombre d&rsquo;ex\u00e9cutions de la m\u00e9thode est de 2, avec un \u00e9chec et un saut. La premi\u00e8re fois que la m\u00e9thode de test \u00e9choue, elle est marqu\u00e9e comme \u00e9tant ignor\u00e9e, puis le test s&rsquo;ex\u00e9cute \u00e0 nouveau gr\u00e2ce \u00e0 la logique fournie par RetryAnalyzer.<\/p>\n\n<p>Il ne reste plus qu&rsquo;un probl\u00e8me : nous devons d\u00e9finir l&rsquo;attribut retryAnalyzer dans chaque annotation @Test. Pour y rem\u00e9dier, nous pouvons mettre en \u0153uvre l&rsquo;interface IAnnotationTransformer. Cette interface permet de modifier l&rsquo;annotation testNG \u00e0 la vol\u00e9e. Nous cr\u00e9ons donc une classe impl\u00e9mentant l&rsquo;interface IAnnotationTransformer et lui faisons d\u00e9finir RetryAnalyzer pour les annotations @Test.<\/p>\n\n<pre class=\"wp-block-code\"><code>package com.ittester.test;\n\nimport java.lang.reflect.Constructor;\n\nimport java.lang.reflect.Method;\n\nimport org.testng.IAnnotationTransformer;\n\nimport org.testng.IRetryAnalyzer;\n\nimport org.testng.annotations.ITestAnnotation;\n\npublic class FailureRetryListener implements IAnnotationTransformer {\n\n\u00a0\/\/Overriding the transform method to set the RetryAnalyzer\n\n\u00a0public void transform(ITestAnnotation testAnnotation, Class testClass,\u00a0\n\n\u00a0Constructor testConstructor, Method testMethod) {\n\n\u00a0IRetryAnalyzer retry = testAnnotation.getRetryAnalyzer();\n\n\u00a0if (retry == null)\n\n\u00a0testAnnotation.setRetryAnalyzer(RetryAnalyzer.class);\n\n\u00a0}\n\n}<\/code><\/pre>\n\n<p>Une fois le listener cr\u00e9\u00e9, nous pouvons le sp\u00e9cifier dans le fichier testNG.xml comme suit<\/p>\n\n<pre class=\"wp-block-code\"><code>&lt;listeners>\n\n\u00a0\u00a0\u00a0&lt;listener class-name=\"com.ittester.test.FailureRetryListener\"\/>\n\n&lt;\/listeners><\/code><\/pre>\n\n<p>D\u00e9sormais, nous n&rsquo;avons plus besoin de d\u00e9finir retryAnalyzer dans chaque annotation @Test. Si un auditeur est sp\u00e9cifi\u00e9 dans le fichier testng.xml, il fonctionnera pour tous les tests.<\/p>\n\n<p>PS : Si vous souhaitez ajouter la fonctionnalit\u00e9 de r\u00e9essai uniquement \u00e0 un ensemble limit\u00e9 de m\u00e9thodes de test, il vous suffit de d\u00e9finir l&rsquo;annotation @Test avec l&rsquo;attribut retryAnalyzer en utilisant la classe RetryAnalyzer.class, il n&rsquo;est pas n\u00e9cessaire d&rsquo;impl\u00e9menter IAnnotationTransformer et d&rsquo;ajouter un \u00e9couteur dans le fichier testng.xml.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans cet article, nous allons apprendre comment r\u00e9essayer les cas de test qui ont \u00e9chou\u00e9 en utilisant TestNG. Nous examinons deux approches pour y parvenir.<\/p>\n","protected":false},"author":8,"featured_media":2621,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[46],"tags":[],"class_list":["post-2619","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutoriel-testng"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/ittester.sk\/fr\/wp-json\/wp\/v2\/posts\/2619","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ittester.sk\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ittester.sk\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ittester.sk\/fr\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/ittester.sk\/fr\/wp-json\/wp\/v2\/comments?post=2619"}],"version-history":[{"count":1,"href":"https:\/\/ittester.sk\/fr\/wp-json\/wp\/v2\/posts\/2619\/revisions"}],"predecessor-version":[{"id":2623,"href":"https:\/\/ittester.sk\/fr\/wp-json\/wp\/v2\/posts\/2619\/revisions\/2623"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ittester.sk\/fr\/wp-json\/wp\/v2\/media\/2621"}],"wp:attachment":[{"href":"https:\/\/ittester.sk\/fr\/wp-json\/wp\/v2\/media?parent=2619"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ittester.sk\/fr\/wp-json\/wp\/v2\/categories?post=2619"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ittester.sk\/fr\/wp-json\/wp\/v2\/tags?post=2619"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}