Skip to content

Commit 4ae94ef

Browse files
authored
Merge pull request #1 from quindcode/feature/abolanos_refactorizacion_mitte
Feature/abolanos refactorizacion mitte
2 parents 41157d1 + 76afbc0 commit 4ae94ef

11 files changed

Lines changed: 199 additions & 317 deletions

DocumentacionPruebas.md

Lines changed: 0 additions & 44 deletions
This file was deleted.

README.md

Lines changed: 76 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,100 +1,109 @@
1-
# Proyecto de Pruebas con Cypress
1+
# Proyecto de Pruebas con Cypress - Automatización de API Mitte
22

3-
Este proyecto utiliza Cypress para realizar pruebas en una aplicación web y se conecta a una base de datos Oracle utilizando la biblioteca `oracledb`. También se utiliza `dotenv` para cargar las variables de entorno desde un archivo `.env`, `ajv` para realizar comparativas de esquemas de las respuestas en formato `.json` y los valores obtenidos del consumo API, y `cypress-mochawesome-reporter` para generar reportes de ejecución.
3+
Este proyecto consiste en la automatización de pruebas para una API encargada de la gestión de entradas, salidas y pagos de un parqueadero. Esta aplicación se comunica directamente con el autorizador de accesos para validar las transacciones.
44

5-
## Instalación
5+
## Estructura del Proyecto
66

7-
1. Clona este repositorio en tu máquina local.
7+
El proyecto sigue una estructura modular para facilitar el mantenimiento y la escalabilidad:
88

9-
2. Abre una terminal y navega hasta la carpeta del proyecto.
9+
- **`cypress/e2e/`**: Contiene los archivos de prueba (`.cy.js`) que definen los escenarios y casos de prueba (bloques `it`).
1010

11-
3. Ejecuta el siguiente comando para instalar todas las dependencias:
11+
- **`cypress/support//`**: Carpeta principal para la lógica de soporte:
1212

13-
```bash
14-
npm install
15-
```
13+
- **`assertions/`**: Contiene las validaciones personalizadas (Asserts) para verificar respuestas de API y estados de base de datos.
1614

17-
4. Renombra el archivo `.env.template` a `.env` y actualiza las variables de entorno con los valores correspondientes para la conexión a la base de datos Oracle.
15+
- **`page_objects//`** (Services): Contiene los objetos que encapsulan las solicitudes de envío a la API (lectura/escritura).
1816

19-
## Ejecución de Pruebas
17+
- **`utils/`**: Generadores de datos (Data Generators) y funciones auxiliares para las pruebas.
2018

21-
1. Para abrir Cypress en modo de interfaz de usuario, ejecuta el siguiente comando:
22-
```bash
23-
npx cypress open
24-
```
25-
O alternativamente puedes usar el comando personalizado.
26-
```bash
27-
npm run cy:open
28-
```
19+
- **`constants/`**: Definición de constantes del proyecto, como nombres campos de API y mensajes de error.
20+
21+
- **`commands.js`**: Comandos personalizados de Cypress (opcional).
22+
23+
## Instalación
2924

30-
Esto abrirá la interfaz de usuario de Cypress, donde podrás seleccionar y ejecutar las pruebas manualmente.
25+
Sigue estos pasos para instalar y configurar el proyecto en tu entorno local:
3126

