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ã
- Nó ở lại trong lịch sử. Xóa một tệp nhị phân sau này không làm bản clone nhỏ đi, vì mọi phiên bản của nó vẫn còn đó.
- Diff không cho thấy cái gì đã đổi. Người review thấy một tệp PDF khác đi và không biết gì thêm. Công thức thì đổi một dòng.
- Tệp lớn không vừa. GitHub từ chối một lần push có tệp lớn hơn 100 MB, nên bài kiểm thử giới hạn tải lên 500 MB không có gì để commit.
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:
3- công thức không hợp lệ. Không có gì được ghi, và mọi vấn đề đều được nêu4- định dạng không làm được điều được yêu cầu, ví dụ kích thước dưới mức nhỏ nhất của nó6- không đủ dung lượng đĩa7-tfg verifytìm thấy một tệp không khớp với manifest của nó8- lần chạy đã xong, nhưng không phải mọi thứ đều được tạo ra
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
- Tệp kiểm thử bị hỏng thêm vào cùng công thức những tệp cố ý làm hỏng.
- Các trường hợp sử dụng cho thấy một lần chạy trong pipeline còn kiểm tra được gì nữa.
- Tài liệu có mọi lệnh, mọi khóa công thức và mọi mã thoát.