Validación de Status Codes en APIs con Cypress
Clase 6 de 17 • Curso de Automatización de Pruebas de Backend con Cypress
Contenido del curso
Clase 6 de 17 • Curso de Automatización de Pruebas de Backend con Cypress
Contenido del curso
Nicolas Cardona
Mauricio Gonzalo Aliendre Pérez
Emmanuel Rodríguez
Eduardo Zamora Miranda
Javier Fuentes Mora
Eduardo Huanca
Mario Alexander Vargas Celis
Marcos Germán Medina
Elizabeth Daniela Rodriguez Ubaldo
Nicolás Chamorro Girón
Nicolás Chamorro Girón
Una buena practica cuando se está creando datos en la base de datos por una prueba automatizada es limpiar la base de datos, si tú objetivo es simplemente validar que el empleado se crea bien, entonces no lo necesitas para más adelante por eso es mejor borrarlo enseguida. Ahora imagínalo en un pipeline de Integración Continua, crearía demasiados usuarios, y eso para la base de datos y otros servicios no sería óptimo. Acá un ejemplo:
it("should validate 201 Created status code when creating a new employee and 200 Ok status code when deleting the just created employee", function () { cy.request("POST", "employees", { name: "Joe", lastname: "Doe", email: "joe_doe@gmail.com", }).as("createdEmployee"); cy.get("@createdEmployee").its("status").should("eq", 201); cy.get("@createdEmployee") .its("body") .its("id") .then((createdEmployeeId) => { cy.request("DELETE", `employees/${createdEmployeeId}`) .its("status") .should("eq", 200); }); });
Excelente aporte! usando tu código como ejemplo también se me ocurrió poner el método DELETE en un hook, en este caso me puse de ejemplo crear dos empleados y con un afterEach() ir borrando cada empleado cuando acabe la ejecución de cada test
Aqui el codigo
it('first employee to be created', () => { cy.request("POST", "employees", { first_name: "Mauricio", last_name: "Perez", email: "mauricio@gmail.com", gender: "Male", ip_address: "79.77.68.154" }).as("createdEmployee"); cy.get("@createdEmployee").its("status").should("eq", 201); }) it('second employee to be created', () => { cy.request("POST", "employees", { first_name: "Carlos", last_name: "Antelo", email: "carlos@gmail.com", gender: "Male", ip_address: "105.59.68.154" }).as("createdEmployee"); cy.get("@createdEmployee").its("status").should("eq", 201); }) afterEach(() => { cy.get("@createdEmployee") .its("body") .its("id") .then((createdEmployeeId) => { cy.request("DELETE", `employees/${createdEmployeeId}`) .its("status") .should("eq", 200); }); })
NOTA: En mi caso los empleados también cuentan con campos adicionales como genero y la dirección ip por eso es algo diferente
Request
. 📚 Documentación . Tomando como referencia la lista de argumentos que se envían como opciones podemos adicionar más elementos a nuestra request. . Si necesitamos enviar datos, como lo es una creación, tenemos la siguiente definición:
cy.request('POST', 'URL', { name: 'Fionna Delahunty', email: 'fdelahunty0@sitemeter.com'})
¿Qué diferencia hay entre usar cypress o REST assured con java/python para las pruebas en backend?
Cuáles serian ventajas o desventajas?
cypress ya lo tiene integrado no necesitas ninguna libreria mas ni dependes de alguien
python solo necesita pytest para lo que es pruebas de backend y las apis que vas a probar, el interpretador, el ide pycharm u otro...
...igualmente no entedí muy bien la pregunta.
describe('Probando statuses', ()=>{ it('Debe de validar el status code exitoso',()=>{ cy.request('employees') .its('status') .should('eq', 200) }); it('Debe de validar el status code fallido',()=>{ cy.request({url:'employees/4', failOnStatusCode: false}) .its('status') .should('eq', 404) }); }); ```describe('Probando statuses', ()=>{ it('Debe de validar el status code exitoso',()=>{ cy.request('employees') .its('status') .should('eq', 200) }); it('Debe de validar el status code fallido',()=>{ cy.request({url:'employees/4', failOnStatusCode: false}) .its('status') .should('eq', 404) });});
La clave aquí es la opción failOnStatusCode: false, que le dice a Cypress que no falle automáticamente si el código de estado no es 2xx. Esto te permite verificar manualmente el código de estado en la siguiente línea.
describe("Probando status", () => { it("Validar el status code exitoso", () => { ``//se valida que el status code sea 200`` cy.request("employees").its("status").should("eq", 200); }); it("Validar el status code fallido", () => { ``//se valida que el status code sea 404 fallido`` cy.request({url: "employees/6", failOnStatusCode: false}).its("status").should("eq", 404); });});
it('Debe de validar el status code exitoso de la creacion', () => { cy.request({method: 'POST', url: 'employees'}) .its('status') .should('eq', 201) })
it('Debe de validar el status code exitoso de la actualizacion', () => { cy.request({method: 'PUT', url: 'employees/5'}) .its('status') .should('eq', 200) }) it('Debe de validar el status code exitoso de la eliminacion', () => { cy.request({method: 'DELETE', url: 'employees/5'}) .its('status') .should('eq', 200) })
Pueden usar este codigo que testea un api en linea gratuita:
describe("Apis", () => { it("index - getAll", () => { cy.request("https://jsonplaceholder.typicode.com/todos").as("response"); cy.get("@response").its("body").as("body"); cy.get("@response").its("status").as("status"); cy.get("@status").should("eq", 200); cy.get("@body").should("not.be.empty"); cy.get("@body").its(0).as("firstItem"); cy.get("@firstItem").should("have.property", "userId").and("be.a", "number"); cy.get("@firstItem").should("have.property", "id").and("be.a", "number"); cy.get("@firstItem").should("have.property", "title").and("be.a", "string"); cy.get("@firstItem").should("have.property", "completed").and("be.a", "boolean"); }) })
Pueden usar este mismo código para las pruebas, se testea una api en linea y gratuita:
describe("Apis", () => { it("index - getAll", () => { cy.request("https://jsonplaceholder.typicode.com/todos").as("response"); cy.get("@response").its("body").as("body"); cy.get("@response").its("status").as("status"); cy.get("@status").should("eq", 200); cy.get("@body").should("not.be.empty"); cy.get("@body").its(0).as("firstItem"); cy.get("@firstItem").should("have.property", "userId").and("be.a", "number"); cy.get("@firstItem").should("have.property", "id").and("be.a", "number"); cy.get("@firstItem").should("have.property", "title").and("be.a", "string"); cy.get("@firstItem").should("have.property", "completed").and("be.a", "boolean"); }) }) ```*describe*("Apis", () *=>* { *it*("index - getAll", () *=>* { *cy.request*("https://jsonplaceholder.typicode.com/todos")*.as*("response"); *cy.get*("@response")*.its*("body")*.as*("body"); *cy.get*("@response")*.its*("status")*.as*("status");   *cy.get*("@status")*.should*("eq", 200); *cy.get*("@body")*.should*("not.be.empty");   *cy.get*("@body")*.its*(0)*.as*("firstItem");   *cy.get*("@firstItem")*.should*("have.property", "userId")*.and*("be.a", "number"); *cy.get*("@firstItem")*.should*("have.property", "id")*.and*("be.a", "number"); *cy.get*("@firstItem")*.should*("have.property", "title")*.and*("be.a", "string"); *cy.get*("@firstItem")*.should*("have.property", "completed")*.and*("be.a", "boolean"); })})