2012-03-14 9 views
11

Me pregunto cuál es la mejor práctica para inicializar variables de instancia en una clase de prueba bajo MSTest. Digamos que tengo una clase de prueba donde hay una gran cantidad de gastos indirectos para burlarse y configurar objetos de apoyo. Solo quiero hacer esto una vez, en lugar de repetir el mismo código en cada prueba. Mi idea era utilizar el método MyClassInitialize para inicializar algunas variables de instancia globales a las que todas las pruebas tenían acceso. De esa forma, inicializo las variables de instancia global una vez y cada una de ellas las usa cuando se ejecutan.MSTest, MyClassInitialize y variables de instancia

Desafortunadamente, el método MyClassInitialize es estático, por lo que no puede inicializar variables de instancia globales. Pensé en hacer las variables de instancia globales estáticas, pero no parece ser la solución correcta. Luego pensé en poner el código de inicialización en un constructor de la clase de prueba, pero algo dentro de mí sigue diciendo que MyClassInitialize es lo que se supone que debo usar. Otro pensamiento sería usar MyTestInitialize ya que ese método no es estático, pero eso crearía el objeto una y otra vez con cada prueba. ¿Es eso apropiado?

¿Existen mejores prácticas para el uso de variables en pruebas donde esas variables solo se deben inicializar una vez antes de ejecutar las pruebas? A continuación se muestra un ejemplo artificial de lo que estoy hablando.

[TestClass()] 
public class ProgramTest 
{ 
    // this object requires extensive setup so would like to just do it once 
    private SomeObjectThatIsUsedByAllTestsAndNeedsInitialization myObject; 
    private TestContext testContextInstance; 

    [ClassInitialize()] 
    public static void MyClassInitialize(TestContext testContext) 
    { 
     // initializing SomeObjectThatIsUsedByAllTestsAndNeedsInitialization clearly will 
     // not work here because this method is static. 
    } 

    [TestMethod()] 
    public void Test1() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 

    [TestMethod()] 
    public void Test2() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 

    [TestMethod()] 
    public void Test3() 
    { 
     // use SomeObjectThatIsUsedByAllTestsAndNeedsInitialization here 
    } 
} 

Respuesta

8

Utilice [TestInitialize] y [TestCleanup] siempre que sea posible. Una prueba unitaria debe ser rápida y aislada, por lo que la forma más limpia es inicializar y limpiar cada prueba. Esto garantiza que los resultados de una prueba no estén influenciados por otra prueba. Cuando la inicialización de una prueba lleva mucho tiempo, es probable que no haya realizado una prueba unitaria sino una prueba de integración.

La excepción son las pruebas de integración que van a la base de datos u otro recurso, es posible que desee ejecutar una operación una vez y luego verificar el resultado con múltiples aserciones (TestMethods). Solía ​​tener una clase genérica específica con un tipo de contexto que solo se inicializa una vez por clase. Pero ahora creo que esto es excesivo, y simplemente pongo las dependencias y los resultados en variables privadas estáticas.

1

Puede utilizar la inicialización diferida de una variable de instancia en alguna otra clase. Sin embargo, no olvides que MSTest creará una nueva instancia de la clase de prueba para cada método de prueba que ejecute. Entonces, cualquier variable de esa clase que desee persistir en los métodos de prueba debería ser estática.

3

¿Cuál es su problema con la estática?

Si su ObjectThatIsUsedByAllTests realmente puede ser 100% compartido entre todas sus pruebas, entonces hágalo estático y use ClassInitialize - para eso es.

Si no es así, debe inicializarlo para cada prueba, que es para lo que TestInitialize es.

+1

Realmente no puedo cuantificar mi problema con la estática. Simplemente no se "siente" bien, pero no puedo explicar por qué. – meyousikmann

+0

Estático significa que pertenece a la clase. Las cosas que no son estáticas son propiedad de instancias de la clase. Al tratar de determinar si algo debe ser estático, pregúntese: "¿Es propiedad de la clase como un todo o solo una instancia?". – Tristan

Cuestiones relacionadas