.net - test - Inicialización global de NUnit: ¿mala idea?
unit test c# ejemplo (4)
Necesitamos algún código de configuración global de una sola vez en nuestro conjunto de pruebas. Podemos hacerlo más de una vez, pero lleva bastante tiempo.
Es requerido por todos los dispositivos para que
[TestFixtureSetUp]
no funcione. Tiene que ejecutarse antes de todo el código[TestFixtureSetUp]
.Póngalo en
Main()
ya que mantenemos los ensambles de prueba como ejecutables. Sin embargo,Main
no se ejecuta bajo el cliente GUI.Crear una clase separada con un constructor estático para la inicialización solo funciona cuando haces referencia a la clase que no favorecemos en todas y cada una de las clases.
Heredar todos los dispositivos de prueba de una clase base y agregarle un constructor estático genera múltiples llamadas al código de inicio.
Ahora dadas las circunstancias, tengo dos preguntas:
1) ¿La "configuración global" es una muy mala idea de que no es compatible con NUnit?
2) ¿Cuál es la forma menos dolorosa y más común de lograr esto?
1) Supongo que depende del contexto. Nunca he necesitado una configuración global en ningún proyecto, pero puedo imaginar escenarios, por ejemplo, una aplicación que solo lee datos y una configuración de datos global común.
2) Usted puede hacer que su configuración global, por ejemplo, en la base del dispositivo que menciona, sea estable. Es decir, tiene una propiedad HasRun o similar que se comprueba antes de la ejecución.
Como mencioné en mi comentario, puede lograr una configuración amplia de ensamblaje utilizando un SetUpFixture ubicado en el nivel de ensamblaje. Necesitaba esto para apagar la IU en el oyente de seguimiento predeterminado:
[SetUpFixture]
public class AssemblySetup
{
[SetUp]
public void Setup()
{
var traceListener = Debug.Listeners.Cast<TraceListener>().FirstOrDefault(listener => listener is DefaultTraceListener) as DefaultTraceListener;
if (traceListener != null)
traceListener.AssertUiEnabled = false;
}
}
Más sobre ensamblaje o configuración del espacio de nombres: http://www.nunit.org/index.php?p=setupFixture&r=2.4
Nota: Como señalaron otros, no use esto para corromper el aislamiento entre sus pruebas.
No creo que haya una manera agradable y construida de lograrlo desafortunadamente, probablemente porque NUnit está destinado a ser usado principalmente para pruebas unitarias, y no debería necesitar ninguna configuración global para las pruebas unitarias (todo debe ser burlado localmente en cada accesorio de prueba).
Sin embargo, es bastante común usar NUnit para pruebas de integración, y allí es muy común tener una configuración global, como en su caso. Hay algunas opciones razonables aquí:
En mi proyecto actual generalmente lo hacemos en el script msbuild que ejecuta las pruebas. Los beneficios son que no necesita recordar acerca de una configuración especial cuando escribe nuevas pruebas. Lo malo: debes asegurarte de que tienes todo configurado cuando ejecutas las pruebas desde IDE.
Si lo anterior no es una opción, puede usar su última idea: heredar las pruebas de una clase base común. La clase base podría entonces hacer referencia a una clase singleton (puede encontrar, por ejemplo, el artículo de Jon Skeets sobre cómo implementar un singleton), que haría la configuración. De esta forma se ejecutará solo una vez.
[SetUpFixture]
Este es el atributo que marca una clase que contiene los métodos únicos de configuración o desmontaje para todos los dispositivos de prueba bajo un espacio de nombres dado.
El método SetUp en un SetUpFixture se ejecuta una vez antes de cualquiera de los dispositivos incluidos en su espacio de nombres. El método TearDown se ejecuta una vez después de que todos los dispositivos han completado la ejecución.
Inicialización de todo el conjunto. Si no coloca la clase en ningún espacio de nombre, se aplicará a todas las pruebas en el ensamblaje.
p.ej.
// using statements
[SetUpFixture]
public class GlobalSetup {
[SetUp]
public void ShowSomeTrace() {
Trace.WriteLine("It works..."); // won''t actually trace
}
}