Kiểm thử ngày tháng trong pipeline
Cửa sổ dùng để khám phá. Đây là nửa còn lại: một bản dựng dòng lệnh khoảng 2,4 MB không cần cài runtime, có mã thoát là kết luận về độ bao phủ chứ không phải mã thoát của chính mục tiêu.
Mã thoát chính là kết luận
Đây là quyết định thiết kế giúp công cụ có thể viết script. Khi một phiên kết thúc, mã thoát trả lời “việc thay thế thời gian có hiệu lực không”, chứ không phải “ứng dụng đã trả về gì”. Nhờ vậy pipeline có thể thất bại vì một sự thay thế đã âm thầm không xảy ra - đó chính là thất bại đáng để làm hỏng pipeline, vì mọi thứ sau nó đều là một bài kiểm thử không chứng minh được gì.
Mã thoát của chính mục tiêu vẫn được báo cáo, trong dữ liệu phiên.
| Mã | Ý nghĩa |
|---|---|
| 0 | hoạt động - mọi tiến trình đọc giờ đều thấy đồng hồ của phiên |
| 10 | hoạt động một phần - một số kênh được bao phủ, một số thì không |
| 11 | không hoạt động - việc thay thế không đến được các kênh then chốt |
| 4 | chưa xác định - không thể xác lập độ bao phủ |
| 1 | lỗi sử dụng - sai tùy chọn hoặc sai biểu thức |
| 2 | không thể khởi chạy hoặc chèn mã vào mục tiêu |
| 12 | mục tiêu biến mất, gợi ý một ứng dụng chỉ cho phép một thể hiện |
| 3 | lỗi nội bộ - lõi không khởi động được, gặp trạng thái bất ngờ, hoặc dừng trước khi đóng phiên (bất kể mã thoát riêng của nó). Lần chạy như vậy không có kết luận |
| 5 | thao tác chưa được dựng trong bản phát hành này |
| 6 | lần chạy bị cắt ngang - --timeout đã hết, hoặc lõi ngừng phản hồi trong 15 giây và bị dừng. Đây không phải kết luận: phiên bị gián đoạn, nên không chứng minh được gì về mục tiêu theo hướng nào |
| 7 | một phiên khác đang chạy - mỗi lần chỉ một phiên. Chỉ cần thử lại khi phiên đó kết thúc |
| 8 | phiên đã có kết luận, nhưng bằng chứng không nằm trong tệp mà --report chỉ định - ổ đĩa đã đầy, hoặc một chương trình khác đang giữ tệp cũ mở, và tệp đó giữ nguyên. Kết luận vẫn có trong báo cáo mà lệnh in ra |
Mọi tùy chọn của cả hai lệnh, và bảng tương tự cho máy tính ngày, nằm trong tài liệu tham chiếu dòng lệnh.
Các lần chạy có giới hạn
Pipeline không thể chờ một người đóng ứng dụng máy tính để bàn.
--ticks N kết thúc phiên sau N nhịp - mỗi nhịp một giây thật - và báo cáo những gì
đã tìm thấy đến lúc đó. Độ bao phủ vốn được xác lập ngay những khoảnh khắc đầu của tiến trình, nên
thường chỉ cần một giới hạn ngắn.
# Mười giây, rồi dừng và báo cáo chrono run ".\build\test.exe" --preset year-rollover --ticks 10 --report evidence.txt
Đầu ra cho máy và bằng chứng
--jsonxuất phiên thành các bản ghi máy đọc được thay vì báo cáo cho người - cùng những dữ kiện, gồm cả độ bao phủ theo từng kênh.--report <path>ghi báo cáo cho người ra tệp, rất phù hợp làm tạo phẩm của bản dựng. Một phiên có kết luận khác hoạt động sẽ mở đầu tệp bằng biểu ngữ cảnh báo bằng chứng không đáng tin, thay vì chôn lời lưu ý ở cuối.- Máy tính ngày cũng nói được
--json, nên pipeline có thể tính ngày cần dùng rồi đưa ngược lại vào.
# Tính ngày, rồi chạy ở ngày đó chrono calc --base today --snap eom --json chrono run ".\build\test.exe" --preset month-end --ticks 10 --json
Một bước, đại khái như sau
- name: Month-end behaviour
shell: pwsh
run: |
.\chrono.exe run ".\build\test.exe" --preset month-end --ticks 10 --report evidence.txt
# mã thoát khác không ở đây nghĩa là việc thay thế không có hiệu lực, nên
# bài kiểm thử phía sau sẽ chẳng chứng minh được gì
- name: Keep the evidence
uses: actions/upload-artifact@v7
with:
name: chrono-evidence
path: evidence.txt
Hai lưu ý thẳng thắn về runner
- Cần một runner Windows. Không có bản dựng cho Linux hay macOS, và sẽ không có - trên Linux, libfaketime đã đảm nhiệm việc này.
- Phần mềm diệt virus trên runner được lưu trữ có thể chặn việc chèn mã. Dịch chuyển thời gian nghĩa là chèn một thư viện vào tiến trình mục tiêu, một kỹ thuật Windows có tài liệu mà mã độc cũng dùng. Runner chặn nó sẽ cho ra mã thoát nói rõ điều đó thay vì một kết quả qua giả - nhưng đó là điều nên biết trước khi bạn phụ thuộc vào nó.
Vì lý do tương tự, bộ kiểm thử đầu-cuối của chính dự án này chạy trên máy thật chứ không phải trên runner được lưu trữ. Tích hợp liên tục của nó dựng và kiểm thử đơn vị mọi thứ, còn bản thân việc thay thế thời gian được thử thủ công trên các ứng dụng thật, cả bản dựng 32-bit lẫn 64-bit, trước mỗi bản phát hành.