2010-04-19 79 views
58

¿Cómo personalizar el orden de ejecución de pruebas en TestNG?Orden de ejecución de 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 la suite anteriormente, el orden de ejecución de las pruebas es arbitraria. Para una ejecución la salida puede ser:

test1 
test3 
test2 

¿Cómo ejecutar las pruebas en el orden en que han sido escritas?

Respuesta

-5

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?

+2

En realidad es bastante posible mezclar dependencias y paralelismo, eche un vistazo a este artículo para averiguar cómo lo hace TestNG: http: // beust.com/weblog/2009/11/28/hard-core-multicore-with-testng/ –

+0

Las personas usan JUnit para muchas cosas además de las pruebas unitarias. Casi todos esos usos adicionales tienen momentos en los que necesita hacer cosas en un orden particular. Esta es una de las principales razones para desarrollar TestNG, BTW. – Jeffiekins

0

Existen 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.

+16

Hay muchas situaciones en las que las dependencias son útiles, especialmente para la integración y las pruebas funcionales. Por ejemplo, probando un sitio web: primero quiere probar la página de inicio de sesión, luego la página siguiente, etc. Borrar y volver a crear el estado desde cero todo el tiempo es poco práctico y lleva a pruebas muy lentas. Además, las dependencias le brindan diagnósticos mucho mejores, como "1 prueba fallida, 99 pruebas omitidas" en lugar de las "100 pruebas fallidas" tradicionales que no ayudan a darse cuenta de que todas estas fallas se deben a que una prueba falló. –

52

En TestNG, se 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() sólo se ejecutará después de f1() y f2() han completado y tuvo éxito.

Usted encontrará una gran cantidad de ejemplos en la documentación: http://testng.org/doc/documentation-main.html#test-groups

+1

'dependsOnGroups' es extremadamente útil, pero me parece que TestNG está ignorando' priority' cuando ambos se combinan juntos. –

+0

Sin embargo, la solución de Cedric tiene algunos inconvenientes cuando se trabaja con el complemento TestNG Eclipse, ver. 5.9.0.4, ya que cada ejecución del TestCase muestra mensaje de que los grupos no están respaldados por este complemento. – honzajde

4

Si entiendo bien su pregunta en la que desea ejecutar pruebas en un orden específico, TestNG IMethodInterceptor se puede utilizar. Eche un vistazo al http://beust.com/weblog2/archives/000479.html sobre cómo aprovecharlos.

Si desea ejecutar algún preinitialization, echar un vistazo a IHookable http://testng.org/javadoc/org/testng/IHookable.html e hilo asociado http://groups.google.com/group/testng-users/browse_thread/thread/42596505990e8484/3923db2f127a9a9c?lnk=gst&q=IHookable#3923db2f127a9a9c

1

Mediante el uso de paramenter prioridad para @test podemos controlar el orden de ejecución de la prueba.

+2

Desafortunadamente no en TestNG. –

+0

@MariuszJamro No entiendo por qué? El parámetro 'Priority' aún no existe en 2012? –

4
@Test(dependsOnMethods="someBloodyMethod") 
+3

Podría señalar que esta no es una respuesta particularmente útil: ¡sugiero ampliar sus respuestas con un poco más de detalle! – Zyerah

19

Para hacer frente a escenario específico de que se trate:

@Test 
public void Test1() { 

} 

@Test (dependsOnMethods={"Test1"}) 
public void Test2() { 

} 

@Test (dependsOnMethods={"Test2"}) 
public void Test3() { 

} 
60

Esto funcionará.

@Test(priority=1) 
public void Test1() { 

} 

@Test(priority=2) 
public void Test2() { 

} 

@Test(priority=3) 
public void Test3() { 

} 

priority alienta orden de ejecución, pero no garantiza el nivel de prioridad anterior ha completado. test3 podría comenzar antes de que test2 finalice. 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 solucionar con @Test(...alwaysRun = true...) según documentation.

1

que llevan a cuestas fuera de la respuesta de user1927494, En caso de que desee ejecutar una sola prueba antes de que todos los demás, se puede hacer esto:

@Test() 
public void testOrderDoesntMatter_1() { 
} 

@Test(priority=-1) 
public void testToRunFirst() { 
} 

@Test() 
public void testOrderDoesntMatter_2() { 
} 
3

Si no desea utilizar la opción @Test(priority =) en TestNG , puede utilizar la biblioteca javaassist y TestNG's IMethodInterceptor 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.

Añadir 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 se entera de 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 el que se definen en el clase.

+1

Esta es la verdadera solución si tiene que migrar unos cientos de pruebas desde junit – realcnbs

1

especificando los métodos de prueba para ser ejecutado en testng.xml podemos ejecutar los casos de prueba en el orden deseado

<suite> 
 
<test name="selenium1"> 
 
    \t \t <classes> 
 
\t \t \t <class name="com.test.SeleniumTest" > 
 
\t \t \t  <methods><include name="methodB"></include> 
 
\t \t \t   <include name="methodA"></include> 
 
\t \t \t  </methods>  
 
\t \t \t </class> 
 
\t \t </classes> 
 
    
 
\t </test> 
 
</suite>

1

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.

De forma predeterminada, TestNG ejecutará las pruebas en el orden en que se encuentran en el archivo XML. Si desea que las clases y los métodos enumerados en este archivo para ejecutar en un orden unpredictible, establecer el orden de preservar-atributo en false

4

Utilice 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 número de anotaciones, podemos usar @BeforeSuite, @BeforeTest, @BeforeClass para inicializar navegadores/configuración.

Podemos asignar prioridad si ha escrito el número de casos de prueba en el script y quiere ejecutar de acuerdo con la prioridad asignada a continuación, utilizar: @Test(priority=0) partir de 0,1,2,3 ....

Mientras tanto podemos agrupar el número de casos de prueba y ejecutarlo agrupando. para eso vamos a usar @Test(Groups='Regression')

Al final, al cerrar los navegadores, podemos usar las anotaciones @AfterTest, @AfterSuite, @AfterClass.

1

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"> 
+1

preserve-order = "true", está predeterminado en testng.xml y funciona solo para el orden que definió en testng.xml solamente, entonces la resolución de su problema solo está agregando prioridad a @Tests – Kiran

0

En caso de que ocurriera utilizar material adicional como dependsOnMethods, es posible que desee 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.

Cuestiones relacionadas