testing - run - pruebas unitarias java netbeans
Orden de ejecuciĆ³n de pruebas en TestNG (16)
¿Cómo personalizar el orden de ejecución de las pruebas en TestNG?
Por ejemplo:
public class Test1 {
@Test
public void test1() {
System.out.println("test1");
}
@Test
public void test2() {
System.out.println("test2");
}
@Test
public void test3() {
System.out.println("test3");
}
}
En el conjunto anterior, el orden de ejecución de las pruebas es arbitrario. Para una ejecución, la salida puede ser:
test1
test3
test2
¿Cómo ejecuto las pruebas en el orden en que fueron escritas?
Utilizar esta:
public class TestNG
{
@BeforeTest
public void setUp()
{
/*--Initialize broowsers--*/
}
@Test(priority=0)
public void Login()
{
}
@Test(priority=2)
public void Logout()
{
}
@AfterTest
public void tearDown()
{
//--Close driver--//
}
}
Por lo general, TestNG proporciona varias anotaciones. Podemos utilizar @BeforeSuite, @BeforeTest, @BeforeClass
para inicializar navegadores / configuración.
Podemos asignarle prioridad si ha escrito una cantidad de casos de prueba en su secuencia de comandos y desea ejecutarlos según la prioridad asignada, luego use: @Test(priority=0)
comenzando desde 0,1,2,3 ....
Mientras tanto, podemos agrupar el número de casos de prueba y ejecutarlo agrupando. para eso usaremos @Test(Groups=''Regression'')
Al final, como para cerrar los navegadores, podemos utilizar las @AfterTest, @AfterSuite, @AfterClass
.
Al especificar los métodos de prueba que se ejecutarán en testNg.xml, podemos ejecutar los casos de prueba en el orden deseado
<suite>
<test name="selenium1">
<classes>
<class name="com.test.SeleniumTest" >
<methods><include name="methodB"></include>
<include name="methodA"></include>
</methods>
</class>
</classes>
</test>
</suite>
Al reverso de la respuesta del usuario1927494, en caso de que desee ejecutar una única prueba antes que las demás, puede hacer esto:
@Test()
public void testOrderDoesntMatter_1() {
}
@Test(priority=-1)
public void testToRunFirst() {
}
@Test()
public void testOrderDoesntMatter_2() {
}
Al usar el parámetro de prioridad para @Test, podemos controlar el orden de ejecución de la prueba.
El orden de los métodos en el archivo de clase es impredecible, por lo que necesita usar dependencias o incluir sus métodos explícitamente en XML.
Por defecto, TestNG ejecutará sus pruebas en el orden en que se encuentran en el archivo XML. Si desea que las clases y métodos enumerados en este archivo se ejecuten en un orden impredecible, establezca el atributo de orden de reserva en falso
En TestNG, utiliza dependsOnMethods y / o dependsOnGroups:
@Test(groups = "a")
public void f1() {}
@Test(groups = "a")
public void f2() {}
@Test(dependsOnGroups = "a")
public void g() {}
En este caso, g () solo se ejecutará después de que f1 () y f2 () se hayan completado y hayan tenido éxito.
Encontrará muchos ejemplos en la documentación: http://testng.org/doc/documentation-main.html#test-groups
En caso de que utilice cosas adicionales como dependsOnMethods
, le conviene definir todo el flujo @Test en su archivo testng.xml. AFAIK, la orden definida en el archivo XML de su suite (testng.xml) anulará todas las demás estrategias de ordenamiento.
Esto funcionará
@Test(priority=1)
public void Test1() {
}
@Test(priority=2)
public void Test2() {
}
@Test(priority=3)
public void Test3() {
}
priority
fomenta el orden de ejecución, pero no garantiza que el nivel de prioridad anterior se haya completado. test3
podría comenzar antes de que finalice test2
. Si se necesita una garantía, entonces declare una dependencia.
A diferencia de las soluciones que declaran dependencias, las pruebas que usan priority
se ejecutarán incluso si falla una prueba. Este problema con las dependencias se puede @Test(...alwaysRun = true...)
con @Test(...alwaysRun = true...)
según la documentation .
Hay formas de ejecutar pruebas en un orden determinado. Normalmente, las pruebas deben ser repetibles e independientes para garantizar que solo prueba la funcionalidad deseada y no depende de los efectos secundarios del código fuera de lo que se está probando.
Por lo tanto, para responder a su pregunta, deberá proporcionar más información, como por qué es importante ejecutar las pruebas en un orden específico.
He enfrentado el mismo problema, la posible razón se debe a la ejecución paralela de testng y la solución es agregar la opción de Prioridad o simplemente actualizar preserve-order = "true" en tu testng.xml.
<test name="Firefox Test" preserve-order="true">
Para abordar el escenario específico en cuestión:
@Test
public void Test1() {
}
@Test (dependsOnMethods={"Test1"})
public void Test2() {
}
@Test (dependsOnMethods={"Test2"})
public void Test3() {
}
Pruebas como pruebas unitarias? ¿Para qué? Las pruebas TIENEN que ser independientes, de lo contrario ... no se puede ejecutar una prueba individualmente. Si son independientes, ¿por qué incluso interferir? Además, ¿qué es un "pedido" si los ejecuta en múltiples hilos en múltiples núcleos?
Si entiendo su pregunta correctamente porque desea ejecutar pruebas en un orden específico, se puede usar TestNG IMethodInterceptor. Eche un vistazo a http://beust.com/weblog2/archives/000479.html sobre cómo aprovecharlos.
Si quieres ejecutar preinicialización, echa un vistazo a IHookable http://testng.org/javadoc/org/testng/IHookable.html y la secuencia asociada http://groups.google.com/group/testng-users/browse_thread/thread/42596505990e8484/3923db2f127a9a9c?lnk=gst&q=IHookable#3923db2f127a9a9c
Si no desea utilizar la @Test(priority = )
en TestNG, puede utilizar la biblioteca javaassist y el IMethodInterceptor
de TestNG para priorizar las pruebas de acuerdo con el orden en que se definen los métodos de prueba en la clase de prueba. Esto se basa en la solución provista here .
Agregue este oyente a su clase de prueba:
package cs.jacob.listeners;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
import org.testng.IMethodInstance;
import org.testng.IMethodInterceptor;
import org.testng.ITestContext;
public class PriorityInterceptor implements IMethodInterceptor {
public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
Comparator<IMethodInstance> comparator = new Comparator<IMethodInstance>() {
private int getLineNo(IMethodInstance mi) {
int result = 0;
String methodName = mi.getMethod().getConstructorOrMethod().getMethod().getName();
String className = mi.getMethod().getConstructorOrMethod().getDeclaringClass().getCanonicalName();
ClassPool pool = ClassPool.getDefault();
try {
CtClass cc = pool.get(className);
CtMethod ctMethod = cc.getDeclaredMethod(methodName);
result = ctMethod.getMethodInfo().getLineNumber(0);
} catch (NotFoundException e) {
e.printStackTrace();
}
return result;
}
public int compare(IMethodInstance m1, IMethodInstance m2) {
return getLineNo(m1) - getLineNo(m2);
}
};
IMethodInstance[] array = methods.toArray(new IMethodInstance[methods.size()]);
Arrays.sort(array, comparator);
return Arrays.asList(array);
}
}
Esto básicamente descubre los números de línea de los métodos y los ordena por orden ascendente de su número de línea, es decir, el orden en que se definen en la clase.
use: preserve-order = "true" enabled = "true" que ejecutará casos de prueba de la manera en que ha escrito.
<suite name="Sanity" verbose="1" parallel="" thread-count="">
<test name="Automation" preserve-order="true" enabled="true">
<listeners>
<listener class-name="com.yourtest.testNgListner.RetryListener" />
</listeners>
<parameter name="BrowserName" value="chrome" />
<classes>
<class name="com.yourtest.Suites.InitilizeClass" />
<class name="com.yourtest.Suites.SurveyTestCases" />
<methods>
<include name="valid_Login" />
<include name="verifyManageSurveyPage" />
<include name="verifySurveyDesignerPage" />
<include name="cloneAndDeleteSurvey" />
<include name="createAndDelete_Responses" />
<include name="previewSurvey" />
<include name="verifySurveyLink" />
<include name="verifySurveyResponses" />
<include name="verifySurveyReports" />
</methods>
</classes>
</test>
</suite>
@Test(dependsOnMethods="someBloodyMethod")