Pruebas en C#: Unit, Integration y E2E — guía completa para desarrolladores .NET
La calidad del software comienza con las pruebas. En el ecosistema C# (.NET) existe una cultura de pruebas establecida que incluye tres niveles clave: pruebas unitarias (unit), de integración (integration) y de extremo a extremo (E2E). En este artículo analizaremos cada nivel con ejemplos prácticos, mostraremos las mejores librerías y explicaremos cómo construir una estrategia de pruebas efectiva para tu proyecto .NET.
1. Pruebas unitarias en C#: la base de la calidad del código
Unit tests (pruebas unitarias) verifican el funcionamiento de componentes individuales del programa — métodos, clases, funciones — de forma aislada de las dependencias externas. En .NET los frameworks principales son xUnit, NUnit y MSTest. El más popular es xUnit gracias a su flexibilidad e integración con .NET Core.
Librerías para unit tests:
xUnit— framework principal (recomendado por Microsoft)Moq— creación de objetos mock para aislar dependenciasFluentAssertions— expresiones de aserción mejoradasAutoFixture— generación automática de datos de prueba
Ejemplo de unit test con xUnit y 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); }}Consejos para unit tests:
- Sigue el patrón AAA (Arrange, Act, Assert)
- Una prueba — una verificación (un assert)
- Usa
[Theory]con[InlineData]para parametrización - No pruebes servicios externos — usa mocks
2. Pruebas de integración: verificación de la interacción entre componentes
Integration tests (pruebas de integración) verifican cómo los diferentes módulos del sistema trabajan juntos: base de datos, sistema de archivos, APIs externas. A diferencia de los unit tests, aquí utilizamos dependencias reales o cercanas a la realidad.
Herramientas para pruebas de integración en .NET:
Microsoft.AspNetCore.TestHost— servidor web embebidoTestContainers— contenedorización de BD (PostgreSQL, SQL Server, Redis)Respawn— limpieza de la base de datos entre pruebasWebApplicationFactory<T>— creación del host de prueba
Ejemplo de integration test con TestContainers y 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
```