---
url: 'https://dxpr.com/ar/hc/documentation/learn-dxpr-builder/development/testing'
title: 'الاختبار | DXPR'
author:
  name: Jurriaan
  url: 'https://dxpr.com/users/jurriaan'
date: '2026-10-24T01:25:39+00:00'
updated: '2026-10-24T09:09:48+00:00'
copyright: 'Copyright DXPR. All rights reserved.'
type: article
summary: |-
  يملك DXPR Builder أربعة أنواع من الفحوص الآلية: اختبار Puppeteer
  للمحرّر، واختبارات Bash الشاملة لأوامر Drush، ومجموعة Selenium للانحدار البصري
  في مستودع dxpr_maven المنفصل، والمدققات. تسرد هذه الصفحة كلًا منها
  وكيفية تشغيله محليًا وكيفية تشغيله في 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-24T09:09:48+0000'
  'image:alt': 'DXPR, powered by Drupal: AI-powered Drupal for marketers.'
schema:
  '@context': 'https://schema.org'
  '@graph':
    -
      mainEntity: {  }
    -
      '@type': TechArticle
      headline: الاختبار
      description: |-
        يملك DXPR Builder أربعة أنواع من الفحوص الآلية: اختبار Puppeteer
        للمحرّر، واختبارات Bash الشاملة لأوامر Drush، ومجموعة Selenium للانحدار البصري
        في مستودع dxpr_maven المنفصل، والمدققات. تسرد هذه الصفحة كلًا منها
        وكيفية تشغيله محليًا وكيفية تشغيله في CI.
      image:
        '@type': ImageObject
        url: 'https://dxpr.com/themes/custom/dxpr_com/images/dxpr-share-card.jpg'
        width: '1200'
        height: '630'
      datePublished: '2026-10-24T01:25:39+0000'
      dateModified: '2026-10-24T09:09:48+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/ar/hc/documentation/learn-dxpr-builder/development/testing'
      articleSection: Tooling
    -
      '@type': WebPage
      '@id': 'https://dxpr.com/ar/hc/documentation/learn-dxpr-builder/development/testing'
      description: |-
        يملك DXPR Builder أربعة أنواع من الفحوص الآلية: اختبار Puppeteer
        للمحرّر، واختبارات Bash الشاملة لأوامر Drush، ومجموعة Selenium للانحدار البصري
        في مستودع dxpr_maven المنفصل، والمدققات. تسرد هذه الصفحة كلًا منها
        وكيفية تشغيله محليًا وكيفية تشغيله في CI.
      breadcrumb:
        '@type': BreadcrumbList
        itemListElement:
          -
            '@type': ListItem
            position: 1
            name: الرئيسية
            item: 'https://dxpr.com/ar'
      publisher:
        '@type': Organization
        '@id': 'https://dxpr.com/#organization'
        name: DXPR
      inLanguage: ar
---
[Help Center](/ar/hc)/[Documentation](/ar/hc/documentation) /[Learn DXPR Builder](/hc/documentation/learn-dxpr-builder) /[Extend](/hc/documentation/learn-dxpr-builder/extend) /[Tooling](/hc/documentation/learn-dxpr-builder/extend/tooling) # الاختبار.

 Learn DXPR BuilderExtendTooling

   ## In this guide

 Related guides

- [المساهمة](/ar/hc/documentation/learn-dxpr-builder/development/contributing)
- [أوامر Drush](/ar/hc/documentation/learn-dxpr-builder/development/drush-commands)

