الاختبار ومرجع 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، وما يجب أن يتطابق:
{
"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 من تقرير اختبار الدخان بمقارنته بالحدود المضمّنة في المستودع.