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 กับแมนิเฟสต์หลังการถ่ายโอน แล้วมันจะบอกว่าสิ่งที่มาถึงตรงกับที่เขียนไว้หรือไม่

ถัดไป

จากตรงนี้ไปไหนต่อ