2010-10-15 31 views
14

¿Existe actualmente una forma de desactivar la prueba de TestNG basado en una condiciónprueba Cómo deshabilitar TestNG basado en una condición

sé que puedes prueba actualmente desactivar como tal en TestNG:

@Test(enabled=false, group={"blah"}) 
public void testCurrency(){ 
... 
} 

Me gustaría desactivar la misma prueba en función de una condición, pero no sé cómo. algo como esto:

@Test(enabled={isUk() ? false : true), group={"blah"}) 
public void testCurrency(){ 
... 
} 

Cualquiera tiene una pista sobre si esto es posible o no.

+0

anotaciones no son código ejecutable, así que esto es poco probable. ¿Qué estás realmente tratando de hacer? ¿En qué condiciones quieres que se ejecute o no una prueba? –

+0

gracias matt. Consulte la respuesta de cedrics a continuación para obtener más detalles. – Afamee

Respuesta

10

Usted tiene dos opciones:

Su transformador de anotación probaría la condición y luego anularía la anotación @Test para agregar el atributo "enabled = false" si la condición no se cumple.

+0

Gracias cedric. Creo que me gustaría explorar la opción 'transformador de anotación'. eso suena más como lo que estoy buscando. – Afamee

+0

Gracias de nuevo. No tardé mucho en obtener un ejemplo práctico de este transformador. Sin embargo, una cosa es no comportarse como esperaba. Quiero transformar dinámicamente el nombre de la prueba que ejecuto (... al menos, la forma en que se mostrará en el resultado de la prueba) llamando a annot.setTestName (concatString) donde annot representa la anotación del método, pero el resultado vuelve con el original nombre sin cambios. ¿¿Hay otra manera de hacer esto?? Esperemos que no te confundas. – Afamee

+0

No podrá anular el comportamiento de una clase en el tiempo de ejecución, así es como está diseñado Java. En cambio, sugiero que coloque la lógica que decide cuál es ese nombre directamente en la prueba para que pueda devolverlo en getTestName(). –

30

Una opción más fácil es utilizar la anotación @BeforeMethod en un método que verifica su condición. Si quiere omitir las pruebas, simplemente arroje un SkipException. De esta manera:

@BeforeMethod 
protected void checkEnvironment() { 
    if (!resourceAvailable) { 
    throw new SkipException("Skipping tests because resource was not available."); 
    } 
} 
+0

Hola, desde 6.13 lanzar SkipException establece el estado en Fallido en lugar de Saltado. Ver https://stackoverflow.com/questions/20022288/conditional-skipping-of-testng-tests/47571922#47571922 –

5

Hay dos maneras que yo sepa que permite el control de la "desactivación" pruebas en TestNG.

La diferenciación que es muy importante tener en cuenta es que SkipException saldrá de todas las pruebas posteriores mientras que la implementación de IAnnotionTransformer usa Reflection para deshabilitar las pruebas individuales, según una condición que usted especifique. Explicaré tanto SkipException como IAnnotationTransfomer.

ejemplo SKIP Excepción

import org.testng.*; 
import org.testng.annotations.*; 

public class TestSuite 
{ 
    // You set this however you like. 
    boolean myCondition; 

    // Execute before each test is run 
    @BeforeMethod 
    public void before(Method methodName){ 
     // check condition, note once you condition is met the rest of the tests will be skipped as well 
     if(myCondition) 
      throw new SkipException(); 
    } 

    @Test(priority = 1) 
    public void test1(){} 

    @Test(priority = 2) 
    public void test2(){} 

    @Test(priority = 3) 
    public void test3(){} 
} 

IAnnotationTransformer ejemplo

Un poco más complicado, pero la idea detrás de esto es un concepto conocido como reflexión.

Wiki - http://en.wikipedia.org/wiki/Reflection_(computer_programming)

Primera implementar la interfaz IAnnotation, guardar esto en un archivo * .java.

import java.lang.reflect.Constructor; 
import java.lang.reflect.Method; 
import org.testng.IAnnotationTransformer; 
import org.testng.annotations.ITestAnnotation; 

public class Transformer implements IAnnotationTransformer { 

// Do not worry about calling this method as testNG calls it behind the scenes before EVERY method (or test). 
// It will disable single tests, not the entire suite like SkipException 
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod){ 

    // If we have chose not to run this test then disable it. 
    if (disableMe()){ 
     annotation.setEnabled(false); 
    } 
} 

// logic YOU control 
private boolean disableMe()){ 
} 

Luego se prueba en el archivo Java suite de hacer lo siguiente en la función @BeforeClass

import org.testng.*; 
import org.testng.annotations.*; 

/* Execute before the tests run. */  
@BeforeClass 
public void before(){ 

    TestNG testNG = new TestNG(); 
    testNG.setAnnotationTransformer(new Transformer()); 
} 

@Test(priority = 1) 
public void test1(){} 

@Test(priority = 2) 
public void test2(){} 

@Test(priority = 3) 
public void test3(){} 

Un último paso es asegurarse de que agregue un oyente en el archivo build.xml. La mina terminó luciendo así, esta es solo una línea de la construcción.xml:

<testng classpath="${test.classpath}:${build.dir}" outputdir="${report.dir}" 
    haltonfailure="false" useDefaultListeners="true" 
    listeners="org.uncommons.reportng.HTMLReporter,org.uncommons.reportng.JUnitXMLReporter,Transformer" 
    classpathref="reportnglibs"></testng> 
0

Lanzar un SkipException en un método anotado con @BeforeMethod no funcionó para mí porque se saltó todas las pruebas restantes de mi banco de pruebas sin relación si un SkipException fueron lanzados por esas pruebas.

que no investigaron a fondo pero he encontrado otra manera: el uso del atributo dependsOnMethods en el @Test anotación:

import org.testng.SkipException; 
import org.testng.annotations.Test; 

public class MyTest { 

    private boolean conditionX = true; 
    private boolean conditionY = false; 

    @Test 
    public void isConditionX(){ 
    if(!conditionX){ 
     throw new SkipException("skipped because of X is false"); 
    } 
    } 

    @Test 
    public void isConditionY(){ 
    if(!conditionY){ 
     throw new SkipException("skipped because of Y is false"); 
    } 
    } 

    @Test(dependsOnMethods="isConditionX") 
    public void test1(){ 

    } 

    @Test(dependsOnMethods="isConditionY") 
    public void test2(){ 

    } 
} 
Cuestiones relacionadas