Nicolas Cardona
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); }); });
Mauricio Gonzalo Aliendre Pérez
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
Emmanuel Rodríguez
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'})
Nicolás Chamorro Girón
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"); }) })
Eduardo Zamora Miranda
¿Qué diferencia hay entre usar cypress o REST assured con java/python para las pruebas en backend?
Cuáles serian ventajas o desventajas?
Javier Fuentes Mora
Profesorcypress ya lo tiene integrado no necesitas ninguna libreria mas ni dependes de alguien
Eduardo Huanca
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.
Mario Alexander Vargas Celis
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) });});
Marcos Germán Medina
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); });});
Elizabeth Daniela Rodriguez Ubaldo
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) })
Nicolás Chamorro Girón
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"); })})