xUnit e estrutura de testes
ResumoxUnit é o framework de testes mais usado no .NET moderno. Um teste é um método
[Fact]que segue o padrão AAA (Arrange, Act, Assert). A CLI executa tudo comdotnet test.
1. Objetivos de Aprendizagem#
- Criar um projeto de teste com xUnit.
- Escrever testes com
[Fact]no padrão AAA. - Executar testes com
dotnet test.
2. Pré-requisitos#
- Solutions e referências (Módulo 02).
3. Conceito#
Um teste automatizado verifica, por código, que uma unidade se comporta como esperado. Benefícios: pega regressões cedo, documenta o comportamento e dá confiança para refatorar.
O padrão AAA:
- Arrange: prepara os dados e o objeto sob teste.
- Act: executa a ação testada.
- Assert: verifica o resultado.
[Fact] marca um teste sem parâmetros. O porquê de testar unidades: falhas ficam localizadas e o feedback é rápido.
4. Mão na Massa#
4.1. Setup#
dotnet new xunit -n Catalog.Tests
Referencie o projeto sob teste:
dotnet add Catalog.Tests reference Catalog.Domain
4.2. Implementação Passo a Passo#
- Código sob teste (no projeto de produção):
public class CalculadoraPreco
{
public decimal ComDesconto(decimal preco, decimal percentual)
{
if (percentual is < 0 or > 1)
throw new ArgumentOutOfRangeException(nameof(percentual));
return preco * (1 - percentual);
}
}
- Teste com
[Fact](padrão AAA):
using Xunit;
public class CalculadoraPrecoTests
{
[Fact]
public void ComDesconto_AplicaPercentualCorretamente()
{
// Arrange
var calc = new CalculadoraPreco();
// Act
var resultado = calc.ComDesconto(100m, 0.1m);
// Assert
Assert.Equal(90m, resultado);
}
}
4.3. Executando#
dotnet test
5. Exemplo Completo#
O teste ComDesconto_AplicaPercentualCorretamente segue AAA e falharia imediatamente se alguém quebrasse a lógica de desconto — uma rede de segurança para refatorações futuras.
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
| Um comportamento por teste | Testes que verificam dez coisas ao mesmo tempo |
| Nomes descritivos (Método_Cenário_Esperado) | Nomes como Teste1 |
| Manter testes rápidos e independentes | Testes que dependem de ordem ou de estado global |
NotaxUnit cria uma nova instância da classe de teste para cada
[Fact], garantindo isolamento entre testes. Use o construtor para o "arrange" comum.
7. Segurança e Produção#
- Testes rápidos e determinísticos rodam em cada commit no CI, barrando regressões antes do deploy — parte essencial de um pipeline confiável.
8. Exercícios#
- Fácil: escreva um teste que verifica uma soma.
- Médio: teste que um método lança exceção com
Assert.Throws. - Desafio: crie a
CalculadoraPreco, cubra o caminho feliz e o de erro, e rodedotnet test.
9. Resumo#
xUnit estrutura testes em métodos [Fact] seguindo AAA (Arrange, Act, Assert). dotnet test executa tudo. Cada [Fact] roda numa nova instância, garantindo isolamento.
10. Próximos Passos#
A seguir, asserções mais ricas e testes parametrizados com [Theory].
11. Referências#
- Microsoft Learn — Testes unitários no .NET
- Microsoft Learn — Testes unitários com xUnit
- xUnit — Documentação oficial