Testing Files Generator
Tiếng Việt

Cách tạo tệp kiểm thử trong pipeline CI

Một fixture nhị phân trong kho mã nằm lại mãi trong lịch sử của nó, không thể review trong diff và trở nên bất khả thi khi tệp lớn. Hãy tạo tệp ngay trong pipeline từ một công thức. Công thức là văn bản, các byte ra giống hệt mỗi lần, và một bước cuối chứng minh không có gì xê dịch.

Câu trả lời ngắn

Cài tfg, chạy tfg generate fixtures.yaml --out ./fixtures trước các bài kiểm thử và tfg verify ./fixtures/manifest.json sau đó. Cả hai bước tự làm bản dựng thất bại, với một mã thoát nói lý do.

Vì sao không commit

Vì sao fixture không nên nằm trong kho mã

Thứ cần commit là công thức. Cùng công thức và cùng seed ghi ra cùng các byte trên mọi máy, nên tệp tạo trong pipeline chính là tệp bạn có trên laptop.

Công thức

Một công thức nằm cạnh các bài kiểm thử

Công thức này ghi hai mươi lăm hóa đơn phải được chấp nhận và hai ảnh vượt giới hạn phải bị từ chối, và manifest ghi cả hai kỳ vọng:

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 kiểm tra nó mà không ghi gì, và nêu mọi vấn đề cùng một lúc.

GitHub Actions

Một workflow cài công cụ và dựng các fixture

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

Dòng checksum so sánh tệp lưu trữ với verify-SHA256SUMS.txt của cùng bản phát hành. Phiên bản được ghim cố định, nên một bản phát hành mới không bao giờ đổi một bản dựng bạn chưa đụng tới.

GitLab CI

Cùng việc đó dưới dạng job 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

Khi nó chuyển đỏ

Điều gì làm một bước thất bại, và vì sao

Mỗi kết cục có mã thoát riêng, nên bước tự thất bại và nhật ký nói là mã nào. Những mã một pipeline gặp:

Lần chạy thất bại không in gì ra đầu ra chuẩn, nên trình phân tích nhật ký không bao giờ nhầm một lỗi là dữ liệu. Cả bảng nằm ở trang tài liệu.

PowerShell

Script PowerShell cần thêm một dòng

PowerShell không mang mã thoát của một chương trình ra khỏi tệp .ps1. Chạy một script với -File và script trả lời 0 ngay cả khi công cụ bên trong đã từ chối công việc, nên một bản dựng lẽ ra phải đỏ lại thành xanh. Dòng cuối là toàn bộ cách sửa:

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

PowerShell hành xử như vậy, không phải điều gì của công cụ này. cmd, bash và zsh không cần thêm gì.

Nhiều job

Chia sẻ fixture giữa các job

Thường không cần tải chúng lên. Vì cùng công thức ghi cùng các byte, mỗi job có thể chạy tfg generate của riêng nó, nhanh hơn một lần tải lên rồi tải xuống. Khi một job phải nhận tệp từ job khác, hãy chạy tfg verify trên manifest sau khi chuyển, và nó cho biết thứ đến nơi có đúng là thứ đã được ghi không.

Tiếp theo

Đi đâu từ đây