2009-03-12 17 views
25

¿Es posible ejecutar un método específico antes de cada prueba en un ensamblaje?MsTest - método de ejecución antes de cada prueba en un ensamblaje

Conozco el atributo TestInitialize pero este atributo tiene "alcance de clase". Si se define en una clase de prueba, se ejecutará antes de cada prueba de esta clase.

Quiero definir un método que se ejecutará antes de cada prueba definida en un conjunto completo.

Respuesta

11

No estoy seguro de que esta característica sea posible en MsTest como en otros frameworks de prueba (por ejemplo, MbUnit).

Si tengo que usar MsTest, estoy resolviendo esto definiendo la clase abstracta TestBase con el atributo [TestInitialize] y cada prueba que necesita este comportamiento deriva de esta clase base. En su caso, cada clase de prueba en su ensamblado debe heredar de esta base ...

Y probablemente haya otra solución, puede hacer su atributo de prueba personalizado, pero aún no lo he intentado ... :)

0

Creo que está buscando el atributo ClassInitialize.

+2

ClassInitialize se ejecuta una vez para toda clase. Entonces, si tenemos 5 pruebas en clase, el método con ClassInitialize se ejecuta una vez. – brzozow

+2

Sí, probablemente quiso decir TestInitialize. –

1

Bueno, ¿no es MSTest instanciando la clase para cada prueba? Esa era mi comprensión de eso. En tal caso, lo que sea que llame desde su constructor es el código de inicialización (por prueba por definición).

EDITAR: Si no funciona (lo que aún creo que debería porque MSTest necesita asegurarse de que las ejecuciones de métodos de prueba individuales estén aisladas), entonces TestInitialize es su atributo. Por cierto, la mejor comparación de pruebas unitarias está disponible en Link on Codeplex

+0

Quiero escribir el código que se ejecutará antes de todas las pruebas en todas las clases de prueba. Entonces su solución solo funcionará en una clase de prueba – brzozow

+0

No, eso no es verdad. Si es cierto que el arnés MSTest instanciará una nueva instancia de clase de prueba por prueba (que creo que es cierto para fines de aislamiento de prueba), entonces el código en el constructor se ejecuta antes de cada método de prueba. –

+0

Es cierto lo que estás escribiendo pero no resuelve mi problema. Quiero restablecer algunas propiedades estáticas antes de cada prueba (sé que es un diseño malo). Tengo 400 clases con Pruebas Unitarias. No quiero escribir ese código en todas las clases. – brzozow

52

[TestInitialize()] es lo que necesita.

private string dir; 

[TestInitialize()] 
public void Startup() 
{ 
    dir = Path.GetTempFileName(); 
    MakeDirectory(ssDir); 
} 

[TestCleanup()] 
public void Cleanup() 
{ 
    ss = null; 
    Directory.SetCurrentDirectory(Path.GetTempPath()); 

    setAttributesNormal(new DirectoryInfo(ssDir)); 
    Directory.Delete(ssDir, true); 
} 


[TestMethod] 
public void TestAddFile() 
{ 
    File.WriteAllText(dir + "a", "This is a file"); 
    ss.AddFile("a"); 
    ... 
} 

[TestMethod] 
public void TestAddFolder() 
{ 
    ss.CreateFolder("a/"); 
    ... 
} 

Esto proporciona una nueva ruta temporal aleatoria para cada prueba, y la elimina cuando termina. Puede verificar esto ejecutándolo en depuración y mirando la variable dir para cada caso de prueba.

+3

El método StartUp se invocará solo antes de ejecutar la prueba desde esta clase. Quiero ejecutar el método antes de todas las pruebas de todas las clases en el ensamblaje – brzozow

+1

FTQ "¿Es posible ejecutar un método específico antes de cada prueba?". Yo respondí eso. Si lo que quiere decir es "un método que se ejecuta una vez, antes de todas las pruebas", entonces su respuesta está aquí: http://stackoverflow.com/questions/639326/mstest-executing-method-before-each-test/639339#639339 – FryGuy

+1

Thx por respuesta. Pero quiero ejecutar el método antes de cada prueba en el ensamblaje, no antes de cada una en una clase específica. Tal vez mi pregunta no fue lo suficientemente clara. – brzozow

Cuestiones relacionadas