Establezca el tiempo de retraso para cada <prueba> en TestNG
Primero como información : coloco a cada uno @Test
en una clase diferente (por lo que, por supuesto, cada clase solo tiene 1 @Test
anotación).
En realidad, mi objetivo es querer volver a ejecutar la misma clase con un parámetro diferente, pero quiero ejecutar otra clase primero de antemano.
Intenté encontrar muchas referencias que TestNG no permite la repetición de una clase o una @Test
anotación de método en una <test>
. La repetición proporcionada es una invocationCount
función, ya veo invocationCount
, pero no puedo lograr mi objetivo invocationCount
porque esta función se repite @Test
al mismo tiempo y luego puedo ejecutar otra @Test
.
public class SimpleTest1 {
@Test
@Parameters({"acc"})
public void historyTransfer(String acc) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
public class SimpleTest2 {
@Test
@Parameters({"senderAcc", "beneficiaryAcc", "amount"})
public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
Me imagino correr como la siguiente configuración:
<suite name="Suite">
<test name="My Test" >
<classes>
<class name="com.SimpleTest1">
<parameter name="acc" value="11111"></parameter>
</class>
<class name="com.SimpleTest2">
<parameter name="senderAcc" value="11111"></parameter>
<parameter name="beneficiaryAcc" value="22222"></parameter>
<parameter name="amount" value="100"></parameter>
</class>
<class name="com.SimpleTest1">
<parameter name="acc" value="22222"></parameter>
</class>
</classes>
</test>
</suite>
Pero la configuración anterior no salió según lo planeado porque la segunda SimpleTest1
no se ejecutó.
Luego traté de ejecutarlo de forma separada <test>
como bramido y éxito, pero estoy enfrentando un nuevo problema sobre el tiempo de demora cada uno <test>
.
Ejecute múltiples en <test>
serie (no en paralelo) de la siguiente manera:
<suite name="Suite">
<test name="My Test1" >
<classes>
<class name="com.SimpleTest1">
<parameter name="acc" value="11111"></parameter>
</class>
</classes>
</test>
<test name="My Test2" >
<classes>
<class name="com.SimpleTest2">
<parameter name="senderAcc" value="11111"></parameter>
<parameter name="beneficiaryAcc" value="22222"></parameter>
<parameter name="amount" value="100"></parameter>
</class>
</classes>
</test>
<test name="My Test3" >
<classes>
<class name="com.SimpleTest1">
<parameter name="acc" value="22222"></parameter>
</class>
</classes>
</test>
</suite>
Dependencia de TestNG Maven:
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
</dependency>
Seguro:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>testng.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
IDE: Eclipse (Versión: 2018-09 (4.9.0))
SO: macOS Mojave (Versión 10.14.6)
Salida :
[RemoteTestNG] detected TestNG version 7.0.0
22-12-2020 21:59:32
22-12-2020 21:59:47
22-12-2020 21:59:57
===============================================
Suite
Total tests run: 3, Passes: 3, Failures: 0, Skips: 0
===============================================
Pero una vez finalizada la primera <test>
, hay un retraso de unos 10 segundos antes de las siguientes <test>
ejecuciones, así como de la siguiente prueba.
Nota : pensé que esto era un problema con el IDE (yo uso Eclipse), pero no lo fue. Intenté ejecutarlo de 2 maneras, a través del IDE y la línea de comando, y me dio el mismo resultado sobre este problema de demora.
A través de la línea de comando usando este comando:
mvn clean test -Dsurefire.suiteXmlFiles=testng.xml
¿Existe alguna configuración para reducir el tiempo de retardo anterior?
Respuestas
Primero, una suite no es un plan de prueba (podría ser una buena solicitud de función por cierto) sino solo una forma de seleccionar pruebas. Significa que no puede definir una dependencia entre pruebas. Es por eso que tener la misma clase de prueba no funciona (debería fallar o crear diferentes instancias).
Según entiendo sus necesidades, la mejor manera es separar su propia lógica y su integración con el marco de prueba:
- diseñe sus clases auxiliares / fixture como desee:
_
public class SimpleClass1 {
public void historyTransfer(String acc) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
public class SimpleClass2 {
public void tranfer(String senderAcc, String beneficiaryAcc, String amount) {
System.out.println(new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(Calendar.getInstance().getTime()));
}
}
- definir las clases para la integración con el marco de prueba
_
public class SimpleTest {
@Test
@Parameters({"acc"})
public void step1(String acc) {
(new SimpleClass1()).historyTransfer(acc);
}
@Test(dependsOnMethods = {"step1"})
@Parameters({"senderAcc", "beneficiaryAcc", "amount"})
public void step2(String senderAcc, String beneficiaryAcc, String amount) {
(new SimpleClass2()).transfer(acc);
}
@Test(dependsOnMethods = {"step2"})
@Parameters({"acc"})
public void step3(String acc) {
(new SimpleClass1()).historyTransfer(acc);
}
}
Y la suite con los parámetros esperados:
<suite name="Suite">
<test name="My Test" >
<classes>
<class name="com.SimpleTest">
<methods>
<include name="step1">
<parameter name="acc" value="11111"></parameter>
</methods>
<methods>
<include name="step2">
<parameter name="senderAcc" value="11111"></parameter>
<parameter name="beneficiaryAcc" value="22222"></parameter>
<parameter name="amount" value="100"></parameter>
</methods>
<methods>
<include name="step3">
<parameter name="acc" value="22222"></parameter>
</methods>
</class>
</classes>
</test>
</suite>
(descargo de responsabilidad: no verifiqué el XML con el dtd, podría estar equivocado, pero tienes la idea)
El nombre o la forma de crear dispositivos depende de sus propias convenciones.
Puede establecer la prioridad o la dependencia de otro método utilizando las anotaciones como se describe aquí:
https://testng.org/doc/documentation-main.html#annotations
compruebe @ Test.priority o @ Test.dependsOnMethods
Hacer esto, le permitirá ejecutar las pruebas una tras otra en serie.
No sé por qué necesita ejecutar la misma clase de prueba en pruebas separadas, pero al iniciar la prueba, puede cargar todo el contexto relevante, lo que puede llevar tiempo y, después de finalizar la prueba, es posible que deba cerrar algunos recursos, ambos pueden llevar tiempo / pocos segundos
Puede usar detallado para usar más detalles de la causa del retraso (y agregar más registros para ver el tiempo)
<suite name="Suite" verbose="10">
El nivel de verbosidad es de 0 a 10, donde 10 es el más detallado. Una vez que lo establezca en 10, verá que la salida de la consola contendrá información sobre las pruebas, métodos y oyentes, etc.
Para acelerar el proceso, también puede utilizar la función paralela de TestNG
El atributo threadPoolSize le permite especificar cuántos subprocesos deben asignarse para esta ejecución.