Testes em C#: Unit, Integration e E2E — guia completo para desenvolvedores .NET
A qualidade do software começa com os testes. No ecossistema C# (.NET), existe uma cultura de testes estabelecida que inclui três níveis principais: testes unitários (unit), de integração (integration) e ponta a ponta (E2E). Neste artigo, analisaremos cada nível com exemplos práticos, mostraremos as melhores bibliotecas e explicaremos como construir uma estratégia de testes eficaz para seu projeto .NET.
1. Testes unitários em C#: a base da qualidade do código
Testes unitários verificam o funcionamento de componentes individuais do programa — métodos, classes, funções — isolados de dependências externas. No .NET, os principais frameworks são xUnit, NUnit e MSTest. O mais popular é o xUnit devido à sua flexibilidade e integração com .NET Core.
Bibliotecas para testes unitários:
xUnit— framework principal (recomendado pela Microsoft)Moq— criação de objetos mock para isolar dependênciasFluentAssertions— expressões de asserção aprimoradasAutoFixture— geração automática de dados de teste
Exemplo de teste unitário com xUnit e Moq:
using Xunit;using Moq;using FluentAssertions;
public class OrderServiceTests{ [Fact] public void CalculateTotal_WithValidItems_ReturnsCorrectSum() { // Arrange var mockRepo = new Mock<IProductRepository>(); mockRepo.Setup(r => r.GetPrice(1)).Returns(100m); mockRepo.Setup(r => r.GetPrice(2)).Returns(50m);
var service = new OrderService(mockRepo.Object); var items = new List<OrderItem> { new OrderItem { ProductId = 1, Quantity = 2 }, new OrderItem { ProductId = 2, Quantity = 1 } };
// Act var total = service.CalculateTotal(items);
// Assert total.Should().Be(250m); mockRepo.Verify(r => r.GetPrice(1), Times.Once); mockRepo.Verify(r => r.GetPrice(2), Times.Once); }}Dicas para testes unitários:
- Siga o padrão AAA (Arrange, Act, Assert)
- Um teste — uma verificação (um assert)
- Use
[Theory]com[InlineData]para parametrização - Não teste serviços externos — use mocks
2. Testes de integração: verificando a interação entre componentes
Testes de integração verificam como diferentes módulos do sistema funcionam juntos: banco de dados, sistema de arquivos, APIs externas. Ao contrário dos testes unitários, aqui usamos dependências reais ou próximas da realidade.
Ferramentas para testes de integração no .NET:
Microsoft.AspNetCore.TestHost— servidor web incorporávelTestContainers— conteinerização de bancos de dados (PostgreSQL, SQL Server, Redis)Respawn— limpeza do banco de dados entre testesWebApplicationFactory<T>— criação de host de teste
Exemplo de teste de integração com TestContainers e WebApplicationFactory:
using Microsoft.AspNetCore.Mvc.Testing;using Testcontainers.PostgreSql;using Xunit;
public class UserApiIntegrationTests : IAsyncLifetime{ private readonly PostgreSqlContainer _dbContainer; private WebApplicationFactory<Program> _factory;
public UserApiIntegrationTests() { _dbContainer = new PostgreSqlBuilder() .WithImage("postgres:15") .WithDatabase("testdb") .WithUsername("tes