2010-03-25 14 views
17

El uso de Visual Studio genera la clase de Unidad de prueba. Luego comenten, el método de inicialización de clase. Dentro, agrega tu propiedad usando el argumento testContext.¿Se pueden usar TestContext.Properties?

Al inicio de la aplicación de prueba, la infraestructura de prueba llama a este método.

//Use ClassInitialize to run code before running the first test in the class 
[ClassInitialize()] 
public static void MyClassInitialize(TestContext testContext) 
{ 
    /* 
    * Any user defined testContext.Properties 
    * added here will be erased after this method exits 
    */ 
    testContext.Properties.Add("key", 1) ; // place the break point here 
} 

Después de salir de MyClassInitialize, se pierden todas las propiedades agregadas por el usuario. Solo quedan los 10 "oficiales".

En realidad, TestContext se sobrescribe, con el inicial ofical, cada vez que se llama a cada método de prueba. No se sobrescribe solo si el usuario tiene un método de inicialización de prueba, los cambios realizados allí se pasan a la prueba.

//Use TestInitialize to run code before running each test 
[TestInitialize()]public void MyTestInitialize(){ 
    this.TestContext.Properties.Add("this is preserved",1) ; 
} 

Esto significa que TestContext.Properties es "principalmente" de solo lectura, para los usuarios. Que no está claramente documentado en MSDN.

Me parece que este es un diseño muy complicado + implementación. ¿Por qué tener TestContext.Properties como colección, en absoluto? Los usuarios pueden hacer muchas otras soluciones para tener una inicialización de toda la clase.

+2

Nunca he entendido el propósito del contexto de prueba que realmente lo usaría. –

+0

El propósito se explica en https://blogs.msdn.microsoft.com/vstsqualitytools/2006/01/09/using-testcontext-in-unit-tests/ –

Respuesta

1

Creo que tiene que conservar una copia del TestContext o se saldrá del alcance.

añadí:

private TestContext _tc; 

y se añade al Inicializar

tc = testContext; 

Cuando miro tc de una de las pruebas que contiene la propiedad recién agregado.

+2

Esto no funcionará en el contexto de una clase de unidad de prueba generada por Estudio visual. Un resonancia muy obvio es que el método de inicialización en mi publicación inicial es estático. Según lo generado por Visual Studio. –

11

TestContext es único para cada prueba, por lo que su inicialización en ClassInitialize no funcionará. Solo debe usarlo para los métodos TestInitialize, TestCleanup y TestMethod.

This post hace un buen trabajo al explicar cómo se ejecutan las pruebas de una clase, incluido el subprocesamiento.

Dicho esto, no he encontrado un uso todavía para el TestContext pero soy nuevo en MSTest. Acepto que la documentación de MSDN es confusa. Tener todos los métodos de muestra escribiendo en la consola o arrojar un cuadro de mensaje no representa las posibilidades.

+1

estuvo de acuerdo, pero ... el punto que estoy señalando es que (la peor) implementación es confusa porque (mucho peor) se basa en un diseño que es confuso. El resultado es el error, que se vende como una "característica". –

+0

No sé sobre el estado de las cosas hace dos años, pero este método de agregar propiedades en TestInitialize no funciona. Se lanza una excepción con el mensaje "Ya se ha agregado un elemento con la misma clave".Entonces, ClassInitialize pasa un TestContext completamente diferente, pero todas las pruebas obtienen el mismo TestContext ... – Amanduh

0

El TestContext se utiliza para pasar información a sus pruebas desde el exterior. A través del ejecutor de prueba o un archivo .runsettings, por lo general, los datos van en una dirección.

Cuestiones relacionadas