Pruebas E2E en C#: guía para quienes están hartos de bugs en producción

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué las pruebas unitarias no salvan, y cuándo se necesitan pruebas E2E

\n\n

Imagine: escribió un código perfecto en C#. Las pruebas unitarias están en verde, la cobertura es del 95%, la revisión de código pasó. Lanza el release, y los usuarios escriben: «El botón "Realizar pedido" no funciona si hay más de 3 productos en el carrito». ¿Le suena?

\n\n

Las pruebas unitarias verifican métodos de forma aislada. Las pruebas de integración verifican la conexión entre la base de datos y la API. Pero las pruebas E2E de aplicaciones C# (End-to-End) son la única forma de asegurarse de que todo el sistema funciona como un todo: navegador, servidor, base de datos, API externas. Las pruebas de extremo a extremo simulan las acciones de un usuario real: clics, ingreso de datos, espera de carga de páginas.

\n\n

En este artículo no solo contaremos teoría. Mostraremos cómo escribir pruebas E2E en C# usando Selenium y Playwright, cómo organizar el código mediante Page Object Model y cómo integrar las pruebas automatizadas en CI/CD. Vamos allá.

\n\n

Qué son las pruebas E2E en C# en la práctica

\n\n

Una prueba E2E es un escenario que recorre todo el camino del usuario: desde abrir la página hasta completar la acción objetivo (compra, registro, envío de formulario). Para un desarrollador de C#, esto generalmente significa:

\n\n
    \n
  • Iniciar el navegador (Chrome, Firefox, Edge) a través de WebDriver
  • \n
  • Buscar elementos en la página (botones, campos de entrada, enlaces)
  • \n
  • Realizar acciones (clic, ingreso de texto, selección de lista)
  • \n
  • Verificar el resultado esperado (apareció un mensaje, cambió la URL, se actualizaron los datos)
  • \n
  • Cerrar el navegador y limpiar los datos de prueba
  • \n
\n\n

La principal diferencia con las pruebas unitarias: las pruebas E2E trabajan con la UI real. Son lentas, frágiles (dependen de selectores CSS), pero invaluables para verificar escenarios críticos de negocio.

\n\n

Herramientas para pruebas E2E en C#: Selenium vs Playwright

\n\n

La elección de la herramienta es la primera pregunta que enfrenta un equipo. Consideremos las dos opciones más populares.

\n\n

Selenium WebDriver

\n

Estándar de la industria. Funciona a través de WebDriver, un proceso separado que controla el navegador. Soporta todos los navegadores, una comunidad enorme, miles de soluciones listas. Desventaja: la configuración requiere drivers (ChromeDriver, GeckoDriver), y las pruebas pueden ser lentas debido a las esperas.

\n\n

Playwright para .NET

\n

Una herramienta más joven, pero ya muy popular de Microsoft. Funciona directamente a través del protocolo DevTools, sin capas intermedias innecesarias. Más rápido, más estable, espera automáticamente la carga de elementos (sin Thread.Sleep explícitos). Soporta no solo navegadores, sino también emuladores móviles.

\n\n

En este artículo mostraremos ejemplos con ambos frameworks para que pueda comparar.

\n\n

Escribimos la primera prueba E2E en C#: Selenium

\n\n

Empecemos con lo clásico. Instalamos el paquete a través de NuGet:

\n\n
dotnet add package Selenium.WebDriver\ndotnet add package Selenium.Support\ndotnet add package Selenium.WebDriver.ChromeDriver
\n\n

Ahora escribimos una prueba para un sitio de ejemplo (supongamos que es una tienda online). Queremos verificar que después de agregar un producto al carrito, aparece un ícono con la cantidad de productos en la página.

\n\n
using OpenQA.Selenium;\nusing OpenQA.Selenium.Chrome;\nusing OpenQA.Selenium.Support.UI;\n\npublic class CartE2ETests\n{\n    [Fact]\n    public void AddItemToCart_ShouldUpdateCartBadge()\n    {\n        using var driver = new ChromeDriver();\n        \n        // Arrange\n        driver.Navigate().GoToUrl("https://demo-store.com");\n        driver.Manage().Window.Maximize();\n        \n        // Act\n        var addToCartButton = driver.FindElement(By.CssSelector(".product-card .add-to-cart"));\n        addToCartButton.Click();\n        \n        // Wait for badge to appear\n        var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));\n        var cartBadge = wait.Until(drv => \n            drv.FindElement(By.CssSelector(".cart-badge")));\n        \n        // Assert\n        Assert.Equal("1", cartBadge.Text);\n        \n        driver.Quit();\n    }\n}
\n\n

Blogs

Book Recommendations