Opakované spustenie neúspešných testov v TestNG

Opakované spustenie neúspešných testov v TestNG
5 MIN
18 mar 2024

V tomto príspevku sa naučíme opakovať neúspešné testovacie prípady pomocou TestNG. Preskúmame dva prístupy, ako to dosiahnuť, a to – pomocou súboru testng-failed.xml a implementáciou testNG IRetryAnalyzer.

Obsah

Opätovné spustenie neúspešných testov pomocou súboru testng-failed.xml

Kedy použiť?

Niekedy sa od nás ako od testerov automatizácie testov vyžaduje, aby sme po oprave niektorých chýb spustili len neúspešné testy nahlásené nástrojom pre automatizáciu testov. Spustením iba neúspešných testov sa rýchlo overia opravy chýb.

Ako to dosiahnuť?

Spustenie iba neúspešných testov je pomerne jednoduché, pretože TestNG na to poskytuje prirodzenú podporu. Vždy, keď sa spustí testovacia sada pomocou súboru testng.xml, potom sa po vykonaní testu vytvorí súbor testng-failed.xml v priečinku test-output. Neskôr môžeme tento súbor spustiť rovnako ako súbor testng.xml. Keďže tento súbor uchováva iba neúspešné testy, spustením tohto súboru sa spustia iba neúspešné testy.

Automatické opakovanie neúspešných testov pomocou IRetryAnalyzer

Kedy používať?

Niekedy sa v správe o vykonaní testu objavia zlyhania, ktoré nie sú spôsobené problémami v aplikácii. Základná príčina týchto problémov môže súvisieť s nastavením testovacieho prostredia alebo s nejakým príležitostným problémom servera. Aby sme sa uistili, že zlyhanie nahlásené v správe o teste je skutočné a nejde len o ojedinelé prípady, môžeme zlyhané testovacie prípady opakovane spustiť, aby sme eliminovali falošne negatívne výsledky testov v správach o testoch.

Ako to dosiahnuť?

Na automatické opakovanie zlyhaných testovacích prípadov počas samotného behu testu musíme implementovať rozhranie IRetryAnalyzer, ktoré poskytuje TestNG. Rozhranie IRetryAnalyzer poskytuje metódy na riadenie opakovania testovacích behov. Tu budeme prepisovať metódu retry() IRetryAnalyzer, aby sme zabezpečili spustenie testu v prípade zlyhania so zadaným limitom počtu opakovaní. Vďaka komentárom v snipette je to zrozumiteľné.

Snippet

package com.artoftesting.test;

import org.testng.IRetryAnalyzer;

import org.testng.ITestResult;

public class RetryAnalyzer implements IRetryAnalyzer {

 //Counter to keep track of retry attempts

 int retryAttemptsCounter = 0;

 //The max limit to retry running of failed test cases

 //Set the value to the number of times we want to retry

 int maxRetryLimit = 1;

 //Method to attempt retries for failure tests

 public boolean retry(ITestResult result) {

 if (!result.isSuccess()) {

 if(retryAttemptsCounter < maxRetryLimit){

 retryAttemptsCounter++;

 return true;

 }

 }

 return false;

 } 

}

V ukážke vytvoríme fiktívnu testovaciu metódu a zámerne ju nechám zlyhať pomocou metódy assert.fail(). Tu nastavíme atribút retryAnalyzer anotácie @Test pomocou triedy RetryAnalyzer.class, ktorú sme vytvorili vyššie.

@Test(retryAnalyzer = RetryAnalyzer.class)

    public void intentionallyFailingTest(){

     System.out.println("Executing Test");

     Assert.fail("Failing Test");

    }

Výstup testu

===============================================

Test suite

Total tests run: 2, Failures: 1, Skips: 1

===============================================

Tu môžeme pozorovať, že počet behov metódy sa zobrazuje ako 2 s jedným zlyhaním a jedným vynechaním. Prvé spustenie testovacej metódy pri neúspechu bude označené ako Preskočené a potom sa test spustí znova vďaka logike uvedenej v RetryAnalyzer.

Teraz je tu len jeden problém, musíme nastaviť atribút retryAnalyzer v každej anotácii @Test. Aby sme sa s tým vysporiadali, môžeme implementovať rozhranie IAnnotationTransformer. Toto rozhranie poskytuje možnosť meniť anotáciu testNG za behu. Vytvoríme teda triedu implementujúcu rozhranie IAnnotationTransformer a prinútime ju nastaviť RetryAnalyzer pre anotácie @Test.

package com.ittester.test;

import java.lang.reflect.Constructor;

import java.lang.reflect.Method;

import org.testng.IAnnotationTransformer;

import org.testng.IRetryAnalyzer;

import org.testng.annotations.ITestAnnotation;

public class FailureRetryListener implements IAnnotationTransformer {

 //Overriding the transform method to set the RetryAnalyzer

 public void transform(ITestAnnotation testAnnotation, Class testClass, 

 Constructor testConstructor, Method testMethod) {

 IRetryAnalyzer retry = testAnnotation.getRetryAnalyzer();

 if (retry == null)

 testAnnotation.setRetryAnalyzer(RetryAnalyzer.class);

 }

}

Po vytvorení poslucháča ho môžeme špecifikovať v súbore testNG.xml takto-

<listeners>

   <listener class-name="com.ittester.test.FailureRetryListener"/>

</listeners>

Teraz už nemusíme nastavovať retryAnalyzer v každej anotácii @Test. Ak máme poslucháča (listener) zadaného v súbore testng.xml, bude fungovať pre všetky testy.

PS: Ak chcete pridať funkčnosť retry len do obmedzenej množiny testovacích metód, než stačí nastaviť anotácie @Test s atribútom retryAnalyzer pomocou triedy RetryAnalyzer.class, nie je potrebné implementovať IAnnotationTransformer a pridávať poslucháča v súbore testng.xml.