Por qué las pruebas unitarias no salvan, y cuándo se necesitan pruebas E2E
\n\nImagine: 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\nLas 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\nEn 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\nQué son las pruebas E2E en C# en la práctica
\n\nUna 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
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\nHerramientas para pruebas E2E en C#: Selenium vs Playwright
\n\nLa elección de la herramienta es la primera pregunta que enfrenta un equipo. Consideremos las dos opciones más populares.
\n\nSelenium WebDriver
\nEstá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\nPlaywright para .NET
\nUna 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\nEn este artículo mostraremos ejemplos con ambos frameworks para que pueda comparar.
\n\nEscribimos la primera prueba E2E en C#: Selenium
\n\nEmpecemos con lo clásico. Instalamos el paquete a través de NuGet:
\n\ndotnet add package Selenium.WebDriver\ndotnet add package Selenium.Support\ndotnet add package Selenium.WebDriver.ChromeDriver\n\nAhora 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\nusing 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
Leer también
Generación de código con IA en PHP: de la idea a la API funcional
Optimización del rendimiento de aplicaciones Java: métodos prácticos y consejos
10 errores fatales al aprender PHP que cometen el 90% de los principiantes
Cómo conseguir trabajo como desarrollador TypeScript: consejos y currículum en la práctica
Foro de programación en español: pregunta y recibe ayuda | Pythonlib