测试.
DXPR Builder 有四种自动化检查:编辑器的 Puppeteer 测试、Drush 命令的 Bash 端到端测试、独立 dxpr_maven 仓库中的 Selenium 视觉回归套件,以及代码检查。本页列出每种、本地运行方法和 CI 运行方法。
有哪些检查
| 检查 | 位置 | 运行于 |
|---|---|---|
| 编辑器控制台和布局测试 | test/test-editor.js |
改动 JavaScript、HTML 或 test/ 的拉取请求(.github/workflows/fe-test.yaml) |
| Drush 端到端测试 | scripts/drush-e2e/ |
改动 PHP、YAML 或 Markdown 的拉取请求(.github/workflows/review.yaml) |
| Selenium 视觉回归套件 | dxpr_maven 仓库 |
PR 评论命令(.github/workflows/e2e-command.yaml、e2e-bs3-command.yml、e2eV2-command.yaml) |
| PHP 编码规范(phpcs) | scripts/linters/run-drupal-lint.sh、phpcs.xml.dist |
改动 PHP、YAML 或 Markdown 的拉取请求;每次推送到 3.x |
| PHPStan | scripts/linters/run-drupal-check.sh |
改动 PHP、YAML 或 Markdown 的拉取请求;每次推送到 3.x |
| ESLint、Stylelint、Rust Clippy | scripts/linters/ |
拉取请求,按改动路径筛选 |
| 弃用检测器 | .github/workflows/deprecations.yml |
拉取请求改动了 js/ 或 dxpr_builder/build/ |
文档检查(markdownlint、check_docs.py、Vale) |
.markdownlint-cli2.yaml、docs/lint/、.vale.ini |
改动 docs/ 的拉取请求(review.yaml) |
仓库中唯一的 PHPUnit 测试是旧媒体子模块的 modules/dxpr_builder_media/tests/src/FunctionalJavascript/MediaEntityBrowserTest.php。没有 GitHub 工作流运行它;drupal.org GitLab 流水线(.gitlab-ci.yml)使用标准 DrupalCI 模板,那里的 PHPUnit 任务没有关闭。
编辑器控制台测试
test/test-editor.js 在 3000 端口启动静态服务器(test/start-standalone-server.js),在无头 Chrome 中打开 test/standalone-editor/ 的四个独立页面:test-bs5-anon.html、test-bs5-cms-block.html、test-bs5-editor.html 和 test-bs5-clean-html.html。以下情况失败:
- 页面抛出 JavaScript 错误;
- 完整编辑器 2000 毫秒内未就绪,或加载后仍有屏幕外控件延迟(性能门);
- 强力用户模式下元素控件重叠(基线为零对重叠);
- 完整编辑器页面的已保存 HTML 大于 32094 个字符的基准;
- 页面专属检查失败,例如干净 Bootstrap HTML 的解析、面包屑、Panel 类型、本地视频 Muted 设置或 CMS 区块预览。
页面加载 dxpr_builder/ 中的构建文件,因此先构建。
-
安装依赖:
npm install -
构建编辑器包。CI 脚本按此顺序运行这些任务(
test/scripts/run-fe-tests.sh):npx grunt concat npx grunt exec:gen npx grunt babel npx grunt terser npx grunt sass npx grunt postcss -
运行测试:
npm run fe-test用
npm run fe-test:headed观看浏览器,用npm run fe-test:dev只提供独立页面不运行断言。
CI 中 .github/workflows/fe-test.yaml 通过 Docker 运行同样的测试:
docker compose --profile fe-test run --rm fe-test
Drush 端到端测试
scripts/drush-e2e/run-e2e-tests.sh 在 Composer 容器中用 SQLite 安装全新的 Drupal 11 网站,将模块符号链接进去,启用它,用 dxpr_builder_text 格式化器创建 Basic page 内容类型、页面模板和用户模板,再运行每个 scripts/drush-e2e/test-*.sh 文件:
| 文件 | 测试的命令 |
|---|---|
test-cleartext-key-update.sh |
更新 9026 清除 Key 模块存储下遗留的明文产品密钥,所选 Key 不存在时保留(cleartext-key-update.php) |
test-cms-cache-tags.sh |
区块和视图列表的缓存失效(cms-cache-tags.php) |
test-elements.sh |
drush dxb:element:list |
test-migration-summary.sh |
迁移列摘要的单复数措辞(migration-summary.php) |
test-migrations.sh |
drush dxb:migrate 和内容迁移回归(migration-regressions.php) |
test-page-controller.sh |
页面控制器为其路由的构建(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 |
Drag and Drop Page 模块装齐它列出的所有配置(page-module.php) |
test-profile-buttons.sh |
构建器档案的文本编辑器按钮(profile-buttons.php) |
test-profile-order.sh |
哪个档案按权重适用,以及档案列表的顺序(profile-order.php) |
test-settings-form.sh |
在 General Settings 上保存和验证产品密钥,及其触发的许可证同步(settings-form.php) |
test-setup-ai.sh |
drush dxb:setup-ai |
test-templates.sh |
drush dxb:template:list |
test-user-licenses-page.sh |
许可证卡片在 User Licenses 上显示一次,在 People 上仍显示(user-licenses-page.php) |
test-user-settings.sh |
每位编辑人员自己的编辑器设置(user-settings.php) |
test-user-templates.sh |
drush dxb:user-template:list、drush dxb:user-template:create |
运行全部:
docker compose --profile drush-e2e run --rm e2e-test
传入部分文件名运行单个文件;脚本匹配 scripts/drush-e2e/test-*<filter>*.sh:
docker compose --profile drush-e2e run --rm e2e-test page-create
添加测试时,创建 scripts/drush-e2e/test-<name>.sh,调用 section "<Title>",并使用 scripts/drush-e2e/_helpers.sh 的辅助函数:assert_success、assert_fail、assert_eq、assert_has、assert_not_empty、assert_runs 和 assert_dry_run。每个辅助函数接受描述和命令字符串。
CI 中该套件是 .github/workflows/review.yaml 的“Run Drush E2E tests”任务。拉取请求更改 .php、.module、.inc、.install、.yml、.md、composer.json 或 composer.lock 文件时运行。
Selenium 视觉回归套件
浏览器测试是 dxpr_maven 仓库中的 Java TestNG 套件。它们针对 docker-compose.test.yml 定义的 Docker 栈(Selenium 中心、Chrome 节点和 Maven 容器),在从本仓库安装的网站上运行。您不从本地检出运行它们;从拉取请求评论触发。.github/workflows/command-dispatcher.yml 将评论转为工作流运行。
| 命令 | 套件 | 工作流 |
|---|---|---|
/e2e |
chrome.editor.bs5.parallel.xml 加匿名 BS5 套件 |
e2e-command.yaml |
/e2e-bs3 |
chrome.editor.bs3.parallel.xml |
e2e-bs3-command.yml |
/e2eV2 |
DXPR CMS 栈上的 BS5 编辑器和匿名套件 | e2eV2-command.yaml |
/qa-demo-2x-dxpr_theme6x-tests |
带 DXPR Theme 6.x 的 QA 演示 | qa-demo-2x-dxpr_theme6x-tests-command.yaml |
选项见 CONTRIBUTING.md:
groups=row-element-test,icon-element-test运行套件 XML 中命名的<test name="...">分组。tests=RowColumnLayoutVisualTest运行命名的测试类。maven_ref=branch-name使用dxpr_maven分支,构建器改动与其测试更新一起检查的方式。
工作流上传 target/reports/** 和截图作为构建产物,并将结果作为评论发到拉取请求,列出失败或只在重试中通过的测试。每个套件任务 90 分钟超时。
代码检查与静态分析
每个检查是 Docker Compose 服务,因此除 Docker 外无需本地工具链。
| 服务 | 命令 | 检查内容 |
|---|---|---|
drupal-lint |
docker compose run --rm drupal-lint |
phpcs,PHPCompatibility(PHP 8.3 及以上)、Drupal 和 DrupalPractice 规范 |
drupal-check-D11 |
docker compose run --rm drupal-check-D11 |
PHPStan 5 级,带 mglaman/phpstan-drupal,全新 drupal/recommended-project |
eslint |
docker compose run --rm eslint |
ESLint 覆盖 js/ 和 dxpr_builder/build/,拼写检查覆盖 dxpr_builder/extracted_t_functions.js |
stylelint |
docker compose run --rm stylelint |
Stylelint 检查 dxpr_builder/sass/ 和 sass/ |
rust-lint |
docker compose run --rm rust-lint |
Clippy 检查 Rust 源码 rust/ |
no-jquery、no-underscore、html-in-js |
docker compose run --rm <service> |
弃用检测器来自 .github/workflows/deprecations.yml |
phpcs、ESLint 和 Stylelint 有自动修复变体(drupal-lint-auto-fix、eslint-auto-fix、stylelint-auto-fix)。同样的检查不用 Docker 也可用:npm run lint:scss、npm run lint:no-jquery、npm run lint:no-underscore 和 npm run lint:html-in-js。
npm install 还安装 Husky pre-commit 钩子(.husky/pre-commit)。它对暂存的 JavaScript、PHP 和 SCSS 文件及 Rust 源码运行匹配的自动修复和检查服务,还运行 docs/video-tools/bin/lint-videos.mjs(暂存 docs/ 下的文件时)。
.github/workflows/review.yaml 在每个拉取请求上运行匹配改动路径的检查。.github/workflows/main.yaml 在每次推送时运行 drupal-lint、eslint、drupal-check-D11 和 rust-lint(推送到 3.x 时)。两者在检查失败时让构建失败,并写带问题文件的摘要。