2017-08-22 4 views
0

J'essaie d'utiliser l'assertion "soft" ici pour lancer le test de sorte qu'après l'assertion, tout le script du test soit exécuté. J'ai créé une classe d'écouteur pour valider le résultat et effectuer un test. Mais après l'exécution, ce test devrait échouer et qui est validé et affiché dans l'onglet Eclipse "Résultat de la suite", mais pas dans l'onglet "Console" et aussi dans le test de rapport est passé avec erreur d'assertion. S'il vous plaît laissez-moi savoir si quelque chose ne va pas avec dans le code ..Gestion des assertions donnant des résultats différents dans "console" et "résultat de la suite"

s'il vous plaît voir les captures d'écran ci-jointes pour votre référence. --Below est la classe de test où la gestion des assertions a eu lieu en utilisant try-catch.

import org.testng.Assert; 
 
import org.testng.annotations.Test; 
 

 
import ErrorCollectors.ErrorCollector; 
 

 

 
public class TestValidateTitles { 
 
\t 
 
\t 
 
\t @Test 
 
\t public void ValidteTitle(){ 
 
\t \t try{ 
 
\t \t System.out.println("Beginning"); 
 
\t \t 
 
\t \t String actual_title = "Gmail.com"; 
 
\t \t String expected_title = "Yahoo.com"; 
 
\t \t 
 
\t \t Assert.assertEquals(expected_title, actual_title); 
 
\t \t }catch(Throwable t){ 
 
\t \t \t 
 
\t \t \t System.out.println("Error Occurred"); 
 
\t \t \t ErrorCollector.addVerificationFailure(t); 
 
\t \t \t 
 
\t \t } 
 
\t \t System.out.println("Ending"); 
 
\t \t 
 
\t } 
 

 
}

- est inférieure à la classe pour recueillir des erreurs ---

package ErrorCollectors; 
 

 
import java.util.ArrayList; 
 
import java.util.HashMap; 
 
import java.util.List; 
 
import java.util.Map; 
 

 

 
import org.testng.ITestResult; 
 
import org.testng.Reporter; 
 

 
public class ErrorCollector { 
 
\t 
 
\t private static Map<ITestResult, List<Throwable>> verificationFailuresMap = new HashMap<ITestResult, List<Throwable>>(); 
 

 

 
\t public static List<Throwable> getVerificationFailures() { 
 
\t \t List<Throwable> verificationFailures = verificationFailuresMap.get(Reporter.getCurrentTestResult()); 
 
\t \t return verificationFailures == null ? new ArrayList<Throwable>() : verificationFailures; 
 
\t } 
 
\t 
 
\t public static void addVerificationFailure(Throwable e) { 
 
\t \t List<Throwable> verificationFailures = getVerificationFailures(); 
 
\t \t verificationFailuresMap.put(Reporter.getCurrentTestResult(), verificationFailures); 
 
\t \t verificationFailures.add(e); 
 
\t } 
 
\t 
 
}

ci-dessous est le code qui définit la classe d'écoute pour valider la échec ou réussite de tout test .............

package ErrorCollectors; 
 

 
import java.util.List; 
 

 
import org.testng.IInvokedMethod; 
 
import org.testng.IInvokedMethodListener; 
 
import org.testng.ITestResult; 
 
import org.testng.Reporter; 
 
import org.testng.internal.Utils; 
 

 
public class TestListenerAdapter implements IInvokedMethodListener { 
 

 
\t public void afterInvocation(IInvokedMethod method, ITestResult result) { 
 
\t \t 
 

 
\t \t 
 
\t \t Reporter.setCurrentTestResult(result); 
 
\t \t 
 
\t \t if (method.isTestMethod()) { 
 

 
\t \t \t List<Throwable> verificationFailures = ErrorCollector.getVerificationFailures(); 
 

 
\t \t \t //if there are verification failures... 
 
\t \t \t if (verificationFailures.size() > 0) { 
 
\t \t \t \t 
 
\t \t \t \t //set the test to failed 
 
\t \t \t \t result.setStatus(ITestResult.FAILURE); 
 

 
\t \t \t \t //if there is an assertion failure add it to verificationFailures 
 
\t \t \t \t if (result.getThrowable() != null) { 
 
\t \t \t \t \t verificationFailures.add(result.getThrowable()); 
 
\t \t \t \t } 
 
\t \t \t \t 
 
\t \t \t \t int size = verificationFailures.size(); 
 
\t \t \t \t //if there's only one failure just set that 
 
\t \t \t \t if (size == 1) { 
 
\t \t \t \t \t result.setThrowable(verificationFailures.get(0)); 
 
\t \t \t \t } else { 
 
\t \t \t \t \t //create a failure message with all failures and stack traces (except last failure) 
 
\t \t \t \t \t StringBuffer failureMessage = new StringBuffer("Multiple failures (").append(size).append("):\n\n"); 
 
\t \t \t \t \t for (int i = 0; i < size-1; i++) { 
 
\t \t \t \t \t \t failureMessage.append("Failure ").append(i+1).append(" of ").append(size).append(":\n"); 
 
\t \t \t \t \t \t Throwable t = verificationFailures.get(i); 
 
\t \t \t \t \t \t String fullStackTrace = Utils.stackTrace(t, false)[1]; 
 
\t \t \t \t \t \t failureMessage.append(fullStackTrace).append("\n\n"); 
 
\t \t \t \t \t } 
 
\t \t \t \t \t 
 
\t \t \t \t \t //final failure 
 
\t \t \t \t \t Throwable last = verificationFailures.get(size-1); 
 
\t \t \t \t \t failureMessage.append("Failure ").append(size).append(" of ").append(size).append(":\n"); 
 
\t \t \t \t \t failureMessage.append(last.toString()); 
 
\t \t \t \t \t 
 
\t \t \t \t \t //set merged throwable 
 
\t \t \t \t \t Throwable merged = new Throwable(failureMessage.toString()); 
 
\t \t \t \t \t merged.setStackTrace(last.getStackTrace()); 
 
\t \t \t \t \t 
 
\t \t \t \t \t result.setThrowable(merged); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t } 
 
\t 
 
\t } 
 
\t 
 
\t public void beforeInvocation(IInvokedMethod arg0, ITestResult arg1) {} 
 
\t 
 
}

Ci-dessous est mon fichier testng.xml.

<?xml version="1.0" encoding="UTF-8"?> 
 
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> 
 
<suite name="Suite"> 
 
<listeners> 
 
    <listener class-name="ErrorCollectors.TestListenerAdapter"/> 
 
</listeners> 
 
    <test name="Test"> 
 
    <classes> 
 
     <class name="com.collections.java.TestValidateTitles"/> 
 
    </classes> 
 
    </test> 
 
</suite>

enter image description here enter image description here

Répondre

0

Les prises catch la AssertionError étant lancée par Assert.assertEquals. C'est pourquoi le message d'erreur est imprimé mais le test n'est pas terminé et se termine avec succès.

1

Je ne suis pas vraiment sûr de ce qui était la raison de réinventer la roue, mais TestNG a déjà implémenté SoftAssert. Comme alternative, vous pouvez regarder par exemple. AssertJ bibliothèque, qui a également SoftAssertions.

Votre problème particulier est lié au mauvais traitement des erreurs d'assertion.

Avec SoftAssert vous pourriez attraper assertAll résultat original dans afterInvocation, au lieu de mettre try/catch blocs dans les tests, puis affecter manuellement le résultat du test requis en cas d'échec.