Pruebas en C# (.NET): frameworks y herramientas
Las pruebas son una parte esencial del desarrollo profesional en la plataforma .NET. Una cobertura de código de calidad con pruebas reduce la cantidad de errores, simplifica la refactorización y aumenta la confianza en el producto. En el ecosistema de C# existen numerosos frameworks y utilidades maduros, cada uno de los cuales resuelve tareas específicas: desde pruebas unitarias hasta verificaciones de integración y pruebas de UI. En este artículo, analizaremos las herramientas principales, sus capacidades y ejemplos de uso.
Frameworks principales para pruebas unitarias
Las pruebas unitarias son la base de la pirámide de pruebas. En .NET Core / .NET 5+, el estándar de facto se ha convertido en xUnit.net, aunque NUnit y MSTest también se utilizan activamente.
xUnit.net
Un framework moderno, flexible y el más popular. Funciona según el principio de "hechos" (facts) y "teorías" (theories).
- Hechos (Fact) — pruebas simples sin parámetros.
- Teorías (Theory) — pruebas parametrizadas con datos de los atributos
[InlineData]o[MemberData]. - No requiere el atributo
[TestClass]— cualquier clase pública puede contener pruebas.
using Xunit;
public class CalculatorTests{ [Fact] public void Add_ShouldReturnSum() { // Arrange var calc = new Calculator(); // Act var result = calc.Add(2, 3); // Assert Assert.Equal(5, result); }
[Theory] [InlineData(1, 2, 3)] [InlineData(-1, -1, -2)] public void Add_WithMultipleInputs_ShouldReturnCorrectSum(int a, int b, int expected) { var calc = new Calculator(); var result = calc.Add(a, b); Assert.Equal(expected, result); }}NUnit
Un framework clásico con una rica historia. Se distingue por sus potentes atributos y soporte para parametrización.
- Utiliza los atributos
[Test],[TestCase],[SetUp]. - Soporta la ejecución paralela de pruebas.
- Es conveniente para escenarios complejos con datos de prueba.
using NUnit.Framework;
[TestFixture]public class CalculatorNUnitTests{ [Test] public void Subtract_ShouldReturnDifference() { var calc = new Calculator(); var result = calc.Subtract(10, 4); Assert.That(result, Is.EqualTo(6)); }
[TestCase(5, 3, 2)] [TestCase(0, 0, 0)] public void Subtract_WithParameters_ShouldReturnCorrect(int a, int b, int expected) { var calc = new Calculator(); Assert.That(calc.Subtract(a, b), Is.EqualTo(expected)); }}MSTest
El framework integrado de Microsoft. Es ideal para proyectos simples y equipos que trabajan en el ecosistema de Visual Studio.
- Atributos:
[TestMethod],[TestClass],[DataRow]. - Integración estrecha con Azure DevOps y pipelines de CI/CD.
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]public class CalculatorMSTests{ [TestMethod] public void Multiply_ShouldReturnProduct() { var calc = new Calculator(); var result = calc.Multiply(4, 5); Assert.AreEqual(20, result); }
[DataRow(2, 3, 6)] [DataRow(0, 100, 0)] [DataTestMethod] public void Multiply_WithDataRows_ShouldReturnCorrect(int a, int b, int expected) { var calc = new Calculator(); Assert.AreEqual(expected, calc.Multiply(a, b)); }}Bibliotecas para objetos mock y aislamiento
En las pruebas unitarias, a menudo es necesario aislar el código bajo prueba de las dependencias externas (BD, API, sistema de archivos). Para ello se utilizan frameworks de mock.
Moq
El más popular fra
También en la biblioteca
ExcelJS para JavaScript (Node.js): guía completa con ejemplos
Internacionalización (i18n) en Go (Golang): biblioteca go-i18n
Trabajo con imágenes en Java: desde la lectura hasta el procesamiento
Planificador de tareas Swift: GCD, OperationQueue y Combine para iOS/macOS
Planificador de tareas Kotlin: kotlinx-coroutines-core y la biblioteca korGE