.NET + xUnit: compartilhando um mesmo objeto entre múltiplas execuções de testes
Embora muitos Desenvolvedores .NET não se atentem a essa característica, cada execução de um novo teste implementado com xUnit levará à instanciação de sua classe correspondente. Este é o comportamento default quando trabalhamos com xUnit como framework principal na automação de testes, o que se traduz na geração de múltiplas instâncias de uma mesma classe (mediante o processamento dos vários testes que constituam a mesma).
Tomemos por base o exemplo da listagem a seguir, com os testes de integração de um Worker Service que consome dados de um tópico do Apache Kafka e realiza a persistência destes em uma Collection do MongoDB. A classse TestesIntegracaoWorkerAcoes será instanciada a cada nova execução do método TestarWorkerService, estando previstas 3 execuções em virtude do uso dos atributos Theory e InlineData (cada utilização de InlineData representa um diferente caso de teste):
Mas e se precisarmos executar alguma forma de inicialização, gerando uma instância criada uma única vez que sirva como um objeto de contexto e mantenha estados ao longo das múltiplas execuções dos testes que compõem uma classe baseada no uso do xUnit?
A resposta a tal questão está em uma estrutura oferecida pelo xUnit e conhecida como Class Fixture.
No exemplo a seguir temos o código que implementa o tipo WorkerAcoesFixture:
- No construtor de WorkerAcoesFixture foram geradas instâncias de IConfiguration e de uma Collection do MongoDB, objetos estes associados a propriedades de WorkerAcoesFixture e que serão utilizadas em cada teste definido na classe TestesIntegracaoWorkerAcoes. Através de AcaoCollection foi inclusive acionado o método DeleteMany, de forma a excluir eventuais documentos previamente existentes nessa estrutura;
- Opcionalmente podemos implementar a interface IDisposable, a fim de possibilitar uma eventual liberação de recursos utilizados durante a execução dos testes. No método Dispose um valor null é associado à propriedade AcaoCollection;
- A propriedade somente leitura Id é do tipo Guid, armazenando um valor que mostrará que a mesma instância de WorkerAcoesFixture foi mantida durante as 3 execuções de testes especificados em TestesIntegracaoWorkerAcoes.
Já a classe TestesIntegracaoWorkerAcoes implementa a interface genérica IClassFixture (namespace Xunit), referenciando para isto o tipo WorkerAcoesFixture (linha 14):
- O construtor de TestesIntegracaoWorkerAcoes receberá instâncias de ITestOutputHelper (para o print de logs via testes do xUnit) e WorkerAcoesFixture;
- As propriedades Configuration e AcaoCollection de WorkerAcoesFixture serão utilizadas pelo método TestarWorkerService. Já a propriedade Id terá seu valor vinculado a logs gerados com a instância do tipo ITestOutputHelper.
Chegamos então ao resultado da execução deste projeto de exemplo via Test Explorer, em que se nota que o Id para a instância de WorkerAcoesFixture se repetiu para os 3 testes da classe TestesIntegracaoWorkerAcoes:
Esse projeto foi disponibilizado como um repositório no GitHub:
Caso achem útil a solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!
E concluo este artigo com um convite…
Segunda 26/09 às 21:00 — horário de Brasília — teremos mais um evento online e gratuito no canal Canal .NET.
Uma nova live abordando dicas e truques úteis em vários cenários envolvendo o teste de aplicações .NET. Ao longo da apresentação serão demonstrados exemplos utilizando vários frameworks e a integração com soluções como Azure DevOps e GitHub Actions, bem como orientações sobre como automatizar os testes, o build e o deployment de seus projetos!
Faça sua inscrição em:
https://bit.ly/live-testes-dotnet-dicas-truques-3aed