Testing Files Generator
العربية

كيف تولّد ملفات الاختبار في خط CI

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

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

ثبّت tfg، وشغّل tfg generate fixtures.yaml --out ./fixtures قبل الاختبارات، وtfg verify ./fixtures/manifest.json بعدها. كلتا الخطوتين تُفشلان البناء من تلقاء نفسيهما، برمز خروج يقول السبب.

لماذا لا نودعها

لماذا لا ينبغي أن يعيش الملف الثابت في المستودع

الذي يُودَع هو الوصفة. الوصفة نفسها مع البذرة نفسها تكتب البايتات نفسها على أي جهاز، فالملف المولَّد في الخط هو الملف الذي كان عندك على حاسوبك المحمول.

الوصفة

وصفة تعيش بجانب الاختبارات

تكتب هذه خمسًا وعشرين فاتورة ينبغي قبولها وصورتين فوق الحد ينبغي رفضهما، ويسجّل البيان التوقعين معًا:

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

حين يصبح أحمر

ما الذي يُفشل خطوة، ولماذا

لكل نهاية رمز خروج خاص بها، فتفشل الخطوة من تلقاء نفسها ويقول السجل أيّها كان. هذه هي التي يصادفها الخط:

التشغيل الفاشل لا يطبع شيئًا على الخرج القياسي، فلا يحسب محلل السجلات خطأً بيانات أبدًا. الجدول الكامل في صفحة التوثيق.

PowerShell

سكربت PowerShell يحتاج سطرًا إضافيًا

لا ينقل PowerShell رمز خروج برنامج إلى خارج ملف .ps1. شغّل واحدًا بـ -File فيجيب السكربت 0 حتى حين رفضت الأداة داخله العمل، فيتحول بناء كان ينبغي أن يكون أحمر إلى أخضر. السطر الأخير هو الإصلاح كله:

tfg generate fixtures.yaml --out ./fixtures
exit $LASTEXITCODE

هكذا يتصرف PowerShell، وليس في الأمر شيء يخص هذه الأداة. أما cmd وbash وzsh فلا تحتاج إلى شيء إضافي.

عدة مهام

مشاركة الملفات الثابتة بين المهام

لا حاجة عادةً إلى رفعها. لأن الوصفة نفسها تكتب البايتات نفسها، تستطيع كل مهمة تشغيل tfg generate الخاص بها، وهذا أسرع من الرفع ثم التنزيل. وحين تحتاج مهمة إلى استلام ملفات من أخرى، شغّل tfg verify على البيان بعد النقل، فيخبرك هل ما وصل هو ما كُتب.

التالي

إلى أين من هنا