32-
2. Para ejecutar las pruebas en modo de línea de comandos, ejecuta el siguiente comando:
27+
1. **Clonar el repositorio** (si aplica) o navegar a la carpeta del proyecto.
28+
2. **Instalar dependencias**:
29+
Asegúrate de tener [Node.js](https://nodejs.org/) instalado y ejecuta el siguiente comando en la raíz del proyecto:
30+
```bash
31+
npm install
32+
```
33+
34+
## Ejecución de Pruebas
35+
36+
Puedes ejecutar las pruebas de tres maneras diferentes según tus necesidades:
37+
38+
### 1. Ejecución en el Navegador (Interfaz de Usuario de Cypress)
39+
Para abrir el test runner de Cypress y ejecutar pruebas de forma interactiva:
3340
```bash
34-
npm run test
41+
npm run cy:open
3542
```
36-
Esto ejecutará las pruebas automáticamente y mostrará el resultado en la terminal.
3743

38-
3. Para ejecutar las pruebas con Allure habilitado:
44+
### 2. Ejecución por Línea de Comandos (Modo Headless)
45+
Para ejecutar todas las pruebas en segundo plano desde la terminal:
3946
```bash
40-
npm npm run test:report
47+
npm run test
4148
```
4249

50+
### 3. Ejecución con Reportes Allure
51+
Para generar y visualizar los reportes detallados de Allure:
52+
53+
- **Ejecutar pruebas capturando datos para Allure**:
54+
```bash
55+
npm run test:allure
56+
```
57+
- **Generar el reporte de Allure**:
58+
```bash
59+
npm run allure:report
60+
```
61+
- **Abrir el reporte generado**:
62+
```bash
63+
npm run allure:open
64+
```
65+
- **Limpiar reportes anteriores y ejecutar todo el flujo**:
66+
```bash
67+
npm run test:report
68+
```
69+
4370
## Cambio de Variables de Entorno
4471

45-
El archivo `.env` contiene las variables de entorno necesarias para la conexión a la base de datos Oracle. Para cambiar estas variables, sigue estos pasos:
72+
El proyecto utiliza variables de entorno para gestionar credenciales y conexiones. Debes configurar un archivo `.env` en la raíz del proyecto con la siguiente estructura:
4673

47-
1. Abre el archivo `.env` en un editor de texto.
74+
```env
75+
# Configuración de Base de Datos (Oracle)
76+
DB_USER=tu_usuario
77+
DB_PASSWORD=tu_contraseña
78+
DB_CONNECT_STRING=tu_string_de_conexion
4879
49-
2. Actualiza los valores de las variables `DB_USER`, `DB_PASSWORD` y `DB_CONNECT_STRING` con los valores correctos para tu entorno de base de datos.
80+
# Autenticación Cognito
81+
COGNITO_USERNAME=tu_usuario_cognito
82+
COGNITO_PASSWORD=tu_password_cognito
83+
COGNITO_CLIENT_ID=tu_client_id
5084
```
51-
DB_USER=usuario
52-
DB_PASSWORD=clave
53-
DB_CONNECT_STRING=oracleDbHost
54-
```
55-
5685

57-
3. Guarda los cambios en el archivo.
86+
---
5887

59-
## Reporte de Ejecución
88+
## Documentación de Pruebas (Escenarios de Automatización)
6089

61-
Después de ejecutar las pruebas, se generará un reporte utilizando la biblioteca `cypress-mochawesome-reporter`.
62-
Podrá acceder al reporte de pruebas en la ruta [cypress/reports/html/index.html](cypress/reports/html/index.hml) desde la raíz del proyecto.
90+
### Gestión de Entradas (`CreateEntryStep.cy.js` y `CreateEntryValidation.cy.js`)
6391

64-
## Recomendación para utilizar ajv para validación de esquemas
92+
- **Entrada Exitosa**: Valida la entrada exitosa de un vehículo a un parqueadero Mitte con el servicio de Flypass, verificando tanto la respuesta de la API como el registro en la base de datos.
6593

66-
Cuando estamos validando la estructura de las respuestas que se generan a partir del llamado de un API, se deben crear archivos de referencia que indiquen la obligatoriedad de los campos que recibimos, tipos de datos esperados, y estructura de la información, de la siguiente forma:
94+
- **Entrada Rechazada**: Valida que la entrada sea rechazada cuando la placa no está autorizada.
6795

68-
Imaginemos que al registrar un usuario por medio de un método POST, obtenemos la siguiente estructura:
96+
- **Validaciones de Contrato**:
97+
- Validar que retorne `400 Bad Request` si faltan campos obligatorios como `sessionId`, `localIdentifier`, `actualStart` o `placeId`.
98+
- Validar que retorne `400` cuando los campos tienen valores inválidos (Nulos, Vacíos o formatos de fecha incorrectos).
6999

70-
```json
71-
{
72-
"id": 4,
73-
"token": "QpwL5tke4Pnpja7X4"
74-
}
75-
```
100+
### Gestión de Salidas (`CreateExitStep.cy.js` y `CreateExitValidation.cy.js`)
76101

77-
Queremos validar la obligatoriedad del cumplimiento de su esquema, donde id, y token, son atributos obligatorios, y cada uno de ellos tienen tipos de datos `integer`, y `string` respectivamente, para lograrlo, debemos definir la estructura de la siguiente manera:
78-
79-
```json
80-
{
81-
"type": "object",
82-
"properties": {
83-
"id": {
84-
"type": "integer"
85-
},
86-
"token": {
87-
"type": "string"
88-
}
89-
},
90-
"required": [
91-
"id",
92-
"token"
93-
]
94-
}
95-
```
102+
- **Salida Exitosa**: Valida la salida de un vehículo, asegurando que se procese correctamente en el sistema y se refleje en la base de datos.
96103

97-
Allí es donde entra en juego la validación que nos permite realizar la librería `ajv` respecto al tipo de datos y el cumplimiento del contrato (o esquema) de la respuesta obtenida.
104+
- **Salida Rechazada**: Valida que la salida sea rechazada por placa no autorizada.
98105

99-
Puedes hacer uso de herramientas que nos permitan crear los esquemas de forma automática como por ejemplo: https://www.liquid-technologies.com/online-json-to-schema-converter
106+
- **Flujo Completo (End-to-End)**: Registra una entrada exitosa y posteriormente una salida exitosa para el mismo vehículo/sesión.
100107

108+
- **Validaciones de Contrato**:
109+
- Validar que retorne `400 Bad Request` si faltan campos obligatorios como `sessionId`, `placeId`, `actualStart`, `currency` o `actualEnd`.

cypress.config.js

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,23 @@
11
const { defineConfig } = require("cypress");
22
const oracledb = require("oracledb");
3-
//const mssql = require('mssql');
43
require("dotenv").config();
54
const { getTemporaryCredentials } = require('./cypress/support/utils/AWSConnection.js');
65

76

8-
// Establece la configuración de conexión para el ambiente de base de datos
97
const connection = {
108
user: process.env.DB_USER,
119
password: process.env.DB_PASSWORD,
1210
connectString: process.env.DB_CONNECT_STRING,
1311
};
1412

1513

16-
// Establece la función para realizar consultas a la base de datos Oracle
1714
function queryDB(query, values = []) {
1815
return new Promise((resolve, reject) => {
1916
oracledb.getConnection(connection, (error, connection) => {
2017
if (error) {
2118
reject(error);
2219
} else {
23-
connection.execute(query, values, (error, result) => {
20+
connection.execute(query, values, (error, result) => {
2421
connection.close(() => {
2522
if (error) {
2623
reject(error);
@@ -47,13 +44,11 @@ function queryDB(query, values = []) {
4744
}
4845

4946
module.exports = defineConfig({
50-
// Ajusta el tiempo de espera predeterminado en milisegundos
5147
defaultCommandTimeout: 5000,
5248
pageLoadTimeout: 10000,
5349
e2e: {
54-
// Al iniciar la prueba esta será la url base
5550
baseUrl: "https://cert-providers.flypass.com.co/",
56-
env:{
51+
env: {
5752
allure: true,
5853
allureReuseAfterSpec: true,
5954
},
@@ -66,7 +61,7 @@ module.exports = defineConfig({
6661
config.env.COGNITO_CLIENT_ID = process.env.COGNITO_CLIENT_ID;
6762

6863
on("task", {
69-
queryDatabase({ query,values }) {
64+
queryDatabase({ query, values }) {
7065
return queryDB(query, values);
7166
},
7267
async awsSetTemporaryCredentials() {
@@ -79,7 +74,7 @@ module.exports = defineConfig({
7974
return credentials;
8075
}
8176
});
82-
return config;
77+
return config;
8378
},
8479
},
8580
});

cypress/e2e/CreateEntryStep.cy.js

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,37 @@
1-
import {EntryService} from "../support/page_objects/EntryService";
1+
import { EntryService } from "../support/page_objects/EntryService";
22
import { EntryDataGenerator } from "../support/utils/EntryDataGenerator";
33
import { EntryAsserts } from "../support/assertions/EntryAsserts";
44
import { DatabaseAsserts } from "../support/assertions/DatabaseAsserts";
5-
65

7-
describe('Crear entrada a un parqueadero de Mitte', function () {
8-
9-
const testCases=[
6+
7+
describe('Crear entrada a un parqueadero de Mitte', function () {
8+
9+
const testCases = [
1010
{
11-
description: 'Validar la entrada exitosa de un vehículo a un parqueadero mite con el servicio de Flypass',
11+
description: 'Validar la entrada exitosa de un vehículo a un parqueadero Mitte con el servicio de Flypass',
1212
dataToUse: EntryDataGenerator.getAuthorizedEntry(),
13-
validator: (response,data)=>{
13+
validator: (response, data) => {
1414
EntryAsserts.validateSuccessResponse(response);
1515
DatabaseAsserts.validateTransactionEntry(data.sessionId)
1616
}
1717
},
1818
{
1919
description: 'Validar la entrada RECHAZADA por placa no autorizada',
2020
dataToUse: EntryDataGenerator.getUnauthorizedEntry(),
21-
validator: (respone, data)=>{
22-
EntryAsserts.validateUnauthorizedResponse(respone)
23-
}
21+
validator: (response, data) => {
22+
EntryAsserts.validateUnauthorizedResponse(response)
23+
}
2424
}
2525
]
2626

2727
testCases.forEach((testCase) => {
28-
it(testCase.description, function() {
28+
it(testCase.description, function () {
2929
const entryData = testCase.dataToUse;
3030

3131
EntryService.sendEntry(testCase.dataToUse, this.idToken)
32-
.then((response)=>{
33-
testCase.validator(response, entryData);
34-
})
32+
.then((response) => {
33+
testCase.validator(response, entryData);
34+
})
3535
});
3636
});
37-
});
37+
});

0 commit comments

Comments
 (0)