¿Es posible ejecutar código una vez antes de que se ejecuten todas las pruebas?

112

Básicamente, me gustaría decirle a MSTest que ejecute un poco de código antes de iniciar una serie de ejecuciones de prueba, esencialmente lo que me gustaría hacer es lo mismo que insertar un código Main().

La razón por la que me gustaría hacer esto es que me gustaría hacer algunos registros con log4net durante mis ejecuciones de prueba de integración. No puedo simplemente usar el log4net.Config.XmlConfiguratoratributo de ensamblado, ya que cuando lo lee en mi ensamblado de prueba, ya ha llamado LoggerManager. La documentación recomienda configurar log4net explícitamente en el punto de entrada del código, pero ¿dónde está eso en mis pruebas?

Necesito poder ejecutar mis pruebas en TestDriven.NET y MSTest runner.

George Mauer
fuente

Respuestas:

153

FWIW, puede usar el atributo AssemblyInitialize para ejecutar código antes de que se ejecuten todas las pruebas unitarias en un ensamblado:

[TestClass]
public class SetupAssemblyInitializer
{
    [AssemblyInitialize]
    public static void AssemblyInit(TestContext context)
    {
        // Initalization code goes here
    }
}

Si tiene más de un ensamblaje de prueba de unidad, no tengo conocimiento de nada que abarque más de un ensamblaje.

Por lo que yo sé, esto es lo más parecido a un equivalente principal.

Tenga en cuenta que el AssemblyInitializemétodo -decorated debe estar en una TestClassclase -decorated que contenga al menos un TestMethodmétodo -decorated; de lo contrario, no se ejecutará.

Mark Seemann
fuente
1
Tuve un problema similar (solo para MSTest) y funcionó bien. Gracias :)
Oscar Foley
1
Para cualquier otra persona que tenga problemas para que esto funcione tanto desde MsTest como desde TestDriven.NET, puede usar una bandera estática para determinar si ejecutar el código en ClassInitialize (esto no funciona en MsTest).
Carl
7
Nota: El motor de prueba ejecuta un método marcado con el atributo AssemblyInitialize solo si ese método es miembro de una clase marcada con el atributo TestClass.
Jowen
5
@Jowen: El motor de prueba ejecuta un método que está marcado con el atributo AssemblyInitialize solo si ese método es miembro de una clase que está marcada con el atributo TestClass and contains methods that are marked with the TestMethod attribute.
2015
3
El método marcado con AssemblyInitialize se ejecutará en Visual Studio 2015 Ultimate sin otros métodos marcados con los atributos TestMethod.
Chris
63

Para completar, estas son las opciones "ejecutar código antes" para MSTest:

  • Úselo [AssemblyInitialize]para ejecutar código una vez por ensamblado, antes de que se ejecute cualquier prueba en ese ensamblado.
  • Úselo [ClassInitialize]para ejecutar código una vez por clase, antes de cualquier prueba en la clase donde se define el método.
  • Úselo [TestInitialize]para ejecutar código antes de todas y cada una de las pruebas en la clase donde se define el método.
Konamiman
fuente
12
La contraparte de limpieza de estos atributos es el sufijo de limpieza (por ejemplo, ClassCleanup) para operaciones de desmontaje
Yair Nevet
13

Veo esto en el encabezado de MS Test.

// Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext) { }

Esto se ejecutaría antes de las pruebas en una clase.

Parece que desea ejecutar algo antes de todas las pruebas.

También existe la opción de secuencia de comandos de configuración en la configuración de ejecución de prueba.

Maestro1024
fuente
A menos que me falte algo, los scripts de configuración no ayudan a ejecutar el código en el AppDomain de prueba.
George Mauer
2
Probablemente sea yo. No estoy seguro de seguirte cuando dices "código en ejecución en el dominio de aplicación de prueba". Leí su pregunta como si quisiera ejecutar código antes de una serie de pruebas, si era otra cosa diferente. "Los scripts de configuración y de limpieza se ejecutan antes y después de las pruebas, independientemente de los tipos de pruebas que contengan esas pruebas". msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024