@alejandrojca/elmulo-reporter 2.0.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +412 -0
- package/VERSION.json +9 -0
- package/assets/app.css +4457 -0
- package/assets/app.js +3014 -0
- package/assets/donkey-favicon.png +0 -0
- package/assets/donkey-silhouette-white.png +0 -0
- package/assets/donkey-silhouette.png +0 -0
- package/assets/fonts/NotoSans-Variable.ttf +0 -0
- package/assets/fonts/OFL.txt +93 -0
- package/cli.cjs +272 -0
- package/core.cjs +274 -0
- package/executive-pdf.cjs +713 -0
- package/finalize.cjs +982 -0
- package/package.json +65 -0
- package/plugin.cjs +249 -0
- package/rerun.cjs +298 -0
- package/security.cjs +56 -0
- package/server.cjs +569 -0
- package/support.ts +210 -0
package/README.md
ADDED
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
# Elmulo Reporter
|
|
2
|
+
|
|
3
|
+
Elmulo Reporter captura ejecuciones de Cypress y genera un dashboard con
|
|
4
|
+
historial SQLite, tendencias, evidencias, anotaciones y exportación ejecutiva
|
|
5
|
+
en PDF. El reporter se distribuye como un paquete independiente para evitar que
|
|
6
|
+
su implementación viva dentro de los proyectos de pruebas que lo consumen.
|
|
7
|
+
|
|
8
|
+
## Requisitos
|
|
9
|
+
|
|
10
|
+
- Node.js 18 o superior.
|
|
11
|
+
- Cypress 12 o superior cuando se utiliza la integración Cypress.
|
|
12
|
+
|
|
13
|
+
## Instalación
|
|
14
|
+
|
|
15
|
+
Desde GitHub Packages o el registro interno de la organización:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install --save-dev @alejandrojca/elmulo-reporter
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Durante el desarrollo también se puede instalar directamente desde GitHub:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm install --save-dev git+https://github.com/alejandrojca/Elmulo-Reporter.git
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Guía para QA: usar Elmulo en el repositorio Cypress
|
|
28
|
+
|
|
29
|
+
Esta sección explica el flujo completo para una persona que ya tiene el
|
|
30
|
+
repositorio de Cypress descargado en su computadora. No es necesario descargar
|
|
31
|
+
este repositorio de Elmulo por separado ni copiar archivos manualmente.
|
|
32
|
+
|
|
33
|
+
### 1. Abrir una terminal en la carpeta correcta
|
|
34
|
+
|
|
35
|
+
Abrir Git Bash o una terminal desde la carpeta principal del repositorio
|
|
36
|
+
Cypress. Es la carpeta que contiene, entre otros, estos elementos:
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
package.json
|
|
40
|
+
cypress/
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
La ubicación exacta puede ser diferente en cada computadora. Todos estos
|
|
44
|
+
ejemplos son válidos:
|
|
45
|
+
|
|
46
|
+
```text
|
|
47
|
+
C:\Cypress
|
|
48
|
+
D:\Proyectos\acceptance-tests
|
|
49
|
+
C:\Users\usuario\repos\acceptance-tests
|
|
50
|
+
/home/usuario/proyectos/acceptance-tests
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Elmulo no depende de una ruta fija. Lo importante es ejecutar los comandos
|
|
54
|
+
desde la carpeta donde se encuentra `package.json`.
|
|
55
|
+
|
|
56
|
+
### 2. Comprobar las herramientas necesarias
|
|
57
|
+
|
|
58
|
+
Ejecutar:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
node --version
|
|
62
|
+
npm --version
|
|
63
|
+
git --version
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Node.js debe ser versión 18 o superior. Si alguno de los comandos no existe,
|
|
67
|
+
solicitar ayuda para instalar Node.js o Git antes de continuar.
|
|
68
|
+
|
|
69
|
+
En Windows se recomienda usar Git Bash para los comandos de reportes del
|
|
70
|
+
proyecto Cypress, porque esos comandos ejecutan scripts `.sh`.
|
|
71
|
+
|
|
72
|
+
### 3. Actualizar el repositorio Cypress
|
|
73
|
+
|
|
74
|
+
Cambiar a la rama de trabajo y descargar la versión más reciente:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
git switch develop
|
|
78
|
+
git pull origin develop
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Si Git informa que existen cambios locales o conflictos, no eliminarlos sin
|
|
82
|
+
revisarlos. Pedir ayuda al equipo antes de continuar para no perder trabajo.
|
|
83
|
+
|
|
84
|
+
### 4. Instalar las dependencias
|
|
85
|
+
|
|
86
|
+
Ejecutar desde la misma carpeta:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
npm install
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Este comando lee el `package.json` del repositorio Cypress e instala Elmulo
|
|
93
|
+
Reporter junto con las demás dependencias. Debe ejecutarse después de clonar el
|
|
94
|
+
proyecto y cada vez que cambien sus dependencias.
|
|
95
|
+
|
|
96
|
+
Comprobar que Elmulo quedó instalado:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
npm ls @alejandrojca/elmulo-reporter
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
El resultado debe mostrar `@alejandrojca/elmulo-reporter` y su versión. No es
|
|
103
|
+
necesario modificar manualmente la configuración de Cypress si la integración
|
|
104
|
+
ya está incluida en la rama descargada.
|
|
105
|
+
|
|
106
|
+
### 5. Ejecutar las pruebas y generar el reporte
|
|
107
|
+
|
|
108
|
+
Para sandbox, por ejemplo:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
npm run report-sandbox-ecommerce -- "@mtt"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Para QA:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
npm run report-qa-ecommerce -- "@mtt"
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Estos comandos ejecutan Cypress, generan los datos de Cucumber y finalmente
|
|
121
|
+
generan Elmulo. Al terminar debe existir:
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
elmulo-results/
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Si ya existe una ejecución capturada y solamente se necesita regenerar Elmulo:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
npm run elmulo:generate
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### 6. Abrir el dashboard
|
|
134
|
+
|
|
135
|
+
Ejecutar:
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
npm run elmulo:serve
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Abrir en el navegador:
|
|
142
|
+
|
|
143
|
+
```text
|
|
144
|
+
http://127.0.0.1:4178
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Mantener la terminal abierta mientras se usa el dashboard. Para detener el
|
|
148
|
+
servidor, volver a la terminal y presionar `Ctrl+C`.
|
|
149
|
+
|
|
150
|
+
Si el puerto `4178` ya está ocupado, iniciar Elmulo en otro puerto:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
npx elmulo serve 4190
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
En ese caso, abrir `http://127.0.0.1:4190`.
|
|
157
|
+
|
|
158
|
+
### 7. Entender qué sucede con el historial
|
|
159
|
+
|
|
160
|
+
Cada persona tiene su propio directorio `elmulo-results` y su propia base
|
|
161
|
+
`elmulo.sqlite`. Este directorio no se sube a Git, por lo tanto:
|
|
162
|
+
|
|
163
|
+
- hacer `git pull` no descarga el historial de otra persona;
|
|
164
|
+
- clonar el repositorio comienza con un historial local vacío;
|
|
165
|
+
- eliminar `elmulo-results` elimina el historial y las evidencias locales;
|
|
166
|
+
- para trasladar el historial se debe copiar el directorio completo, no sólo
|
|
167
|
+
`elmulo.sqlite`.
|
|
168
|
+
|
|
169
|
+
### Problemas frecuentes
|
|
170
|
+
|
|
171
|
+
#### `elmulo` no se reconoce como comando
|
|
172
|
+
|
|
173
|
+
Ejecutar nuevamente:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
npm install
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Usar `npm run elmulo:generate` o `npx elmulo` en lugar de ejecutar `elmulo`
|
|
180
|
+
directamente desde una terminal cualquiera.
|
|
181
|
+
|
|
182
|
+
#### No existe una ejecución capturada
|
|
183
|
+
|
|
184
|
+
Primero ejecutar uno de los comandos de reporte Cypress, por ejemplo:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
npm run report-sandbox-ecommerce -- "@mtt"
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
#### No aparece el historial de otro integrante
|
|
191
|
+
|
|
192
|
+
Es el comportamiento esperado. Los resultados son locales y están excluidos
|
|
193
|
+
de Git. Para compartirlos se debe transferir el directorio `elmulo-results` por
|
|
194
|
+
un medio externo o utilizar un almacenamiento persistente compartido.
|
|
195
|
+
|
|
196
|
+
### Cambiar la ubicación de los resultados (opcional)
|
|
197
|
+
|
|
198
|
+
Normalmente no es necesario. Si se desea almacenar los resultados en otra
|
|
199
|
+
carpeta, configurar `ELMULO_OUTPUT_DIR` antes de ejecutar Cypress o Elmulo.
|
|
200
|
+
|
|
201
|
+
PowerShell:
|
|
202
|
+
|
|
203
|
+
```powershell
|
|
204
|
+
$env:ELMULO_OUTPUT_DIR = "D:\Reportes\elmulo-results"
|
|
205
|
+
npm run report-sandbox-ecommerce -- "@mtt"
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
Git Bash, Linux o macOS:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
export ELMULO_OUTPUT_DIR="/ruta/reportes/elmulo-results"
|
|
212
|
+
npm run report-sandbox-ecommerce -- "@mtt"
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Integración con Cypress
|
|
216
|
+
|
|
217
|
+
Registrar el plugin dentro de `setupNodeEvents`:
|
|
218
|
+
|
|
219
|
+
```js
|
|
220
|
+
const {
|
|
221
|
+
registerElmuloReporter,
|
|
222
|
+
} = require("@alejandrojca/elmulo-reporter/cypress");
|
|
223
|
+
|
|
224
|
+
module.exports = defineConfig({
|
|
225
|
+
e2e: {
|
|
226
|
+
setupNodeEvents(on, config) {
|
|
227
|
+
registerElmuloReporter(on, config, {
|
|
228
|
+
environment: "sandbox",
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
return config;
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
Si el proyecto utiliza un multiplexor de eventos como `cypress-on-fix`, Elmulo
|
|
238
|
+
debe recibir la función `on` ya envuelta para convivir con los demás plugins.
|
|
239
|
+
|
|
240
|
+
Agregar el soporte del navegador al archivo de soporte de Cypress:
|
|
241
|
+
|
|
242
|
+
```ts
|
|
243
|
+
import "@alejandrojca/elmulo-reporter/support";
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Esto habilita la captura acotada de comandos, la captura de `cy.request` y el
|
|
247
|
+
comando opcional `cy.elmuloAttach(...)`. Los logs generales continúan
|
|
248
|
+
sanitizados y no se persisten `consoleProps`.
|
|
249
|
+
|
|
250
|
+
### Requests y respuestas de pruebas fallidas
|
|
251
|
+
|
|
252
|
+
Elmulo captura automáticamente todos los `cy.request` de todas las features.
|
|
253
|
+
Si la prueba termina fallida, guarda cada request y su respuesta en `run.json`,
|
|
254
|
+
en el HTML generado y en la columna `http_json` de `elmulo.sqlite`. En la
|
|
255
|
+
pestaña **Error**, ambos aparecen cerrados por defecto y pueden desplegarse
|
|
256
|
+
para analizar el problema. Si la prueba termina correctamente, esos datos no
|
|
257
|
+
se conservan.
|
|
258
|
+
|
|
259
|
+
La captura HTTP es deliberadamente literal: **no oculta ni reemplaza ningún
|
|
260
|
+
valor**. Headers, tokens, cookies, credenciales, parámetros y cuerpos quedan en
|
|
261
|
+
texto plano tal como fueron enviados o recibidos. Por eso:
|
|
262
|
+
|
|
263
|
+
- no subir `elmulo-results` a Git;
|
|
264
|
+
- no compartir la base, el HTML ni `runs/` fuera de los canales autorizados;
|
|
265
|
+
- aplicar al directorio de resultados los mismos controles que a las
|
|
266
|
+
credenciales y a los datos del ambiente probado;
|
|
267
|
+
- revisar qué datos se incluirán antes de implementar o utilizar una futura
|
|
268
|
+
integración que cree bugs en Jira.
|
|
269
|
+
|
|
270
|
+
Si un proyecto no puede almacenar estos datos, se puede desactivar la captura
|
|
271
|
+
sin modificar las features.
|
|
272
|
+
|
|
273
|
+
PowerShell:
|
|
274
|
+
|
|
275
|
+
```powershell
|
|
276
|
+
$env:ELMULO_CAPTURE_HTTP = "false"
|
|
277
|
+
npm run report-sandbox-ecommerce -- "@mtt"
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Git Bash, Linux o macOS:
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
ELMULO_CAPTURE_HTTP=false npm run report-sandbox-ecommerce -- "@mtt"
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
También puede configurarse `captureHttp: false` al llamar a
|
|
287
|
+
`registerElmuloReporter`.
|
|
288
|
+
|
|
289
|
+
## Comandos
|
|
290
|
+
|
|
291
|
+
Los comandos se ejecutan desde la raíz del proyecto Cypress consumidor:
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
npx elmulo finalize
|
|
295
|
+
npx elmulo serve
|
|
296
|
+
npx elmulo serve 4178
|
|
297
|
+
npx elmulo retention 50
|
|
298
|
+
npx elmulo demo
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
- `finalize` consolida la última ejecución y actualiza SQLite.
|
|
302
|
+
- `serve` publica el dashboard y las APIs locales.
|
|
303
|
+
- `retention` conserva la cantidad indicada de corridas.
|
|
304
|
+
- `demo` genera datos de demostración.
|
|
305
|
+
|
|
306
|
+
## PDF ejecutivo configurable
|
|
307
|
+
|
|
308
|
+
Desde la pantalla **Resumen**, el botón **Exportar PDF ejecutivo** abre una
|
|
309
|
+
ventana sobre el reporte. Allí se pueden marcar las secciones que formarán el
|
|
310
|
+
documento. La portada, la identificación de la corrida, la fecha de generación
|
|
311
|
+
y la numeración de páginas se incluyen siempre.
|
|
312
|
+
|
|
313
|
+
La selección recomendada incluye resumen, distribución por estado, contexto,
|
|
314
|
+
Features, problemas, comparación, historial, pruebas inestables, fallos
|
|
315
|
+
recurrentes y recomendación. La sección de pruebas más lentas se encuentra
|
|
316
|
+
desmarcada inicialmente.
|
|
317
|
+
|
|
318
|
+
Las secciones ejecutivas se distribuyen en un flujo continuo: una sección puede
|
|
319
|
+
comenzar en el espacio disponible de la página anterior y las tablas se dividen
|
|
320
|
+
solo cuando es necesario. De esta forma, seleccionar o quitar secciones no crea
|
|
321
|
+
una página independiente por cada bloque ni deja páginas finales con una única
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
El puerto predeterminado es `4178`. Puede configurarse mediante
|
|
325
|
+
`ELMULO_PORT`. La salida puede cambiarse con `ELMULO_OUTPUT_DIR`; el plugin y
|
|
326
|
+
la CLI deben utilizar el mismo valor.
|
|
327
|
+
|
|
328
|
+
### Reejecutar una corrida histórica
|
|
329
|
+
|
|
330
|
+
En **Ejecuciones > Tendencia**, seleccionar una corrida muestra la acción
|
|
331
|
+
**Reejecutar reporte**. Elmulo vuelve a lanzar el script npm que originó esa
|
|
332
|
+
corrida y le entrega el mismo ambiente y la misma expresión de tags.
|
|
333
|
+
|
|
334
|
+
Las corridas nuevas registran automáticamente `npm_lifecycle_event`. Si un
|
|
335
|
+
proyecto tiene más de un script de reporte para el mismo ambiente, se puede
|
|
336
|
+
elegir explícitamente el reutilizable:
|
|
337
|
+
|
|
338
|
+
```powershell
|
|
339
|
+
$env:ELMULO_RERUN_SCRIPT = "report-sandbox-ecommerce"
|
|
340
|
+
npm run elmulo:serve
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
También puede declararse `rerunScript` en las opciones de
|
|
344
|
+
`registerElmuloReporter`. El servidor acepta una sola reejecución simultánea y
|
|
345
|
+
lanza npm sin interpolar parámetros en un shell.
|
|
346
|
+
|
|
347
|
+
Si el workflow recibe otros argumentos dinámicos además de tags, deben
|
|
348
|
+
registrarse explícitamente como un array. Se conservan como argumentos
|
|
349
|
+
estructurados y se vuelven a pasar a npm sin concatenarlos:
|
|
350
|
+
|
|
351
|
+
```powershell
|
|
352
|
+
$env:ELMULO_RERUN_ARGS_JSON = '["--browser","chrome","--config","video=false"]'
|
|
353
|
+
npm run report-sandbox-ecommerce
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
La misma configuración puede indicarse mediante `rerunArgs` al registrar el
|
|
357
|
+
plugin. Cuando una corrida guarda `execution.args`, éstos tienen prioridad; si
|
|
358
|
+
no existen, Elmulo conserva la compatibilidad histórica pasando la expresión
|
|
359
|
+
de tags como único argumento posicional. Los parámetros que nunca fueron
|
|
360
|
+
persistidos por corridas antiguas no pueden reconstruirse.
|
|
361
|
+
|
|
362
|
+
El bloqueo de concurrencia pertenece al proceso de `elmulo serve`: evita dos
|
|
363
|
+
reejecuciones desde esa instancia, pero no coordina otros servidores Elmulo que
|
|
364
|
+
apunten al mismo proyecto.
|
|
365
|
+
|
|
366
|
+
## Salida
|
|
367
|
+
|
|
368
|
+
Por defecto, Elmulo crea `elmulo-results` en la raíz del proyecto Cypress:
|
|
369
|
+
|
|
370
|
+
```text
|
|
371
|
+
elmulo-results/
|
|
372
|
+
├── elmulo.sqlite
|
|
373
|
+
├── latest-run.txt
|
|
374
|
+
├── report/
|
|
375
|
+
│ ├── index.html
|
|
376
|
+
│ └── assets/
|
|
377
|
+
└── runs/
|
|
378
|
+
└── <run-id>/
|
|
379
|
+
├── run.json
|
|
380
|
+
├── run.raw.json
|
|
381
|
+
└── media/
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
La base y `runs/` forman una unidad: para migrar o respaldar el historial deben
|
|
385
|
+
conservarse ambos. El directorio de resultados no debe almacenarse en Git; en
|
|
386
|
+
CI debe persistirse como artefacto o montarse sobre un volumen durable.
|
|
387
|
+
|
|
388
|
+
## Datos complementarios
|
|
389
|
+
|
|
390
|
+
Durante `finalize`, Elmulo busca `jsonlogs/cucumber.json` en la raíz del
|
|
391
|
+
proyecto consumidor para enriquecer escenarios con pasos y tags. Si el archivo
|
|
392
|
+
no existe, el reporte se genera con la información nativa de Cypress.
|
|
393
|
+
|
|
394
|
+
Videos y screenshots referenciados por Cypress se copian a la carpeta `media`
|
|
395
|
+
de la corrida, manteniendo el reporte portable.
|
|
396
|
+
|
|
397
|
+
## Desarrollo
|
|
398
|
+
|
|
399
|
+
```bash
|
|
400
|
+
npm install
|
|
401
|
+
npm test
|
|
402
|
+
npm run pack:check
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
La suite utiliza `node:test` y valida normalización de resultados, reintentos,
|
|
406
|
+
SQLite, tendencias, anotaciones, auditoría, sanitización y PDF ejecutivo.
|
|
407
|
+
|
|
408
|
+
## Persistencia y despliegue
|
|
409
|
+
|
|
410
|
+
SQLite funciona bien con una instancia de Elmulo que escribe sobre un volumen
|
|
411
|
+
persistente. Para múltiples réplicas escritoras o ejecuciones concurrentes debe
|
|
412
|
+
incorporarse coordinación o migrarse el almacenamiento a una base cliente-servidor.
|