2009-10-30 11 views
7

Tengo una prueba de unidad que prueba si se lanza una excepción, pero esta excepción solo se aplica en el modo de depuración (a través del atributo [Conditional ("DEBUG")]). Si ejecuto esta prueba en el modo de lanzamiento, falla. Intenté aplicar el mismo atributo en la prueba, pero no se tuvo en cuenta.¿Cómo puedo hacer una prueba unitaria en modo DEBUG solamente?

¿Cómo puedo excluir una prueba en el modo de lanzamiento? ¿Tiene sentido ejecutar pruebas unitarias en el modo de lanzamiento o debería seguir el modo de depuración?

+0

relacionadas: http: //stackoverflow.com/questions/3133988/make-mstest-respect-conditional-attribute –

Respuesta

10

En cuanto a la mayoría de su pregunta, depende en cierta medida de qué herramienta de prueba de unidad esté utilizando. Sin embargo, en general, lo que quiere son preprocessor directives

//C# 
#ifndef DEBUG 
    //Unit test 
#endif 

Tal vez por su situación

//C# - for NUnit 
#if !DEBUG 
    [Ignore("This test runs only in debug")] 
#endif 

Pero en cuanto a si se debe dejar pruebas de unidad en la versión de lanzamiento? Daría un NO rotundo. Sugeriría mover todas las pruebas unitarias en su propio proyecto y NO incluir esto en sus lanzamientos.

+0

Por supuesto, todas mis pruebas unitarias están en otro proyecto, pero aún puedo ejecutarlas en modo Release ... –

+0

¿Por qué querrías realmente que fueran diferentes en versión y depuración? –

+0

Quiero asegurarme de que el código se comportará igual en Debug y en modo Release. Pero en este caso particular, * sé * que la prueba fallará en el modo Release ya que la Excepción solo debe lanzarse en modo Debug (por diseño) –

5

Prueba esto:

#if DEBUG 

// here is your test 

#endif 
+0

Esto funciona, pero creo que es una solución demasiado drástica. En su lugar, utilicé el atributo [Ignorar] (aún está dentro de un #if! DEBUG ... #endif, pero me gusta más). –

3

Si está utilizando NUnit, usted puede hacer sus métodos de prueba unidad condicional:

[System.Diagnostics.Conditional("DEBUG")] 
public void UnitTestMethod() 
{ 
    // Tests here 
} 

De esta manera, sólo se ejecutará en versiones de depuración. No tengo mucha experiencia con las pruebas de unidades de Visual Studio, pero estoy bastante seguro de que esto también debería funcionar en VS.

EDIT: Otros han mencionado las directivas de compilación condicional. No creo que sea una muy buena idea, por varias razones. Para obtener más información sobre las diferencias entre las directivas de compilación condicional y el atributo condicional, lea Eric Lippert's excellent article here.

+2

Estoy usando MSTest y parece que el atributo de condición no es respetado por el motor de prueba ... –

+0

Puede poner el atributo condicional en un método de ayuda DoUnitTestMethod, al que llamaría desde UnitTestMethod. Esto se convertiría en una prueba vacía que siempre pasa en modo Liberación. Sin embargo, se vuelve más complicado con cosas como [ExpectedException]. Lo más simple es utilizar #if DEBUG en todo el caso de prueba. – yoyo

0

Si está utilizando XUnit, puede utilizar el siguiente método as described by Jimmy Bogard extendiendo el atributo dato:

public class RunnableInDebugOnlyAttribute : FactAttribute 
{ 
    public RunnableInDebugOnlyAttribute() 
    { 
     if (!Debugger.IsAttached) 
     { 
      Skip = "Only running in interactive mode."; 
     } 
    } 
} 

y entonces usted puede utilizar esto como sigue:

[RunnableInDebugOnly] 
public void Test_RunOnlyWhenDebugging() 
{ 
    //your test code 
} 
Cuestiones relacionadas