---
url: 'https://dxpr.com/es/hc/documentacion/aprender-dxpr-builder/desarrollo/pruebas'
title: 'Pruebas | DXPR'
author:
  name: Jurriaan
  url: 'https://dxpr.com/users/jurriaan'
date: '2026-10-24T11:18:43+00:00'
updated: '2026-10-24T17:19:22+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: |-
  DXPR Builder tiene cuatro tipos de comprobaciones automáticas: una prueba Puppeteer del
  editor, pruebas Bash de extremo a extremo para los comandos Drush, una suite Selenium
  de regresión visual en el repositorio separado dxpr_maven, y
  linters. Esta página enumera cada una, cómo ejecutarla en local y cómo la
  ejecuta CI.
tags:
  - Tooling
image: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
published: true
og:
  site_name: DXPR
  updated_time: '2026-10-24T17:19:22+0000'
  'image:alt': 'DXPR, powered by Drupal: AI-powered Drupal for marketers.'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      mainEntity: {  }
    -
      '@type': TechArticle
      headline: Pruebas
      description: |-
        DXPR Builder tiene cuatro tipos de comprobaciones automáticas: una prueba Puppeteer del
        editor, pruebas Bash de extremo a extremo para los comandos Drush, una suite Selenium
        de regresión visual en el repositorio separado dxpr_maven, y
        linters. Esta página enumera cada una, cómo ejecutarla en local y cómo la
        ejecuta CI.
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-24T11:18:43+0000'
      dateModified: '2026-10-24T17:19:22+0000'
      author:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
        url: 'https://dxpr.com/'
        logo:
          '@type': ImageObject
          url: 'https://dxpr.com/themes/custom/dxpr_com/dxpr-logo-dark.svg'
          width: '1348'
          height: '501'
      mainEntityOfPage: 'https://dxpr.com/es/hc/documentacion/aprender-dxpr-builder/desarrollo/pruebas'
      articleSection: Herramientas
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/es/hc/documentacion/aprender-dxpr-builder/desarrollo/pruebas'
      description: |-
        DXPR Builder tiene cuatro tipos de comprobaciones automáticas: una prueba Puppeteer del
        editor, pruebas Bash de extremo a extremo para los comandos Drush, una suite Selenium
        de regresión visual en el repositorio separado dxpr_maven, y
        linters. Esta página enumera cada una, cómo ejecutarla en local y cómo la
        ejecuta CI.
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: Inicio
            item: 'https://dxpr.com/es'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: es
---
[Centro de ayuda](/es/hc)/[Documentación](/es/hc/documentacion) /[Aprende DXPR Builder](/es/hc/documentation/learn-dxpr-builder) /[Extender](/es/hc/documentation/learn-dxpr-builder/extend) /[Herramientas](/es/hc/documentation/learn-dxpr-builder/extend/tooling) # Pruebas.

 Aprende DXPR BuilderExtenderHerramientas

   ## En esta guía

 Guías relacionadas

- [Cómo contribuir](/es/hc/documentacion/aprender-dxpr-builder/desarrollo/como-contribuir)
- [Comandos Drush](/es/hc/documentacion/aprender-dxpr-builder/desarrollo/comandos-drush)

DXPR Builder tiene cuatro tipos de comprobaciones automáticas: una prueba Puppeteer del editor, pruebas Bash de extremo a extremo para los comandos Drush, una suite Selenium de regresión visual en el repositorio separado `dxpr_maven`, y linters. Esta página enumera cada una, cómo ejecutarla en local y cómo la ejecuta CI.

## Qué existe

| Comprobación | Dónde vive | Se ejecuta en |
|---|---|---|
| Prueba de consola y diseño del editor | `test/test-editor.js` | Pull requests que tocan JavaScript, HTML o `test/` (`.github/workflows/fe-test.yaml`) |
| Pruebas Drush de extremo a extremo | `scripts/drush-e2e/` | Pull requests que tocan PHP, YAML o Markdown (`.github/workflows/review.yaml`) |
| Suite Selenium de regresión visual | `dxpr_maven` como repositorio | Comandos en comentarios de PR (`.github/workflows/e2e-command.yaml`, `e2e-bs3-command.yml`, `e2eV2-command.yaml`) |
| Estándares de código PHP (phpcs) | `scripts/linters/run-drupal-lint.sh`, `phpcs.xml.dist` | Pull requests que tocan PHP, YAML o Markdown; cada push a `3.x` |
| PHPStan | `scripts/linters/run-drupal-check.sh` | Pull requests que tocan PHP, YAML o Markdown; cada push a `3.x` |
| ESLint, Stylelint, Rust Clippy | `scripts/linters/` | Pull requests, filtrados por rutas cambiadas |
| Detectores de obsolescencia | `.github/workflows/deprecations.yml` | Pull requests que tocan `js/` o `dxpr_builder/build/` |
| Comprobaciones de docs (markdownlint, `check_docs.py`, Vale) | `.markdownlint-cli2.yaml`, `docs/lint/`, `.vale.ini` | Pull requests que tocan `docs/` (`review.yaml`) |

