Módulo 16: Proyecto Final — Plan de Pruebas Completo
Objetivo
Aplicar todos los conocimientos del curso en un proyecto integrador: diseñar y ejecutar un plan de pruebas completo para una aplicación web de gestión de tareas (Todo App).
graph TD
A[Plan de Pruebas] --> B[Pruebas Unitarias]
A --> C[Pruebas de API]
A --> D[Pruebas de UI]
A --> E[Pruebas de Rendimiento]
B --> B1[Servicios]
B --> B2[Validaciones]
C --> C1[Postman/Newman]
D --> D1[Playwright]
E --> E1[JMeter]
style A fill:#2196F3,color:white
style B fill:#4CAF50,color:white
style C fill:#FF9800,color:white
style D fill:#9C27B0,color:white
style E fill:#f44336,color:white
[TestFixture]publicclassTareaValidatorTests{[TestCase("Comprar leche",true)][TestCase("",false)][TestCase(null,false)][TestCase("AB",false)]// Menos de 3 caracterespublicvoidValidarTitulo_CasosVarios(string?titulo,boolesperado){varresultado=TareaValidator.ValidarTitulo(titulo);Assert.That(resultado,Is.EqualTo(esperado));}[Test]publicvoidValidarFechaLimite_FechaPasada_RetornaFalse(){varresultado=TareaValidator.ValidarFechaLimite(DateTime.Now.AddDays(-1));Assert.That(resultado,Is.False);}[Test]publicvoidValidarFechaLimite_FechaFutura_RetornaTrue(){varresultado=TareaValidator.ValidarFechaLimite(DateTime.Now.AddDays(7));Assert.That(resultado,Is.True);}}
4. Pruebas de API (Postman/Newman)
4.1 Colección Postman
TodoApp API Tests/
├── Auth/
│ ├── POST Register - Registro exitoso
│ ├── POST Register - Email duplicado → 409
│ ├── POST Login - Credenciales válidas → token
│ └── POST Login - Credenciales inválidas → 401
├── Tareas/
│ ├── POST Crear tarea → 201
│ ├── POST Crear tarea sin título → 400
│ ├── GET Listar tareas → 200
│ ├── GET Listar tareas sin auth → 401
│ ├── PUT Editar tarea → 200
│ ├── PUT Editar tarea de otro usuario → 403
│ ├── PATCH Completar tarea → 200
│ ├── DELETE Eliminar tarea → 204
│ └── DELETE Eliminar tarea inexistente → 404
└── Filtros/
├── GET Tareas pendientes → filtra correctamente
├── GET Tareas completadas → filtra correctamente
└── GET Tareas por prioridad → filtra correctamente
4.2 Tests de ejemplo en Postman
// POST /api/auth/login — Testspm.test("Status 200",()=>pm.response.to.have.status(200));pm.test("Retorna token",()=>{constjson=pm.response.json();pm.expect(json.token).to.be.a("string");pm.expect(json.token.length).to.be.greaterThan(0);pm.collectionVariables.set("token",json.token);});// POST /api/tareas — Testspm.test("Status 201 Created",()=>pm.response.to.have.status(201));pm.test("Retorna tarea con id",()=>{constjson=pm.response.json();pm.expect(json.id).to.be.a("number");pm.expect(json.titulo).to.eql("Comprar leche");pm.expect(json.estado).to.eql("Pendiente");pm.collectionVariables.set("tareaId",json.id);});// GET /api/tareas sin auth — Testspm.test("Status 401 Unauthorized",()=>pm.response.to.have.status(401));
4.3 Ejecución con Newman
newman run TodoApp.postman_collection.json \-e entorno-desarrollo.json \--reporters cli,htmlextra \--reporter-htmlextra-export reports/api-report.html
5. Pruebas de UI (Playwright)
5.1 Page Objects
// Pages/LoginPage.cspublicclassLoginPage{privatereadonlyIPage_page;publicLoginPage(IPagepage)=>_page=page;privateILocatorEmailInput=>_page.GetByLabel("Email");privateILocatorPasswordInput=>_page.GetByLabel("Contraseña");privateILocatorLoginButton=>_page.GetByRole(AriaRole.Button,new(){Name="Iniciar sesión"});privateILocatorErrorAlert=>_page.Locator(".alert-danger");publicasyncTaskGotoAsync()=>await_page.GotoAsync("/login");publicasyncTaskLoginAsync(stringemail,stringpassword){awaitEmailInput.FillAsync(email);awaitPasswordInput.FillAsync(password);awaitLoginButton.ClickAsync();}publicILocatorGetError()=>ErrorAlert;}// Pages/TareasPage.cspublicclassTareasPage{privatereadonlyIPage_page;publicTareasPage(IPagepage)=>_page=page;privateILocatorNuevaTareaBtn=>_page.GetByRole(AriaRole.Button,new(){Name="Nueva tarea"});privateILocatorTituloInput=>_page.GetByLabel("Título");privateILocatorPrioridadSelect=>_page.GetByLabel("Prioridad");privateILocatorGuardarBtn=>_page.GetByRole(AriaRole.Button,new(){Name="Guardar"});privateILocatorTareasLista=>_page.Locator("[data-testid='tarea-item']");privateILocatorFiltroEstado=>_page.GetByLabel("Filtrar por estado");publicasyncTaskCrearTareaAsync(stringtitulo,stringprioridad){awaitNuevaTareaBtn.ClickAsync();awaitTituloInput.FillAsync(titulo);awaitPrioridadSelect.SelectOptionAsync(prioridad);awaitGuardarBtn.ClickAsync();}publicILocatorGetTareas()=>TareasLista;publicasyncTaskFiltrarPorEstadoAsync(stringestado){awaitFiltroEstado.SelectOptionAsync(estado);}publicasyncTaskCompletarTareaAsync(stringtitulo){vartarea=TareasLista.Filter(new(){HasText=titulo});awaittarea.GetByRole(AriaRole.Checkbox).CheckAsync();}publicasyncTaskEliminarTareaAsync(stringtitulo){vartarea=TareasLista.Filter(new(){HasText=titulo});awaittarea.GetByRole(AriaRole.Button,new(){Name="Eliminar"}).ClickAsync();}}
¡Enhorabuena! Has completado el Curso de Testing. Ahora tienes las herramientas y conocimientos para diseñar, implementar y automatizar pruebas profesionales en cualquier proyecto.