يملك DXPR Builder أربعة أنواع من الفحوص الآلية: اختبار Puppeteer للمحرّر، واختبارات Bash الشاملة لأوامر Drush، ومجموعة Selenium للانحدار البصري في مستودع `dxpr_maven` المنفصل، والمدققات. تسرد هذه الصفحة كلًا منها وكيفية تشغيله محليًا وكيفية تشغيله في 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` (مستودع) | أوامر تعليقات طلبات السحب (`.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`) ويفتح أربع صفحات مستقلة من `test/standalone-editor/` في Chrome دون واجهة: `test-bs5-anon.html` و`test-bs5-cms-block.html` و `test-bs5-editor.html` و`test-bs5-clean-html.html`. فيفشل عندما:

- ترمي صفحة خطأ JavaScript؛
- لا يجهز المحرّر الكامل خلال 2000 مللي ثانية، أو لا تبقى عناصر تحكم خارج الشاشة مؤجلة بعد التحميل (بوابة الأداء)؛
- تتداخل عناصر تحكم العناصر في وضع المستخدم المتمرس (الأساس صفر أزواج متداخلة)؛
- يكون HTML المحفوظ لصفحة المحرّر الكامل أكبر من المرجع البالغ 32,094 حرفًا؛
- يفشل فحص خاص بصفحة، مثل تحليل HTML النظيف لـ Bootstrap أو مسار التنقل أو أنواع اللوحات أو إعداد **كتم الصوت**للفيديو المحلي أو معاينة كتلة CMS.

تحمّل الصفحات الملفات المبنية من `dxpr_builder/`، فابنوا أولًا.

1. ثبّتوا الاعتماديات:

    ```bash
    npm install

    ```
2. ابنوا حزمة المحرّر. يشغّل نص CI هذه المهام بهذا الترتيب (`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. شغّلوا الاختبار:

    ```bash
    npm run fe-test

    ```

    استخدموا `npm run fe-test:headed` لمشاهدة المتصفح، و `npm run fe-test:dev` لتقديم الصفحات المستقلة دون تشغيل التأكيدات.

في CI، يشغّل `.github/workflows/fe-test.yaml` الاختبار نفسه عبر Docker:

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

```

## اختبارات Drush الشاملة

`scripts/drush-e2e/run-e2e-tests.sh` يثبّت موقع Drupal 11 جديدًا مع SQLite داخل حاوية Composer، ويربط الوحدة فيه رمزيًا، ويفعّلها، وينشئ نوع محتوى صفحة أساسية بالمُنسِّق `dxpr_builder_text` وقالب صفحة وقالب مستخدم، ثم يشغّل كل ملف `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` | تشحن وحدة صفحة السحب والإفلات كل إعداد تسرده (`page-module.php`) |
| `test-profile-buttons.sh` | أزرار محرر النصوص لملفات المنشئ (`profile-buttons.php`) |
| `test-profile-order.sh` | أي ملف ينطبق حسب الترتيب، وترتيب قائمة الملفات (`profile-order.php`) |
| `test-settings-form.sh` | حفظ مفتاح المنتج والتحقق منه على **الإعدادات العامة**، ومزامنة الترخيص التي يشغّلها (`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-page.php`) |
| `test-user-settings.sh` | إعدادات المحرّر الخاصة بكل محرّر (`user-settings.php`) |
| `test-user-templates.sh` | `drush dxb:user-template:list` و`drush dxb:user-template:create` |

شغّلوها كلها:

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

```

شغّلوا ملفًا واحدًا بتمرير جزء من اسمه؛ فيطابق النص `scripts/drush-e2e/test-*<filter>*.sh`:

```bash
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 تكون هذه المجموعة مهمة "Run Drush E2E tests" في `.github/workflows/review.yaml`. وهي تعمل عندما يغيّر طلب السحب ملفات `.php` أو `.module` أو `.inc` أو `.install` أو `.yml` أو `.md` أو `composer.json`أو `composer.lock`.

## مجموعة Selenium للانحدار البصري

اختبارات المتصفح مجموعات Java TestNG في مستودع `dxpr_maven`. وهي تعمل مقابل بنية Docker معرّفة في `docker-compose.test.yml` (مركز 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` | مجموعتا محرّر BS5 والمجهول على بنية DXPR CMS | `e2eV2-command.yaml` |
| `/qa-demo-2x-dxpr_theme6x-tests` | عرض ضمان الجودة مع قالب DXPR 6.x | `qa-demo-2x-dxpr_theme6x-tests-command.yaml` |

الخيارات، كما هي موثقة في `CONTRIBUTING.md`:

- `groups=row-element-test,icon-element-test` يشغّل مجموعات `<test name="...">` المُسمّاة من XML المجموعة.
- `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 السابق للالتزام (`.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`. ويفشل كلاهما البناء عند فشل فحص ويكتبان ملخصًا بالملفات المخالفة.

## ما الخطوة التالية؟

- [المساهمة](/ar/hc/documentation/learn-dxpr-builder/development/contributing) لعملية طلب السحب وسير عمل `maven_ref` لتحديثات الاختبار.
- [أوامر Drush](/ar/hc/documentation/learn-dxpr-builder/development/drush-commands) للأوامر التي تتمرن عليها مجموعة Bash.