.NET + xUnit: compartilhando um mesmo objeto entre múltiplas execuções de testes

Renato Groffe
3 min readSep 11, 2022

--

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:

https://github.com/renatogroffe/DotNet6-WorkerService-Kafka-MongoDB-xUnit_ClassFixture-IntegrationTests_Acoes

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

--

--

Renato Groffe
Renato Groffe

Written by Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker

No responses yet