É possível executar o código uma vez antes de todos os testes serem executados?

112

Basicamente, gostaria de dizer ao MSTest para executar um pouco de código antes de iniciar uma série de execuções de teste, essencialmente o que eu gostaria de fazer é a mesma coisa que inserir algum código Main().

O motivo pelo qual eu gostaria de fazer isso é que eu gostaria de fazer algum registro com log4net durante minhas execuções de teste de integração. Não posso simplesmente usar o log4net.Config.XmlConfiguratoratributo assembly, pois no momento em que ele o lê em meu assembly de teste, ele já foi chamado LoggerManager. A documentação recomenda configurar o log4net explicitamente no ponto de entrada do código - mas onde está isso em meus testes?

Eu preciso ser capaz de executar meus testes em TestDriven.NET e MSTest runner.

George Mauer
fonte

Respostas:

153

FWIW, você pode usar o atributo AssemblyInitialize para executar o código antes que todos os testes de unidade em um assembly sejam executados:

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

Se você tiver mais de um assembly de teste de unidade, não estou ciente de nada que englobe mais de um assembly.

Pelo que eu sei, isso é o mais próximo que você pode chegar de um equivalente em Main.

Observe que o AssemblyInitializemétodo -decorado deve estar em uma TestClassclasse -decorado que contém pelo menos um TestMethod-método decorado, caso contrário, ele não será executado!

Mark Seemann
fonte
1
Eu tive problema semelhante (apenas para MSTest) e funcionou bem. Obrigado :)
Oscar Foley
1
Para qualquer outra pessoa que tenha problemas para fazer isso funcionar tanto no MsTest quanto no TestDriven.NET, você pode usar um sinalizador estático para determinar se deve executar o código em ClassInitialize (isso não funciona em MsTest).
Carl
7
Observação: o mecanismo de teste executa um método marcado com o atributo AssemblyInitialize apenas se esse método for membro de uma classe marcada com o atributo TestClass.
Jowen,
5
@Jowen: o mecanismo de teste executa um método marcado com o atributo AssemblyInitialize apenas se esse método for membro de uma classe marcada com o atributo TestClass and contains methods that are marked with the TestMethod attribute.
01 de
3
O método marcado com AssemblyInitialize será executado no Visual Studio 2015 Ultimate sem outros métodos marcados com atributos TestMethod.
Chris
63

Para conclusão, estas são as opções de "executar código antes" para MSTest:

  • Use [AssemblyInitialize]para executar o código uma vez por assembly, antes de qualquer teste nesse assembly ser executado.
  • Use [ClassInitialize]para executar o código uma vez por classe, antes de qualquer teste na classe onde o método é definido.
  • Use [TestInitialize]para executar o código antes de cada teste na classe onde o método é definido.
Konamiman
fonte
12
A contrapartida de limpeza desses atributos é o sufixo de limpeza (por exemplo, ClassCleanup) para operações de desmontagem
Yair Nevet
13

Eu vejo isso no cabeçalho do MS Test.

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

Isso seria executado antes dos testes em uma classe.

Parece que você deseja executar algo antes de todos os testes.

Também existe a opção de script de instalação na configuração de execução de teste.

Maestro1024
fonte
A menos que esteja faltando alguma coisa, os scripts de configuração não ajudam a executar o código no AppDomain de teste.
George Mauer
2
Provavelmente sou eu. Não tenho certeza se estou seguindo você quando você diz "executando código no AppDomain de teste.". Eu li sua pergunta como se eu quisesse executar código antes de uma série de testes, se fosse outra coisa diferente. "Os scripts de instalação e de limpeza são executados antes e depois da execução do teste, independentemente dos tipos de testes contidos nessas execuções." msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024