2011-05-23 17 views
30

¿Tiene TestNG algo así como @Rule? Me refiero específicamente sobre: ​​¿TestNG es compatible con @Rule de JUnit4?

@Rule public TemporaryFolder folder = ... 

O incluso

@Rule public MethodRule globalTimeout = new Timeout(20); 

Soy consciente de que puedo aplicar manualmente estas cosas usando setUp() y tearDown() equivalentes, pero estos no me dan la comodidad que consigo usando @Rule.

+0

Encontré una discusión sobre el grupo de google testng-dev y alguien ha implementado esta característica. Aquí está la discusión: https://groups.google.com/forum/#!topic/testng-dev/RounLOTz_UU y el repositorio github con la función: https://github.com/wolfs/testng-rules –

Respuesta

4

Las reglas son bastante fáciles de imitar, por ejemplo, con clases de super:

public void Base { 
    @BeforeMethod 
    public void createTempDir() { ... } 

    @AfterMethod 
    public void deleteTempDir() { ... } 
} 

public void MyTest extends Base { 
    @Test 
    ... 
} 

Si se extiende la base, un directorio temporal siempre se crea automáticamente y luego se borra.

La ventaja de este enfoque sobre las Reglas es que las Reglas siempre tienen un alcance de clase, mientras que con TestNG, puede implementarlas en torno a métodos, pruebas, clases, grupos e incluso suites.

+14

Muchas gracias por la respuesta. Pero lo que tomo de él es que _TestNG no admite una construcción equivalente_. Sé que puedo usar los métodos _setUp() _-like y _tearDown() _-like para crear una carpeta temporal o establecer un tiempo de espera para cada prueba en la clase anotando cada método, pero esto deja de lado la conveniencia de resolver cada uno de estos problemas con una declaración de parámetro único. – Francisco

+10

... sin mencionar que solo puedes tener una súper clase en contraste con los campos. Las reglas se pueden compartir y componer, la herencia no. – whiskeysierra

+15

Esto es muy ingenuo. ¡Un marco de prueba popular como TestNG debería ofrecer más! Los problemas surgen cuando tiene muchos recursos, y quiere que * todos * se cierren limpiamente. Con @Rule, cualquier excepción lanzada al cerrar un recurso se captura automáticamente (lo intenté en JUnit 4.12) para que se puedan ejecutar todos los bloqueadores de recursos. Con @AfterMethod debes hacerlo tú solo, por ejemplo, con una cadena de try/catch. Ver ejemplo de código en gist http://git.io/vUNnM Conclusión: '@ Rule' y' @ AfterMethod' NO son equivalentes. Por cierto, esta es una de las razones por las que creo que JUnit debería preferirse a TestNG. –

0

BeforeClass/AfterClass de TestNG puede simular algo parecido a la rule/ruleClass de JUnit, pero hay algunas funciones y efectos que estas clases no puede replicar, tales como: la repetición, filtro, etc.

Sin embargo, hay algunas interfaces proporcionadas por TestNG que podrían usarse para simular estas funciones, por ejemplo IAnnotationTransformer, IMethodInterceptor.