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/ |
Tests unitarios (PHPUnit)
Sección titulada «Tests unitarios (PHPUnit)»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.
vendor/bin/phpunitO a través de Composer:
composer testLa 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:
vendor/bin/phpunit tests/unit/Data/vendor/bin/phpunit --filter testNombreDelMetodoEn una instalación con Docker, el repositorio está montado en /var/www/html:
docker exec -it histrix vendor/bin/phpunit tests/unit/Parser/Base de tests
Sección titulada «Base de tests»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');Tests de extremo a extremo (Playwright)
Sección titulada «Tests de extremo a extremo (Playwright)»Los tests de tests/e2e/ recorren flujos completos en un navegador real: login,
apertura de programas, grabación y verificación de efectos.
npx playwright testnpx playwright test tests/e2e/profiling.spec.tsnpx playwright test --headedLa 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"]');}Tests de aceptación (Codeception)
Sección titulada «Tests de aceptación (Codeception)»Los tests de aceptación por base validan el resultado final de lo que interpreta Histrix: el formulario generado y sus interacciones.
Configuración de la base
Sección titulada «Configuración de la base»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.phpEjemplo
Sección titulada «Ejemplo»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'); }}Helpers propios
Sección titulada «Helpers propios»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');Ejecución
Sección titulada «Ejecución»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 enconfig.xml.chrome-local: usa el Chrome de la máquina; requierechromedriver.
php histrix test mi_base miTestCest.php chrome-localReferencias
Sección titulada «Referencias»- PHPUnit: https://phpunit.de/
- Playwright: https://playwright.dev/
- Codeception WebDriver: https://codeception.com/docs/modules/WebDriver