Red de conocimiento informático - Conocimiento informático - Cómo resolver problemas de reintento de TestNG

Cómo resolver problemas de reintento de TestNG

Utilizamos TestNG como base de nuestro marco de pruebas automatizadas. Después de ejecutar un lote de casos de prueba, queremos poder reintentar automáticamente los casos de prueba fallidos. TestNG proporciona una interfaz IRetryAnalyzer y puede especificar en la anotación @Test que desea utilizar la clase Retry para realizar la función de reintento. @Test(retryAnalyzer = TestRetryAnalyzer.class) La clase TestRetryAnalyzer implementa la interfaz IRetryAnalyzer. La lógica de implementación es: en el método de reintento, determine si el número de reintentos excede el número máximo de reintentos especificado. Devuelve verdadero si no, falso en caso contrario. _______________________________________________________________________________ importorg.testng.public class TestRetryAnalyzer implementa IRetryAnalyzer { cadena final estática privada TEST_ RETRY_COUNT = "testRetryCount"; privateintmaxCount = 1; publicTestRetryAnalyzer() { String retryMaxCount = System.getProperty(TEST_RETRY_COUNT if (retryMaxCount! = nulo) { maxCount = Integer.parseInt(retryMaxCount); }} publicintgetCount() { returnthis.count; } publicintgetMaxCount() { returnthis.maxCount } reintento booleano sincronizado público (resultado de ITestResult) { String testClassName = String.format("% s.%s", result.getMethod() .getRealClass(). toString(), result.getMethod().getMethodName()); if (count <= maxCount) { result.setAttribute("RETRY", new Integer( contar)); Logging.log(" [REINTENTANDO] " + testClassName + " FAILED " + "Reintentando " + count + " time ", true); _______________________________________________________________________________

Luego, necesitamos definir un TestNGListener para manejar el estado del TestCase Retry. En el método onTestFailure, configuramos el estado de los casos fallidos que no han alcanzado el número máximo de reintentos en SKIP para que TestNG no los considere casos de prueba fallidos.

La clase pública RetrytestListener extiende Testlistener PublicSyronizedvoidVoidontestFailure (ITESTRSULT ARG0) {if (ARG0.GetMethod (). Ryanalyzer ()! = NULL) {TestretrynalyzertRTRYANALYZER = (testryanalyzer) arg0.getMethod (). (testRetryAnalyzer.getCount() & lt;= testRetryAnalyzer.getMaxCount())){ arg0.setStatus(ITestResult.SKIP); Reporter.setCurrentTestResult(null); else fallenCases.} public void onFinish(final ITestContext arg0) { if( isRetryHandleNeeded) { removeIncorrectlySkippedTests(arg0,failedCases); removeFailedTestsInTestNG(arg0); }else { skippedCases = arg0.getSkippedTests();

TestNG puede poner Casos de prueba en Omitidos y Fallidos, por lo que queremos eliminar los casos de prueba realmente fallidos en el caso de prueba Omitidos (el caso en el que falló el último reintento) protectedIResultMapremoveIncorrectlySkippedTests(ITestContexttest,IRe sultMap map) { List (); IResultMap returnValue = test.getSkippedTests(); for(ITestResult resultado: returnValue.getAllResults()) { for(ITestResultresultToCheck: map.getAllResults()) { if(resultToCheck.get Método ().equals(result.getMethod())){ failsToRemove.add(resultToCheck.getMethod()); break; .equals(result.getMethod())){ failsToRemove.add(resultToCheck.getMethod()); break; }}} for(ITestNGMethod método: failsToRemove) { returnValue.removeResult(método } skippedCases = returnReturnValue;

IResultMap solo proporciona el método removeResult(Method) para eliminar el método. Si usamos Dataprovider, no podemos llamar directamente a este método para eliminar el resultado del método interno FailedResult. Esto conducirá a resultados de casos de prueba confusos. El mismo método de prueba puede tener un resultado de datos aprobado y otro resultado de datos fallido, por lo que utilizamos casos fallidos para registrar los resultados verdaderos del error y mostrar casos fallidos en nuestros propios informes. En el método siguiente, analizamos las pruebas fallidas y eliminamos el resultado del método si no está en casos fallidos. Esto permite a TestNG informar el estado general de aprobación/rechazo de la suite. Algunas personas preguntan ¿por qué hacemos esto? ¿No habíamos configurado ya el caso de prueba para que se omitiera antes? Recuerde, como mencionamos antes, TestNG puede colocar los resultados en dos asignaciones, por lo que aún debemos realizar este paso para asegurarnos de que sea correcto.

privatevoidremoveFailedTestsInTestNG(prueba ITestContext) { IResultMapreturnValue = test.getFailedTests(); for(ITestResult resultado. returnValue.getAllResults()) { booleanisFailed = false for(ITestResultresultToCheck: fallenCases.getAllResults()) { if(result.getMe thod() . es igual a (resultToCheck.getMethod())){ System.out.println("Aprobado: "+result.getMethod().getMethodName()); isFailed = true; returnValue .removeResult(result.getMethod()); test.getFailedConfigurations().removeResult(result.getMethod()); if(!}}....}

Cuando hacemos esto, básicamente Se puede garantizar la exactitud del informe. Sin embargo, el soporte de reintento de TestNG para DataProvider no es lo suficientemente completo. Además, el código se basa en TestNG 6.7 y versiones posteriores. De lo contrario, CI seguirá informando una falla si el reintento es exitoso. p>

org.apache.maven.plugins maven-surefire-plugin 2.9 < suiteXmlFile >src/main/java/com/ebay/maui/ test/demo/testng_retry.xml usedefaultlisteners false oyente com.ebay.maui.reporter.HTMLReporter < / p>

Reimpreso únicamente como referencia, los derechos de autor pertenecen al autor original. Te deseo un feliz día, acepta si estás satisfecho