Testes em C#: Testes Unitários, de Integração e E2E para projetos .NET

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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ências
  • FluentAssertions — expressões de asserção aprimoradas
  • AutoFixture — 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ável
  • TestContainers — conteinerização de bancos de dados (PostgreSQL, SQL Server, Redis)
  • Respawn — limpeza do banco de dados entre testes
  • WebApplicationFactory<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

Blogs

Book Recommendations