2011-06-07 8 views
6

Estoy usando MSTest en Visual Studio 2008 con C#. Tengo una variable de entorno específica que me gustaría y una modificación de ruta que me gustaría hacer solo durante la ejecución de pruebas específicas o mejor aún todas las pruebas dentro de una configuración de ejecución.¿Puede establecer variables de entorno temporales para las configuraciones de ejecución MSTest?

He intentado utilizar el script de configuración de ejecución de prueba para hacer esto, pero como esperaba, dado que es un archivo por lotes, los cambios se pierden una vez que se cierra, por lo que no funcionarán.

¿Hay alguna otra manera de configurar variables temporales de entorno del sistema que serán válidas durante todas las pruebas que se ejecutan?

+0

¿Está ejecutando MSTest desde la línea de comandos (Dos/PowerShell)? ¿O desde Visual Studio? – Rob

+0

Desde Visual Studio 2008, disculpe si eso no estaba claro. Usar el Run Runner predeterminado, etc. –

Respuesta

4

Si bien no estoy contento con esta solución, pude obtener lo que necesitaba con MSTest al usar ClassInitializeAttribute para una clase de prueba, y luego usar Environment.SetEnvironmentVariable para hacer los cambios que necesito, y luego limpiar esto en el método decorado con el ClassCleanupAttribute.

Con la falta de una mejor respuesta, así fue como pude obtener variables de entorno para un grupo de pruebas y limpiarlo cuando terminé. Sin embargo, hubiera preferido que esto se maneje fuera del CÓDIGO y sea parte de la configuración de la prueba de alguna manera. Independientemente de los problemas se ha resuelto.

1

Si confía en que su conjunto de pruebas no será "abortado" a mitad de la prueba, puede utilizar los métodos FixtureSetup y FixtureTeardown para establecer y luego eliminar sus variables de entorno modificadas.

EDITAR DEL COMENTARIO: Veo de dónde vienes, pero como en mi edición, se ha diseñado un marco UT para crear pruebas unitarias. El concepto de una prueba unitaria dicta que NO debe depender de ningún recurso externo, incluidas las variables de entorno. Las pruebas que hacen esto son pruebas de integración, y requieren una gran cantidad de infraestructura para estar en su lugar (y, por lo general, toman muchas veces más tiempo que un conjunto de pruebas unitarias de igual LOC).

Para crear una unidad pruebe el código que depende de una variable de entorno, considere dividir las líneas de código que realmente examinan las variables de entorno directamente. y poner eso en un método en otra clase, luego simular esa clase usando RhinoMocks o lo que sea para proporcionar un valor "ficticio" para las pruebas sin examinar (o cambiar) las variables de entorno reales.

Si esto realmente es una prueba de integración y realmente necesita la variable de entorno establecida (digamos que está cambiando la ruta para que pueda usar Process.Start para llamar a su propio notepad.exe en lugar de Windows), eso es lo que Los métodos/atributos FixtureSetup y FixtureTeardown son para; realizar una configuración complicada de un entorno fijo y repetible en el que las pruebas deberían tener éxito, y luego restablecer el entorno tal como estaba, independientemente de lo que haya sucedido en las pruebas. Normalmente, una falla de prueba arroja una excepción y finaliza la ejecución de la prueba inmediatamente, por lo que no se garantiza la ejecución del código al final del método de prueba.

+0

Parece una forma peor de hacerlo. Parece que un trabajo de marco de Prueba de unidad debe admitir algún método fuera del CÓDIGO para agregar variables temporales de entorno que desaparecerán al final de la prueba o las pruebas. También requiere cambiar un montón de código si cambian los datos asignados a la variable. –

+1

¿Cómo propone un marco de pruebas unitarias, que está diseñado en torno al concepto de que las pruebas unitarias NO deben tocar o depender de recursos externos, modificar los recursos externos? – KeithS

+0

Sugiero que tengan en cuenta cosas que están fuera de nuestro control. Las bibliotecas de terceros que usamos a veces hacen cosas estúpidas que requieren basura como esta.La prueba unitaria no es solo una forma o la carretera, sino que debe ser flexible, y un marco de "PRUEBA" no debe ser exclusivo para "pruebas unitarias" de todos los tipos de pruebas, desde integración hasta continua, y más debe ser respaldado por un " Prueba "marco. –

Cuestiones relacionadas