La única prueba PHPUnit en el repositorio es `modules/dxpr_builder_media/tests/src/FunctionalJavascript/MediaEntityBrowserTest.php`para el submódulo de medios heredado. Ningún flujo de GitHub la ejecuta; el pipeline GitLab de drupal.org (`.gitlab-ci.yml`) usa las plantillas estándar DrupalCI, cuyo trabajo PHPUnit no está desactivado ahí.

## Prueba de consola del editor

`test/test-editor.js` arranca un servidor estático en el puerto 3000 (`test/start-standalone-server.js`) y abre cuatro páginas independientes de `test/standalone-editor/` en Chrome headless: `test-bs5-anon.html`, `test-bs5-cms-block.html`, `test-bs5-editor.html` y `test-bs5-clean-html.html`. Falla cuando:

- una página lanza un error JavaScript;
- el editor completo no está listo en 2000 ms, o quedan controles fuera de pantalla diferidos tras la carga (la puerta de rendimiento);
- los controles de elementos se solapan en modo Power user (la base es cero pares solapados);
- el HTML guardado de la página de editor completo es mayor que la referencia de 32.094 caracteres;
- falla una comprobación propia de una página, por ejemplo el análisis de HTML Bootstrap limpio, la miga de pan, los tipos de panel, el ajuste **Muted** de vídeo local o la vista previa de bloque CMS.

Las páginas cargan los archivos compilados desde `dxpr_builder/`, así que compila primero.

1. Instala dependencias:

    ```bash
    npm install

    ```
2. Compila el paquete del editor. El script CI ejecuta estas tareas en este orden (`test/scripts/run-fe-tests.sh`):

    ```bash
    npx grunt concat
    npx grunt exec:gen
    npx grunt babel
    npx grunt terser
    npx grunt sass
    npx grunt postcss

    ```
3. Ejecuta la prueba:

    ```bash
    npm run fe-test

    ```

    Usa `npm run fe-test:headed` para mirar el navegador, y `npm run fe-test:dev` para servir las páginas independientes sin ejecutar aserciones.

En CI, `.github/workflows/fe-test.yaml` ejecuta la misma prueba con Docker:

```bash
docker compose --profile fe-test run --rm fe-test

```

## Pruebas Drush de extremo a extremo

`scripts/drush-e2e/run-e2e-tests.sh` instala un sitio Drupal 11 fresco con SQLite dentro de un contenedor Composer, enlaza el módulo en él, lo habilita, crea un tipo de contenido Basic page con el formato `dxpr_builder_text`, una plantilla de página y una plantilla de usuario, y luego ejecuta cada archivo `scripts/drush-e2e/test-*.sh`:

| Archivo | Comandos bajo prueba |
|---|---|
| `test-cleartext-key-update.sh` | El update 9026 limpia una clave de producto en texto claro dejada en almacenamiento Key module, y la conserva cuando la Key elegida no existe (`cleartext-key-update.php`) |
| `test-cms-cache-tags.sh` | Invalidación de caché de listados de bloques y vistas (`cms-cache-tags.php`) |
| `test-elements.sh` | `drush dxb:element:list` |
| `test-migration-summary.sh` | Redacción en singular y plural del resumen de columna de migración (`migration-summary.php`) |
| `test-migrations.sh` | `drush dxb:migrate` y regresiones de migración de contenido (`migration-regressions.php`) |
| `test-page-controller.sh` | El controlador de página crea para sus rutas (`page-controller.php`) |
| `test-page-create.sh` | `drush dxb:page:create` |
| `test-page-get-update.sh` | `drush dxb:page:get`, `drush dxb:page:update` |
| `test-page-module.sh` | El módulo Drag and Drop Page incluye cada configuración que enumera (`page-module.php`) |
| `test-profile-buttons.sh` | Botones del editor de texto de perfiles del constructor (`profile-buttons.php`) |
| `test-profile-order.sh` | Qué perfil se aplica por peso, y el orden de la lista de perfiles (`profile-order.php`) |
| `test-settings-form.sh` | Guardar y validar la clave de producto en **General Settings**, y la sincronización de licencia que activa (`settings-form.php`) |
| `test-setup-ai.sh` | `drush dxb:setup-ai` |
| `test-templates.sh` | `drush dxb:template:list` |
| `test-user-licenses-page.sh` | La tarjeta de licencia se muestra una vez en **User Licenses** y aún se muestra en **People** (`user-licenses-page.php`) |
| `test-user-settings.sh` | Ajustes de editor propios de cada persona que edita (`user-settings.php`) |
| `test-user-templates.sh` | `drush dxb:user-template:list`, `drush dxb:user-template:create` |

Ejecútalas todas:

```bash
docker compose --profile drush-e2e run --rm e2e-test

```

Ejecuta un archivo pasando parte de su nombre; el script coincide con `scripts/drush-e2e/test-*<filter>*.sh`:

```bash
docker compose --profile drush-e2e run --rm e2e-test page-create

```

