Esta pergunta é sobre o framework de teste de unidade xUnit.net .
Preciso executar algum código antes que qualquer teste seja executado e também algum código depois que todos os testes forem feitos. Achei que deveria haver algum tipo de atributo ou interface de marcador para indicar a inicialização global e o código de terminação, mas não consegui localizá-los.
Como alternativa, se eu invocar xUnit programaticamente, também posso conseguir o que desejo com o seguinte código:
static void Main()
{
try
{
MyGlobalSetup();
RunAllTests(); // What goes into this method?
}
finally
{
MyGlobalTeardown();
}
}
Alguém pode me fornecer uma dica sobre como declarativamente ou programaticamente executar algum código de configuração / desmontagem global?
Respostas:
Até onde eu sei, o xUnit não tem um ponto de extensão global de inicialização / desmontagem. No entanto, é fácil criar um. Basta criar uma classe de teste base que implemente
IDisposable
e faça sua inicialização no construtor e sua desmontagem noIDisposable.Dispose
método. Isso ficaria assim:No entanto, a configuração da classe base e o código de desmontagem serão executados para cada chamada. Isso pode não ser o que você deseja, pois não é muito eficiente. Uma versão mais otimizada usaria a
IClassFixture<T>
interface para garantir que a funcionalidade global de inicialização / desmontagem seja chamada apenas uma vez. Para esta versão, você não estende uma classe base de sua classe de teste, mas implementa aIClassFixture<T>
interface ondeT
se refere à sua classe de fixture:Isso fará com que o construtor
TestsFixture
seja executado apenas uma vez para cada classe em teste. Portanto, depende do que você deseja escolher exatamente entre os dois métodos.fonte
[Collection("<name>")]
atributoEu estava procurando a mesma resposta e, neste momento, a documentação do xUnit é muito útil no que diz respeito a como implementar Fixtures de classe e Fixtures de coleção que fornecem aos desenvolvedores uma ampla gama de funcionalidade de configuração / desmontagem no nível de classe ou grupo de classes. Isso está de acordo com a resposta de Geir Sagberg e fornece uma boa implementação do esqueleto para ilustrar como deve ser.
https://xunit.github.io/docs/shared-context.html
fonte
Collection
atributo para que a configuração "global" ocorra. Isso significa que, se você tem algo que deseja configurar antes de -any- test ser executado, você precisa decorar -all- test classes com este atributo. Isso é muito frágil na minha opinião, pois esquecer de decorar uma única classe de teste pode levar a erros que são difíceis de rastrear. Seria bom se o xUnit criasse uma forma de configuração e desmontagem verdadeiramente global.Existe uma solução fácil e fácil. Use o plugin Fody.ModuleInit
https://github.com/Fody/ModuleInit
É um pacote nuget e quando você o instala, ele adiciona um novo arquivo chamado
ModuleInitializer.cs
ao projeto. Há um método estático aqui que é inserido na montagem após a construção e é executado assim que a montagem é carregada e antes de qualquer coisa ser executada.Eu uso isso para desbloquear a licença do software para uma biblioteca que comprei. Eu estava sempre me esquecendo de desbloquear a licença em cada teste e até mesmo esquecendo de derivar o teste de uma classe base que iria desbloqueá-lo. As faíscas brilhantes que escreveram esta biblioteca, em vez de dizer que ela estava com licença bloqueada, introduziram erros numéricos sutis que fazem com que os testes falhem ou passem quando não deveriam. Você nunca saberia se desbloqueou corretamente a biblioteca ou não. Então agora meu módulo de inicialização parece
e todos os testes colocados nesta montagem terão a licença desbloqueada corretamente para eles.
fonte
Para compartilhar o código SetUp / TearDown entre várias classes, você pode usar o CollectionFixture do xUnit .
Citar:
fonte