Đặc tả Lịch sử spectest.log.yaml
spectest.log.yaml là file nhật ký kiểm toán ghi nối tiếp (append-only) của SpecTest. File ghi lại snapshot baseline ban đầu, lưu vết từng bản cập nhật tăng dần và duy trì các mã băm mật mã để đảm bảo tính toàn vẹn của bộ kiểm thử.
Ví dụ Chú giải Chi tiết
base:
at: "2026-10-26T00:00:00+07:00"
by: ai
spectest:
version: 1
input: openapi
servers: [shop]
apis: ["POST {shop}/api/login", "GET {shop}/api/products", "POST {shop}/api/orders"]
analysis: |
Bộ test xác thực phiên trước, sau đó duyệt sản phẩm và tạo đơn hàng.
seed:
credentials:
vars:
email: demo@example.com
password: demo-password
setup:
authenticated_user:
steps:
- call: "POST {shop}/api/login"
body:
email: "{{email}}"
password: "{{password}}"
expect: 200
save:
access_token: body.access_token
scenarios:
- id: list-products
name: Liệt kê sản phẩm với tư cách người dùng đã đăng nhập
setup: [authenticated_user]
steps:
- call: "GET {shop}/api/products"
headers:
Authorization: "Bearer {{access_token}}"
expect: 200
after_hash: 14514a8a7144
update:
- n: 1
at: "2026-10-26T00:05:00+07:00"
by: ai
note: "Thêm kịch bản tạo đơn hàng sau khi cập nhật OpenAPI spec"
trigger:
openapi:
added:
- "POST /api/orders"
impact:
scenarios:
- create-order
change:
- target: scenario
id: create-order
reason: "Phát hiện endpoint mới POST /api/orders trong spec"
before: null
after:
id: create-order
name: Tạo đơn hàng
after_hash: 3b9e4a11f82c
Bảng Tham chiếu Schema
Cấu trúc Root
| Trường | Kiểu | Mô tả |
|---|---|---|
base |
BaseEntry | Snapshot baseline khởi đầu của suite khi được sinh lần đầu tiên. |
update |
array[UpdateEntry] | Danh sách ghi nối tiếp các bản cập nhật tiếp theo. |
Khối base
| Trường | Kiểu | Mô tả |
|---|---|---|
at |
string | Dấu thời gian ISO 8601 khi sinh baseline ban đầu. |
by |
string | Tác giả sinh baseline: "ai" hoặc "user". |
spectest |
Suite | Snapshot toàn bộ đối tượng spectest.yaml khởi điểm. |
after_hash |
string | Mã băm SHA-256 12 ký tự của suite baseline. |
api_catalog |
object | Snapshot các route, operationId và method của OpenAPI tại thời điểm tạo. |
Đối tượng update[]
Mỗi bản cập nhật sẽ nối tiếp một phần tử mới vào mảng update:
| Trường | Kiểu | Mô tả |
|---|---|---|
n |
integer | Số thứ tự phiên bản cập nhật. Bắt đầu từ 1 và tăng liên tục không có khoảng trống (1, 2, 3...). |
at |
string | Dấu thời gian ISO 8601 khi ghi nhận bản cập nhật. |
by |
string | Tác giả cập nhật: "ai" (AI tự vá khi spec đổi) hoặc "user" (người dùng sửa). |
note |
string | Tóm tắt lý do cập nhật bằng ngôn ngữ tự nhiên. |
trigger |
object | Chi tiết nguồn gốc dẫn đến việc cập nhật. |
impact |
object | Danh sách các scenario và setup bị ảnh hưởng trực tiếp (phục vụ cờ --only-changed). |
create |
object | Các thực thể mới được thêm vào (seed, setup, scenarios). |
change |
array[Change] | Chi tiết thay đổi ở cấp độ trường (target, id, reason, before, after). |
after_hash |
string | Mã băm SHA-256 12 ký tự của spectest.yaml ngay sau khi áp dụng bản update này. |
Khối trigger
| Trường | Kiểu | Mô tả |
|---|---|---|
openapi.added |
array[string] | Các endpoint mới được bổ sung vào hợp đồng OpenAPI. |
openapi.changed |
array[string] | Các endpoint có schema, tham số hoặc phản hồi bị thay đổi. |
openapi.removed |
array[string] | Các endpoint bị xóa khỏi đặc tả. |
openapi.restored |
array[string] | Các endpoint từng bị xóa nay được khôi phục lại. |
requirements.before_hash |
string | Mã băm của tài liệu yêu cầu trước khi sửa. |
requirements.after_hash |
string | Mã băm của tài liệu yêu cầu sau khi sửa. |
Đối tượng change[]
Ghi nhận các biến đổi chi tiết của từng phần tử:
change:
- target: scenario # Đối tượng tác động: analysis, seed, setup, hoặc scenario
id: create-order # Định danh của phần tử
reason: "Thêm API mới" # Giải trình kỹ thuật
before: null # Giá trị trước thay đổi (null nếu là tạo mới)
after: # Giá trị sau thay đổi (null nếu là xóa bỏ)
id: create-order
Thuật toán Băm Chuẩn tắc của Suite
SpecTest tính toán after_hash theo nguyên tắc tất định:
1. Trích xuất 4 khối mutable từ spectest.yaml:
- analysis
- seed
- setup
- scenarios
2. Marshal các khối thành chuỗi YAML chuẩn tắc (bỏ qua khối rỗng, sắp xếp key).
3. Tính mã băm SHA-256.
4. Cắt lấy 12 ký tự thập lục phân đầu tiên.
Ý nghĩa của việc Kiểm chứng Hash:
Khi chạy lệnh spectest run --only-changed:
- Runner tính currentHash := domain.SuiteHash(suite).
- Nếu currentHash != latest.AfterHash, runner sẽ lập tức từ chối chạy.
- Cơ chế này ngăn chặn việc chạy test cập nhật một phần trên một file test suite đã bị người dùng sửa tay lệch nhịp.