Para añadir una prueba, crea `scripts/drush-e2e/test-<name>.sh`, llama a `section "<Title>"`, y usa las ayudas de `scripts/drush-e2e/_helpers.sh`: `assert_success`, `assert_fail`, `assert_eq`, `assert_has`, `assert_not_empty`, `assert_runs` y `assert_dry_run`. Cada ayuda toma una descripción y una cadena de comando.

En CI esta suite es el trabajo "Run Drush E2E tests" en `.github/workflows/review.yaml`. Se ejecuta cuando un pull request cambia archivos `.php`, `.module`, `.inc`, `.install`, `.yml`, `.md`, `composer.json`o `composer.lock`.

## Suite Selenium de regresión visual

Las pruebas de navegador son suites Java TestNG en el repositorio `dxpr_maven`. Se ejecutan contra una pila Docker definida en `docker-compose.test.yml` (hub Selenium, nodos Chrome y un contenedor Maven) en un sitio instalado desde este repositorio. No las ejecutas desde una copia local; las activas desde un comentario en un pull request. `.github/workflows/command-dispatcher.yml` convierte el comentario en una ejecución de flujo.

| Comando | Suite | Flujo |
|---|---|---|
| `/e2e` | `chrome.editor.bs5.parallel.xml` más la suite anónima BS5 | `e2e-command.yaml` |
| `/e2e-bs3` | `chrome.editor.bs3.parallel.xml` | `e2e-bs3-command.yml` |
| `/e2eV2` | Suites BS5 de editor y anónimas en la pila DXPR CMS | `e2eV2-command.yaml` |
| `/qa-demo-2x-dxpr_theme6x-tests` | Entorno de demostración QA con DXPR Theme 6.x | `qa-demo-2x-dxpr_theme6x-tests-command.yaml` |

Opciones, como se documenta en `CONTRIBUTING.md`:

- `groups=row-element-test,icon-element-test` ejecuta los grupos `<test name="...">` nombrados desde el XML de la suite.
- `tests=RowColumnLayoutVisualTest` ejecuta las clases de pruebas nombradas.
- `maven_ref=branch-name` usa una rama `dxpr_maven`, que es como un cambio del constructor y su actualización de pruebas se revisan juntos.

El flujo sube `target/reports/**` y las capturas como artefacto de compilación y publica el resultado como comentario en el pull request, enumerando fallos o pruebas que solo pasaron al reintentar. Cada trabajo de suite tiene un tiempo de espera de 90 minutos.

## Linters y análisis estático

Cada linter es un servicio Docker Compose, así que no se necesita cadena de herramientas local más allá de Docker.

| Servicio | Comando | Qué comprueba |
|---|---|---|
| `drupal-lint` | `docker compose run --rm drupal-lint` | phpcs con PHPCompatibility (PHP 8.3 y superior), estándares `Drupal` y `DrupalPractice` correspondientes |
| `drupal-check-D11` | `docker compose run --rm drupal-check-D11` | PHPStan nivel 5 con `mglaman/phpstan-drupal` dentro de un nuevo `drupal/recommended-project` |
| `eslint` | `docker compose run --rm eslint` | ESLint en `js/` y `dxpr_builder/build/`, más revisión ortográfica de `dxpr_builder/extracted_t_functions.js` |
| `stylelint` | `docker compose run --rm stylelint` | Stylelint en `dxpr_builder/sass/` y `sass/` |
| `rust-lint` | `docker compose run --rm rust-lint` | Clippy en los fuentes Rust en `rust/` |
| `no-jquery`, `no-underscore`, `html-in-js` | `docker compose run --rm <service>` | Detectores de obsolescencia de `.github/workflows/deprecations.yml` |

Existen variantes de corrección automática para phpcs, ESLint y Stylelint (`drupal-lint-auto-fix`, `eslint-auto-fix`, `stylelint-auto-fix`). Las mismas comprobaciones están disponibles sin Docker con `npm run lint:scss`, `npm run lint:no-jquery`, `npm run lint:no-underscore`y `npm run lint:html-in-js`.

`npm install` también instala un hook pre-commit de Husky (`.husky/pre-commit`). Ejecuta los servicios de corrección automática y lint coincidentes en los archivos JavaScript, PHP y SCSS en staging y los fuentes Rust, y `docs/video-tools/bin/lint-videos.mjs` cuando archivos en `docs/` están en staging.

`.github/workflows/review.yaml` ejecuta los linters que coinciden con las rutas cambiadas en cada pull request. `.github/workflows/main.yaml`ejecuta `drupal-lint`, `eslint`, `drupal-check-D11` y `rust-lint` en cada push a `3.x`. Ambos fallan la compilación cuando falla una comprobación y escriben un resumen con los archivos infractores.

## ¿Qué sigue?

- [Cómo contribuir](/es/hc/documentation/learn-dxpr-builder/development/contributing) para el proceso de pull request y el flujo `maven_ref` para actualizaciones de pruebas.
- [Comandos Drush](/es/hc/documentacion/aprender-dxpr-builder/desarrollo/comandos-drush) para los comandos que la suite Bash ejercita.