2011-11-23 14 views
5

Estoy escribiendo muchas pruebas de unidad en VS 2010 con Microsoft Test. En cada clase de prueba que tengo muchos métodos de prueba similares a continuación:¿Cuál es la mejor manera de evitar intentar ... atrapar ... finalmente ... en mis pruebas unitarias?

[TestMethod] 
public void This_is_a_Test() 
{ 
    try 
    { 
    // do some test here 
    // assert 
    } 
    catch (Exception ex) 
    { 
    // test failed, log error message in my log file and make the test fail 
    } 
    finally 
    { 
    // do some cleanup with different parameters 
    } 
} 

Cuando cada método de prueba se verá así me quedé Es un poco feo. Pero hasta ahora no he encontrado una buena solución para hacer que mi código de prueba esté más limpio, especialmente el código de limpieza en el bloque finally. ¿Podría alguien aquí darme algunos consejos sobre esto?

Gracias de antemano.

Respuesta

6

Si realmente desea manejar y excepciones, mientras que la ejecución de pruebas de registro se puede concluir esta plantilla estándar en un método de ayuda y utilizar como se muestra a continuación [*].

Pero si excepciones es una parte del caso de prueba que esto es un enfoque equivocado y se debe utilizar facilidades proporcionadas por un marco de prueba, por ejemplo NUnit proporciona tales ayudantes para probar excepciones:

Assert.Throws<ExceptionType>(() => { ... code block... }); 
Assert.DoesNotThrow(() => { ... code block... }); 

Y para hacer limpieza especial Atributos de método como [TestCleanup] y [TestInitialize] para probar la inicialización y la limpieza automáticamente mediante un marco de prueba.

[*] La idea es envolver el cuerpo de prueba en un delegado y pasar al auxiliar que realiza realmente la ejecución de pruebas envuelto en el bloque try/catch:

// helper 
public void ExecuteTest(Action test) 
{ 
    try 
    { 
    test.Invoke(); 
    } 
    catch (Exception ex) 
    { 
    // test failed, log error message in my log file and make the test fail 
    } 
    finally 
    { 
    // do some cleanup with different parameters 
    } 
} 

[TestMethod] 
public void This_is_a_Test_1() 
{ 
    Action test =() => 
    { 
     // test case logic 
     // asserts 
    }; 

    this.ExecuteTest(test); 
} 
+0

Gracias por la respuesta, me darán la solución de un intento. –

1

Borrar todos try-Catch por último (especialmente la captura no sólo es innecesario, sino incluso perjudicial, no se debe coger una excepción cuando se prueba) y hacer la limpieza en el método tearDown (sin embargo es que se haga en la EM de prueba, que presumiría que habrá algo así como [TearDownMethod] o [ FixtureTearDown] o algo así).

+0

Necesito finalmente bloquear para hacer las limpiezas al menos porque cada método de prueba tiene algo diferente que limpiar. –

+0

Es ese caso, sí. Si necesita la limpieza en absoluto. Las pruebas se ejecutan en separación. Y si inteligentemente los separa en accesorios, donde realiza una configuración común y limpieza común, rara vez necesita este patrón. Te lo digo por mi experiencia. ¿Me puede dar un ejemplo de lo que necesita para limpiar? (y espero que comprenda que las excepciones que no están diseñadas para ser capturadas se registran a mano, pero están diseñadas para que el corredor de pruebas las detecte y vea si se trata de una falla o un error, por lo que las partes de 'captura' estaban realmente en contra de cómo deben ser las pruebas unitarias). –

+0

En el bloque catch, quiero registrar los mensajes de error en un lugar central que definí para su revisión. En el bloque finally necesito limpiar algunos datos generados dinámicamente en la base de datos. Solo algunos datos son comunes para algunos métodos de prueba. –

Cuestiones relacionadas