Ir al contenido

Testing

El motor se prueba con tres herramientas, cada una con un alcance distinto:

Herramienta Alcance Ubicación
PHPUnit Tests unitarios del motor tests/unit/
Playwright Flujos de extremo a extremo en el navegador tests/e2e/
Codeception Tests de aceptación por base de cliente database/{base}/tests/

Los tests unitarios cubren el motor y están organizados por namespace, en espejo de src/: tests/unit/Data/, tests/unit/Parser/, tests/unit/Controller/, etc.

Ventana de terminal
vendor/bin/phpunit

O a través de Composer:

Ventana de terminal
composer test

La configuración está en phpunit.xml: bootstrap en tests/unit/_bootstrap.php, suite única HistrixTestSuit sobre ./tests/unit/, y reporte Allure en build/allure-results.

Para correr un subconjunto:

Ventana de terminal
vendor/bin/phpunit tests/unit/Data/
vendor/bin/phpunit --filter testNombreDelMetodo

En una instalación con Docker, el repositorio está montado en /var/www/html:

Ventana de terminal
docker exec -it histrix vendor/bin/phpunit tests/unit/Parser/

Los tests que tocan la base usan un schema propio (htx_test). Cuando una migración agrega una columna, la base de tests también tiene que recibirla: si un test falla por una columna que no existe, la corrección va en el schema —con su migración— y no adaptando el test al schema viejo.

Un caso recurrente: los tests que crean usuarios fallan con error 1452 de clave foránea cuando HTXPROFILES no tiene el perfil 0 que el valor por omisión de HTXUSERS.Id_perfil espera. Se resuelve sembrando ese perfil:

SET SESSION sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
INSERT INTO HTXPROFILES (Id_perfil, perfil) VALUES (0, 'Deshabilitado');

Los tests de tests/e2e/ recorren flujos completos en un navegador real: login, apertura de programas, grabación y verificación de efectos.

Ventana de terminal
npx playwright test
npx playwright test tests/e2e/profiling.spec.ts
npx playwright test --headed

La configuración está en playwright.config.ts: directorio ./tests/e2e, baseURL http://localhost, proyecto chromium y timeout de 30 segundos.

Un test típico define su base y credenciales, hace login y opera la interfaz:

import { test, expect, Page } from '@playwright/test';
const DB = 'mi_base';
const BASE_URL = 'http://localhost';
async function login(page: Page) {
await page.goto(BASE_URL + '/?base=' + DB);
await page.selectOption('#db', DB);
await page.fill('#username', 'histrix');
await page.fill('#password', 'clave');
await page.click('button[name="ingreso"]');
}

Los tests de aceptación por base validan el resultado final de lo que interpreta Histrix: el formulario generado y sus interacciones.

En database/config.xml, dentro de la base a testear:

<testuser>histrix</testuser>
<testpass>XXXXXXXX</testpass>
<testurl>http://xxx.xxx.xxx.xxx</testurl>
<testhost>xxx.xxx.xxx.xxx</testhost>
Tag Contenido
testuser Usuario con el que se ingresa al sistema
testpass Contraseña de ese usuario
testurl URL del servidor Histrix a usar
testhost IP del servidor de Selenium

El directorio de la base debe tener esta estructura:

database/{base}/
xml/
tests/
acceptance.suite.dist.yml se genera automáticamente
_output/
acceptance/
_bootstrap.php se genera automáticamente
PedidoInternoCest.php

El nombre de la clase termina en Cest y el de cada método de prueba empieza con test:

<?php
class PedidoInternoCest
{
private $numeroPedido;
public function _before(\Step\Acceptance\Admin $I)
{
}
public function _after(AcceptanceTester $I)
{
}
public function testEmisionPedido(\Step\Acceptance\Admin $I)
{
$I->loadXml('pedidoint_simple_ing.xml', 'pedidoint/', 'Emision Pedido');
$I->fillField('artcod', 'ES001');
$I->fillField('cant', '10');
$I->fillField('movref', 'texto de referencia');
$I->click('Crear');
$I->waitForText('KGS=');
$numero = $I->grabValueFrom('nrocom');
$this->numeroPedido = $numero;
$I->click('Procesar');
$I->wait(3);
$I->seeInDatabase('PEDIDOINT', [
'nrocom' => $numero,
'fechaemi' => date('Y-m-d'),
'artcod' => 'ES001',
]);
$I->waitForElement('.pdfFrame', 10);
$I->click('.ui-dialog-titlebar-close');
$I->click('.closetab');
}
}

Además de los métodos del WebDriver de Codeception, hay tres específicos de Histrix:

// Carga un XML en Histrix, haciendo login si hace falta
$I->loadXml('archivo.xml', 'ruta/al/archivo', 'título de la solapa');
// Selecciona la fila que contenga esos valores en cualquiera de sus celdas
$I->clickRowContains(['valor 1', 'valor 2']);
// Selecciona una pestaña interna del formulario por su título
$I->clickFormTab('título del tab');
Ventana de terminal
php histrix test {base} [ArchivoCest.php] [entorno]
php histrix xmltest {archivo} {base}

El entorno define qué configuración de navegador usar:

  • chrome (valor por omisión): busca un servidor Selenium en la dirección declarada en config.xml.
  • chrome-local: usa el Chrome de la máquina; requiere chromedriver.
Ventana de terminal
php histrix test mi_base miTestCest.php chrome-local