انتقل إلى المحتوى

الاختبار ومرجع git

تتعامل Pitmaster مع الملف الثنائي المعتمد git بوصفه مرجعًا: إذا قبل git ما يكتبه Pitmaster، وقرأ Pitmaster ما يكتبه git، يكون السلوك صحيحًا. توجد بنية الاختبارات في مستودع Pitmaster. لا تتضمن حزمة Composer سوى src/ وbin/pitmaster، لذا شغّل كل ما يلي من نسخة مستنسخة بعد composer install.

مجموعات الاختبارات

الأمر ما الذي يشغّله هل يحتاج إلى git
composer test:unit مجموعة PHPUnit unit: اختبارات مكونات معزولة لا
composer test:integration مجموعة PHPUnit integration: Pitmaster وgit يعملان على المستودعات نفسها نعم
composer test:oracle bin/test-regression: كل سيناريوهات المرجع نعم
composer test PHPUnit (المجموعتان) واختبار تراجع المرجع نعم
./bin/verify-all composer verify: أدلة الدعم، والانحراف عن upstream، وأثر الإثبات، واختبار الدخان للطفرات، وcomposer audit وPHPStan ومعايير البرمجة وcomposer test نعم

تشغّل CI مجموعة اختبارات الوحدة على إصدارات PHP متعددة، ومجموعة التكامل، واختبار تراجع المرجع (PITMASTER_TEST_JOBS=4)، وفحوص أدلة الدعم والانحراف عن upstream.

سيناريوهات المرجع

كل سيناريو هو مجلد ضمن scenarios/<category>/ (المجموع 761، منها 156 كُتبت لـ Pitmaster و605 استُوردت من تطبيقات Git أخرى):

الكود
scenarios/diff/diff-add-lines/
  scenario.json   # commands and expectations
  setup.sh        # builds the starting repository
  oracle/         # outputs captured from git

يحدد scenario.json الأمر الذي يجب تشغيله باستخدام git والأمر المكافئ Pitmaster، وما يجب أن يتطابق:

JSON
{
    "name": "diff-add-lines",
    "category": "diff",
    "operations": ["diff"],
    "oracle_commands": { "diff": "git -c color.ui=never diff" },
    "actual_commands": { "diff": "php \"{{ROOT}}/bin/pitmaster\" diff | perl -pe 's/\\e\\[[0-9;]*m//g'" },
    "expectations": { "exact_match": ["diff"], "fsck_clean": true }
}

ينسخ التشغيل المستودع الذي أنشأه setup.sh، ثم يشغّل أوامر المرجع وPitmaster على نسخ منفصلة، ويقارن المخرجات والكائنات والمراجع والسجل. كما يتطلب fsck_clean أن يقبل git fsck المستودع الذي كتبه Pitmaster. يُلتقط خرج المرجع من git إذا كان مفقودًا أو عند تحديثه؛ وإلا فتُستخدم ملفات oracle/ المضمّنة في المستودع.

يغطي السيناريو الحالات التي ينشئها الإعداد فقط. فمثلًا، تقارن سيناريوهات diff الملفات المعدّلة، ولهذا لا ترصد اختلافات خرج diff للملفات الجديدة والمحذوفة والثنائية المدرجة في Diff.

العمل مع السيناريوهات

سطر الأوامر
./bin/test-scenario <name>                 # oracle, actual, compare for one scenario
./bin/test-regression                      # all scenarios
./bin/test-regression --jobs 4             # in parallel (or PITMASTER_TEST_JOBS=4)
./bin/test-regression --category diff      # one category
./bin/test-regression --fast               # pass/fail only, no reports

./bin/oracle <name>                        # capture git output for a scenario
./bin/oracle --refresh <name>              # re-capture, for example after a git upgrade
./bin/actual <name>                        # run Pitmaster and capture its output
./bin/compare <name>                       # compare oracle and actual output

للتحقق من عدة إصدارات من git، أدرجها في PITMASTER_TEST_GIT_BINARIES وشغّل اختبار الدخان:

سطر الأوامر
PITMASTER_TEST_GIT_BINARIES=/path/to/git-2.45:/path/to/git-2.46 \
  vendor/bin/phpunit --filter MultiGitVersionSmokeTest

مجموعات الاختبارات upstream

استُوردت السيناريوهات ضمن scenarios/upstream/ من مجموعات اختبارات تطبيقات أخرى: مجموعة اختبارات git نفسها (412)، وisomorphic-git (71)، وlibgit2 (63)، وgo-git (46)، وJGit (7)، وdulwich (6). توجد أشجار ملفات الاختبار اللازمة ضمن fixtures/upstream/، لذا تعمل المجموعة كاملةً من نسخة مستنسخة حديثًا دون اتصال بالشبكة أو الاعتماد على مسارات محلية خاصة بالجهاز. وتعثر عليها نصوص الإعداد عبر متغير البيئة PITMASTER_ROOT.

يتحقق composer verify:drift (bin/audit-upstream-drift) من ربط كل حالة upstream مضمّنة بسيناريو.

مصفوفة الدعم

يسرد SUPPORT_MATRIX.md في المستودع كل ميزة git ضمن النطاق وحالتها:

الحالة المعنى
DONE منفذة وتم التحقق منها بمرجع ضمن نطاق التكافؤ المعلن
PART منفذة جزئيًا
TODO ضمن النطاق ولم تُنفذ بعد
DEFER غير مخطط لها حاليًا
N/A خارج النطاق

ينشئ bin/support-matrix الملف من config/support-matrix.json. ويربط config/support-evidence.json كل صف DONE وPART باختبارات وسيناريوهات مرجعية محددة، ويفشل composer verify:evidence إذا لم يكن للصف أي دليل. يعيد CI إنشاء المصفوفة ويفشل إذا اختلف الملف الملتزم به.

يعني صف DONE أن السيناريوهات المسجلة له تطابق git. وقد يظل السلوك مختلفًا خارج هذه السيناريوهات؛ وتُسجّل الاختلافات المعروفة في متعقّب المشكلات.

قياسات الأداء

تستخدم أعمال تحسين الأداء أداة الاختبار ضمن bench/:

سطر الأوامر
composer bench -- --suite=smoke --runs=1 --warmups=0   # quick check
composer bench:baseline                                # full report
composer bench:compare -- <before.json> <after.json>   # compare two reports
composer bench:verify -- <report.json> bench/reports/smoke-thresholds.json

يتحقق CI من تقرير اختبار الدخان بمقارنته بالحدود المضمّنة في المستودع.