كيف تولّد ملفات الاختبار في خط CI
الملف الثنائي الثابت في المستودع يبقى في سجله إلى الأبد، ولا يمكن مراجعته في diff، ويصبح مستحيلًا حين يكبر الملف. ولِّد الملفات بدلًا من ذلك داخل الخط من وصفة. الوصفة نص، والبايتات تخرج متطابقة في كل مرة، وخطوة أخيرة تثبت أن شيئًا لم يتحرك.
الجواب المختصر
ثبّت tfg، وشغّل tfg generate fixtures.yaml --out ./fixtures قبل
الاختبارات، وtfg verify ./fixtures/manifest.json بعدها. كلتا الخطوتين تُفشلان
البناء من تلقاء نفسيهما، برمز خروج يقول السبب.
لماذا لا نودعها
لماذا لا ينبغي أن يعيش الملف الثابت في المستودع
- يبقى في السجل. حذف ملف ثنائي لاحقًا لا يصغّر النسخة المستنسخة، لأن كل إصدار منه ما زال هناك.
- الـ diff لا يُظهر ما تغيّر. يرى المراجع أن ملف PDF مختلف ولا شيء غير ذلك. أما الوصفة فتتغيّر بسطر واحد.
- الملفات الكبيرة لا تتسع. يرفض GitHub دفعة تحتوي ملفًا أكبر من 100 ميغابايت، فلا يجد اختبار حد رفع 500 ميغابايت ما يودعه.
الذي يُودَع هو الوصفة. الوصفة نفسها مع البذرة نفسها تكتب البايتات نفسها على أي جهاز، فالملف المولَّد في الخط هو الملف الذي كان عندك على حاسوبك المحمول.
الوصفة
وصفة تعيش بجانب الاختبارات
تكتب هذه خمسًا وعشرين فاتورة ينبغي قبولها وصورتين فوق الحد ينبغي رفضهما، ويسجّل البيان التوقعين معًا:
version: 1
seed: 7741
targets:
- id: invoices
format: pdf
count: 25
size: 300kb
expected: accept
- id: over_the_limit
format: png
count: 2
size: 12mb
expected:
outcome: reject
reason: size_limit
tfg validate fixtures.yaml يفحصها دون أن يكتب شيئًا، ويسمّي كل المشكلات دفعة واحدة.
GitHub Actions
سير عمل يثبّت الأداة ويبني الملفات الثابتة
jobs:
test:
runs-on: ubuntu-latest
env:
TFG_VERSION: "0.4.0"
steps:
- uses: actions/checkout@v4
- name: install tfg
run: |
base=https://github.com/donislawdev/TestingFilesGenerator/releases/download/v$TFG_VERSION
curl -fsSLO "$base/tfg_${TFG_VERSION}_linux_amd64.tar.gz"
curl -fsSLO "$base/verify-SHA256SUMS.txt"
sha256sum --check --ignore-missing verify-SHA256SUMS.txt
tar -xzf "tfg_${TFG_VERSION}_linux_amd64.tar.gz" ./tfg
sudo mv tfg /usr/local/bin/
- name: build the fixtures
run: tfg generate fixtures.yaml --out ./fixtures
- name: run the tests
run: pytest tests/
- name: nothing moved
run: tfg verify ./fixtures/manifest.json
سطر المجموع الاختباري يقارن الأرشيف بالملف verify-SHA256SUMS.txt من الإصدار نفسه.
الإصدار مثبَّت، فلا يغيّر إصدار جديد أبدًا بناءً لم تلمسه.
GitLab CI
الشيء نفسه كمهمة في GitLab
fixtures:
image: ubuntu:24.04
variables:
TFG_VERSION: "0.4.0"
script:
- apt-get update -qq && apt-get install -y -qq curl ca-certificates
- base=https://github.com/donislawdev/TestingFilesGenerator/releases/download/v$TFG_VERSION
- curl -fsSLO "$base/tfg_${TFG_VERSION}_linux_amd64.tar.gz"
- curl -fsSLO "$base/verify-SHA256SUMS.txt"
- sha256sum --check --ignore-missing verify-SHA256SUMS.txt
- tar -xzf "tfg_${TFG_VERSION}_linux_amd64.tar.gz" ./tfg
- ./tfg generate fixtures.yaml --out ./fixtures
- pytest tests/
- ./tfg verify ./fixtures/manifest.json
حين يصبح أحمر
ما الذي يُفشل خطوة، ولماذا
لكل نهاية رمز خروج خاص بها، فتفشل الخطوة من تلقاء نفسها ويقول السجل أيّها كان. هذه هي التي يصادفها الخط:
3- الوصفة غير صالحة. لم يُكتب شيء، ويُسمّى كل خلل4- الصيغة لا تستطيع ما طُلب منها، مثل حجم أقل من أصغر حجم لها6- لا توجد مساحة كافية على القرص7- وجدtfg verifyملفًا لا يطابق بيانه8- انتهى التشغيل لكن لم يُنتَج كل شيء
التشغيل الفاشل لا يطبع شيئًا على الخرج القياسي، فلا يحسب محلل السجلات خطأً بيانات أبدًا. الجدول الكامل في صفحة التوثيق.
PowerShell
سكربت PowerShell يحتاج سطرًا إضافيًا
لا ينقل PowerShell رمز خروج برنامج إلى خارج ملف .ps1. شغّل واحدًا بـ -File
فيجيب السكربت 0 حتى حين رفضت الأداة داخله العمل، فيتحول بناء كان ينبغي أن يكون أحمر
إلى أخضر. السطر الأخير هو الإصلاح كله:
tfg generate fixtures.yaml --out ./fixtures
exit $LASTEXITCODE
هكذا يتصرف PowerShell، وليس في الأمر شيء يخص هذه الأداة. أما cmd وbash
وzsh فلا تحتاج إلى شيء إضافي.
عدة مهام
مشاركة الملفات الثابتة بين المهام
لا حاجة عادةً إلى رفعها. لأن الوصفة نفسها تكتب البايتات نفسها، تستطيع كل مهمة تشغيل tfg
generate الخاص بها، وهذا أسرع من الرفع ثم التنزيل. وحين تحتاج مهمة إلى استلام ملفات من
أخرى، شغّل tfg verify على البيان بعد النقل، فيخبرك هل ما وصل هو ما كُتب.
التالي
إلى أين من هنا
- ملفات اختبار تالفة تضيف إلى الوصفة نفسها ملفات أُتلفت عمدًا.
- حالات الاستخدام تُظهر ما الذي يمكن أن يفحصه تشغيل في خط البناء أيضًا.
- التوثيق يضم كل أمر وكل مفتاح وصفة وكل رمز خروج.