Cách tạo tệp bị hỏng để kiểm thử
Một trình kiểm tra chỉ từng được cho xem tệp lành thì chưa thực sự được kiểm thử. Đây là cách có được một tệp cố ý làm hỏng, ra đúng kích thước bạn yêu cầu và mang theo manifest nói hệ thống của bạn phải làm gì với nó.
Câu trả lời ngắn
tfg generate --format png --size 2mb --damage zero-head --out ./out ghi một tệp PNG
đúng 2097152 byte với các byte đầu là số không, và manifest bên cạnh ghi rằng hệ thống của bạn
phải từ chối nó.
Cách thường dùng
Vì sao tệp làm hỏng bằng tay là một bài kiểm thử tồi
Cách thường dùng là trình soạn thảo hex, một script đảo vài byte ngẫu nhiên, hoặc cắt ngắn tệp bằng
head hay truncate. Dùng được một lần, rồi nó làm bạn tốn công:
- Mỗi lần một khác. Byte ngẫu nhiên rơi vào chỗ mới ở mỗi lần chạy, nên lỗi hôm thứ Ba có thể không quay lại vào thứ Tư.
- Nó đổi kích thước. Tệp bị cắt ngắn nhỏ hơn giới hạn mà nó phải nằm dưới, nên bước kiểm tra kích thước trả lời trước bước kiểm tra nội dung và bài kiểm thử đạt vì lý do sai.
- Nó thường không ai nhận ra. Văn bản thuần vẫn đọc được khi đổi một byte ở giữa, và một trình đọc ảnh dễ tính chỉ việc vẽ nó ra, nên tệp lẽ ra phải hỏng lại được chấp nhận.
- Nó không nói gì về điều phải xảy ra. Tệp chỉ là các byte, và ai đọc bài kiểm thử sau đó phải đoán xem ý định là chấp nhận hay từ chối.
Bạn nhận được gì
Tệp bị hỏng vẫn có kích thước bạn đã yêu cầu
Tệp được tạo bình thường rồi mới bị làm hỏng, trên đường ghi xuống đĩa. Nó giữ kích thước bạn yêu cầu, và cùng một lệnh ghi lại đúng các byte đó.
tfg generate --format png --size 2mb --damage zero-head --out ./out
tfg generate --format pdf --size 1mb --count 5 --damage zero-head:bytes=16 --out ./broken
Cài đặt viết sau dấu hai chấm. Tùy chọn có thể lặp lại, và các hỏng hóc được áp dụng theo thứ tự bạn viết. Nó dùng được với từng định dạng trong 26 định dạng.
Nó làm được gì
Có những kiểu hỏng nào?
Đây là danh sách chương trình in ra, được đọc từ chính nó khi trang này được dựng. tfg
damage in ra cùng danh sách đó, và tfg damage <id> cho biết một kiểu
nhận những gì.
| Hỏng hóc | Nó làm gì với các byte | Tệp nhỏ nhất | Cài đặt |
|---|---|---|---|
zero-head |
Ghi đè các byte đầu của tệp bằng số không, giữ nguyên độ dài. Hầu hết trình đọc nhìn vào đó trước, nên gần như mọi thứ đều nhận ra hỏng hóc này. | 8 | bytes |
zero-head ghi số không đè lên phần đầu tệp. Hầu hết trình đọc nhìn vào đó trước, vào
chữ ký và phần đầu cho biết tệp là gì, nên gần như trình đọc nào cũng nhận ra. Văn bản thuần và
nhật ký không có chữ ký và cũng bị từ chối, vì một chuỗi byte không không phải là văn bản. Dưới
bốn byte, một số định dạng ra với hỏng hóc mà không trình đọc nào phàn nàn, đó là lý do cài đặt
bắt đầu từ bốn.
Manifest nói gì
Một manifest nói điều phải xảy ra
Mỗi tệp bị hỏng nhận một mục nói rằng hệ thống của bạn phải từ chối nó, với hỏng hóc được ghi bên cạnh:
"expected": {
"outcome": "reject",
"reason": "content_malformed",
"confidence": "certain"
},
"damage": [
{
"type": "zero-head",
"settings": {
"bytes": "8"
}
}
]
Hai yêu cầu bị từ chối trước khi có gì được ghi, vì mỗi yêu cầu sẽ để lại trên đĩa một tệp mà manifest mô tả sai:
- một tệp nhỏ hơn mức hỏng hóc cần, sẽ ra mà không bị đổi
-
expected: acceptcạnh một hỏng hóc, vì không gì có thể đáp ứng được. Viếtsanitizenếu hệ thống của bạn phải sửa tệp, hoặcunspecifiednếu đó chính là câu hỏi bạn đang đặt ra
Trong một công thức
Tệp lành và tệp hỏng trong một lần chạy
Đặt cả hai vào một công thức, và manifest mang kỳ vọng của từng tệp, nên bài kiểm thử không cần danh sách tệp nào là tệp nào:
version: 1
targets:
- id: healthy
format: pdf
size: 1mb
expected: accept
- id: broken
format: pdf
size: 1mb
damage:
- zero-head
Trong một bài kiểm thử
Biến nó thành một bài kiểm thử
Bài kiểm thử đọc manifest và kiểm tra điều đã xảy ra có đúng như điều đã khai báo. Nó không cần danh sách tên tệp:
import json, os
directory = "healthy-and-broken"
manifest = json.load(open(os.path.join(directory, "manifest.json")))
for entry in manifest["files"]:
response = upload(os.path.join(directory, entry["path"]))
if entry["expected"]["outcome"] == "reject":
assert not response.ok
else:
assert response.ok
Một lần từ chối tốt là một lần từ chối gọn. Một thông báo nói điều gì sai là câu trả lời bạn muốn. Lỗi máy chủ, treo máy hoặc một tệp lưu dở là khiếm khuyết mà bài kiểm thử này sinh ra để tìm.
Tiếp theo
Đi đâu từ đây
- Preset upload-validation hỏi một biểu mẫu hai câu hỏi còn lại, về kích thước và về loại tệp.
- Tệp kiểm thử trong CI chạy một công thức như thế này trong pipeline.
-
Tài liệu có mọi tùy chọn của
tfg generate.