เอกสาร
ทุกอย่างที่เครื่องมือทำได้ จัดเรียงตามคำถามที่ผู้คนมาถามจริงๆ README ในรีโพซิทอรีเป็นข้อมูลอ้างอิงฉบับสมบูรณ์และตรงกับบิลด์ที่คุณดาวน์โหลดเสมอ
มีคำสั่งอะไรบ้าง
แต่ละคำสั่งทำสิ่งเดียว:
tfg generate สร้างไฟล์จากสูตรหรือจากแฟลก
tfg validate ตรวจสอบสูตรโดยไม่เขียนอะไร
tfg verify ตรวจสอบไดเรกทอรีเทียบกับแมนิเฟสต์
tfg cleanup ลบไฟล์ที่แมนิเฟสต์ระบุไว้
tfg recipe fmt พิมพ์สูตรในรูปแบบมาตรฐาน
tfg preset สร้างชุดไฟล์จากคำถามทดสอบที่มีชื่อ
tfg formats แสดงรายการรูปแบบที่บิลด์นี้รองรับ
tfg damage แสดงรายการวิธีที่บิลด์นี้ทำให้ไฟล์เสียหายโดยตั้งใจ
tfg tool เครื่องมือเล็กๆ สำหรับไฟล์ที่คุณมีอยู่แล้ว
tfg version พิมพ์เวอร์ชันของเครื่องมือ
tfg license พิมพ์ใบอนุญาตและความหมายสำหรับไฟล์ที่สร้างขึ้น
สร้างไฟล์เดียวที่ขนาดแม่นยำได้อย่างไร
ระบุรูปแบบ ขนาด และปลายทาง ขนาดนับเป็นทีละ 1024 ดังนั้น 2mb คือ 2097152 ไบต์
ใช้จำนวนไบต์ธรรมดาก็ได้ ดังนั้น --size 10485761 ขอจำนวนนั้นพอดี
tfg generate --format png --size 2mb --out ./out
แฟลกที่มีประโยชน์ของ generate:
| แฟลก | ทำอะไร |
|---|---|
--format <id> | รูปแบบของไฟล์ เช่น txt |
--size <size> | ขนาดที่แม่นยำของแต่ละไฟล์ เช่น 10mb หรือจำนวนไบต์ธรรมดา |
--size-range <a-b> | ขนาดที่สุ่มต่อไฟล์จากช่วง เช่น 1kb-8kb การสุ่มมาจากซีด |
--boundary <size> | สามไฟล์รอบขีดจำกัด: น้อยกว่าหนึ่งไบต์ เท่ากับขีดจำกัด และมากกว่าหนึ่งไบต์ |
--count <n> | จะสร้างกี่ไฟล์ ค่าเริ่มต้น 1 |
--name <template> | แม่แบบชื่อ เช่น invoice_{index:04}.txt |
--out <dir> | ไดเรกทอรีที่จะเขียนลงไป |
--seed <n> | ซีดของการรัน ซีดเดียวกันให้ไบต์เดียวกัน |
--set <k>=<v> | การตั้งค่ารูปแบบ ระบุซ้ำได้ |
--damage <name> | ทำให้ไฟล์เสียหายโดยตั้งใจ ระบุซ้ำได้และใช้ตามลำดับ รัน tfg damage เพื่อดูรายการ |
--expected <outcome> | accept, reject, sanitize หรือ unspecified |
--dry-run | นับและแสดง ไม่เขียนอะไรเลย |
--json | เขียนแมนิเฟสต์ไปยังเอาต์พุตมาตรฐาน |
ทำไฟล์ที่เสียโดยตั้งใจได้อย่างไร
ไฟล์อื่นทุกไฟล์ที่เครื่องมือนี้เขียนถูกต้องโดยโครงสร้าง
ซึ่งตอบสองในสามคำถามที่ตัวตรวจสอบการอัปโหลดถาม --damage ตอบข้อที่สาม -
ไฟล์เปิดได้หรือไม่ ไฟล์ถูกสร้างตามปกติแล้วจึงถูกทำให้เสีย จึงยังคงมีขนาดที่คุณขอ
tfg generate --format png --size 2mb --damage zero-head --out ./out
tfg generate --format png --size 2mb --damage zero-head:bytes=16 --out ./out
การตั้งค่าอยู่หลังเครื่องหมายทวิภาค แฟลกระบุซ้ำได้ และลำดับที่คุณเขียนคือลำดับที่ใช้ tfg
damage แสดงว่าบิลด์นี้ทำอะไรได้บ้างและแต่ละแบบรับอะไร
ในสูตร คีย์เป็นรายการ ของชื่อหรือของการตั้งค่า:
targets:
- id: broken
format: png
count: 5
size: 2mb
damage:
- zero-head
- type: zero-head
bytes: 16
ไฟล์ที่เสียหายได้ expected: reject ในแมนิเฟสต์ พร้อมบันทึกความเสียหายไว้ข้างๆ
สองอย่างถูกปฏิเสธก่อนจะเขียนอะไร เพราะแต่ละอย่างจะวางไฟล์ที่แมนิเฟสต์อธิบายผิดไว้บนดิสก์:
- ไฟล์ที่เล็กกว่าที่ความเสียหายต้องการ เพราะจะออกมาโดยไม่เปลี่ยนแปลง
-
expected: acceptข้างความเสียหาย เพราะไม่มีสิ่งใดทำให้เป็นจริงได้ เขียนsanitizeถ้าระบบที่ทดสอบควรซ่อมไฟล์ หรือunspecifiedถ้านั่นคือคำถามที่คุณกำลังถาม
ข้อที่สามรู้ล่วงหน้าไม่ได้ ถ้าความเสียหายทำงานแล้วไม่ขยับไบต์ใดเลย ไฟล์นั้นจะถูกทิ้งแทนที่จะถูกเขียน - การรันดำเนินต่อ บอกว่าเป็นไฟล์ไหน และจบด้วยรหัสออกแบบบางส่วน
ทีละขั้น พร้อมการทดสอบที่อ่านแมนิเฟสต์: วิธีทำไฟล์เสียหายสำหรับการทดสอบ
สูตรหน้าตาเป็นอย่างไร
สูตรคือไฟล์ YAML ที่อธิบายการรันทั้งหมด คอมมิตไว้ข้างการทดสอบของคุณ แล้วฟิกซ์เจอร์จะไม่เป็นไบนารีในรีโพซิทอรีอีกต่อไป - ใครก็สร้างใหม่ได้ ไบต์ต่อไบต์ จากไฟล์ที่ยาวไม่กี่ร้อยอักขระ
# fixtures.yaml
version: 1
seed: 7741
defaults:
label: true
targets:
- id: invoices
format: pdf
count: 25
size: 300kb
name: invoice_{index:04}.pdf
properties:
pages: 3
page_size: a4
expected: accept
- id: over_the_limit
format: png
count: 2
size: 12mb
expected:
outcome: reject
reason: size_limit
- id: bundle
format: zip
contains:
- format: txt
count: 200
size: 4kb
output:
dir: ./fixtures
manifest: manifest.json
tfg validate fixtures.yaml
tfg generate fixtures.yaml
แต่ละ target ต้องมี size, size-range, boundary หรือ
contains อย่างใดอย่างหนึ่งพอดี มีสองอย่างคือข้อผิดพลาด ไม่มีเลยก็เป็นข้อผิดพลาด
สูตรที่ไม่ถูกต้องไม่เขียนไฟล์ใดเลย
และรายงานปัญหาทั้งหมดพร้อมกันแทนที่จะรายงานแค่ข้อแรก โดยแต่ละข้อระบุการตั้งค่าที่เกี่ยวข้อง
ประกาศอย่างไรว่าระบบของฉันควรทำอะไรกับไฟล์
ใช้รูปแบบสั้นเมื่อผลลัพธ์เพียงพอ ใช้รูปแบบยาวเมื่อเหตุผลสำคัญ:
expected: accept
expected:
outcome: reject
reason: size_limit
ผลลัพธ์คือ accept, reject, sanitize และ
unspecified เหตุผลเป็นรายการปิดเพื่อให้รายงานจัดกลุ่มตามได้:
content_malformed, count_limit, dimensions_limit,
duplicate, encoding_invalid, extension_rule,
filename_invalid, filename_too_long, filename_traversal,
malware_signature, mime_mismatch, nesting_depth,
none, size_limit และ size_zero
เหตุผลระบุกฎที่เกี่ยวข้อง ไม่ใช่คำตัดสิน
ด้วยเหตุนี้เหตุผลเดียวกันจึงอยู่ใต้ผลลัพธ์ใดก็ได้ - ไฟล์ที่น้อยกว่าขีดจำกัดหนึ่งไบต์คือ
accept และกฎที่เกี่ยวข้องก็ยังเป็น size_limit
แมนิเฟสต์มีอะไรบ้าง
ถูกเขียนไว้ข้างไฟล์เมื่อจบทุกการรัน รวมถึงการรันที่ถูกขัดจังหวะ หนึ่งรายการต่อไฟล์:
{
"manifest_version": "1.0",
"tool": { "name": "testing-files-generator", "version": "0.4.0" },
"run": {
"id": "run_b359aa8d94",
"seed": 0,
"command": "tfg generate --format png --size 2mb --out ./out",
"platform": { "os": "windows", "arch": "amd64" },
"complete": true
},
"summary": {
"file_count": 1,
"total_bytes": 2097152,
"by_format": { "png": 1 },
"by_expected": { "unspecified": 1 }
},
"files": [
{
"path": "files_0001.png",
"bytes": 2097152,
"format": "png",
"fidelity": "full",
"determinism": "byte",
"seed": "8dc2d18c",
"hashes": { "sha256": "1a1f7c..." },
"properties": { "width": 640, "height": 480 },
"expected": {
"outcome": "unspecified",
"detail": "No expectation was declared for this file.",
"confidence": "policy_dependent"
}
}
]
}
recipe_hash จะถูกเพิ่มเมื่อการรันมาจากสูตร และ preset พร้อม
overrides เมื่อมาจากพรีเซ็ต แมนิเฟสต์จึงสืบย้อนไปถึงสิ่งที่สร้างมันได้เสมอ
ทุกรายการยังมี target_id ซึ่งเป็นรหัสของ target ในสูตรที่สร้างไฟล์ และ
summary.by_target นับจำนวนไฟล์ที่แต่ละ target สร้างได้ สูตรที่มีหลาย target
จึงตรวจทีละ target ได้โดยไม่ต้องอ่านชื่อไฟล์
พรีเซ็ตคืออะไร
ชุดไฟล์สำเร็จรูปที่ตอบคำถามการทดสอบที่พบบ่อย คุณจึงไม่ต้องออกแบบชุดเอง
พรีเซ็ตเป็นสูตรธรรมดาอยู่ข้างใน และ eject
พิมพ์สูตรออกมาเพื่อให้คุณแก้ไขต่อจากตรงนั้น
แต่ละพรีเซ็ตมีหน้าของตัวเองที่บอกว่าโดยทั่วไปมันพบอะไร ในชุดมีอะไร
และรับการตั้งค่าใดบ้าง
-
ไฟล์ที่ถูกต้องและเล็กเท่าที่รูปแบบอนุญาตจะผ่านไหม
empty-and-minimal -
ระบบของฉันจะเก็บ แสดง และส่งคืนชื่อไฟล์ที่ไม่ได้คาดไว้ได้ไหม
filename-handling -
ขีดจำกัดขนาดถูกบังคับใช้ตรงจุดที่ประกาศไว้พอดีหรือไม่
size-boundaries -
การนำเข้าตารางของฉันรับมือกับสิ่งที่เครื่องมือจริงส่งออกได้ไหม
tabular-import -
ตัวอ่านของฉันรู้ไหมว่าไฟล์ใช้การเข้ารหัสอะไร หรือกำลังเดาอยู่
text-encoding -
ฟอร์มอัปโหลดของฉันรับสิ่งที่ควรรับและปฏิเสธที่เหลือหรือไม่
upload-validation
tfg preset list
tfg preset show size-boundaries
tfg generate --preset size-boundaries --limit 10mb --out ./edges
tfg preset eject size-boundaries > my.yaml
show บอกว่าชุดจะมีต้นทุนเท่าไรก่อนที่คุณจะสร้าง และบอกตรงๆ
เมื่อตัวเลขใดเป็นค่าชั่วคราวของเรา ไม่ใช่ขีดจำกัดของคุณ
รหัสออกมีความหมายอย่างไร
ทุกการจบมีรหัสของตัวเอง เอาต์พุตที่เครื่องอ่านได้ไปที่เอาต์พุตมาตรฐาน และการรันที่ล้มเหลวไม่พิมพ์อะไรที่นั่น ตารางนี้เป็นสัญญาที่ตรึงไว้ - การเปลี่ยนความหมายของรหัสต้องเลื่อนเวอร์ชันหลัก
| รหัส | ความหมาย |
|---|---|
0 |
ทุกอย่างทำงานได้ |
1 |
เกิดข้อผิดพลาดที่ไม่คาดคิดภายในเครื่องมือ |
2 |
คำสั่งหรือแฟลกไม่ถูกต้อง |
3 |
สูตรไม่ถูกต้อง |
4 |
รูปแบบนี้ทำสิ่งที่ขอไม่ได้ |
5 |
การอ่านหรือเขียนล้มเหลว |
6 |
พื้นที่ดิสก์ไม่พอ |
7 |
verify พบความไม่ตรงกัน |
8 |
การรันเสร็จสิ้น แต่สร้างไม่ครบทุกอย่าง |
130 |
ถูกขัดจังหวะด้วย Ctrl+C |
143 |
ถูกหยุดด้วยสัญญาณ ซึ่งเป็นหน้าตาของการหมดเวลาใน CI |
- 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
การรันที่หยุดด้วย Ctrl+C ยังทิ้งแมนิเฟสต์ไว้ และไม่เคยทิ้งไฟล์ที่เขียนค้างครึ่งหนึ่ง งานที่ถูกยกเลิกจึงยังถูกทำความสะอาดโดยงานถัดไปได้
เวิร์กโฟลว์สำเร็จรูปสำหรับ GitHub Actions และ GitLab CI: วิธีสร้างไฟล์ทดสอบในไปป์ไลน์ CI
มีหน้าต่างเดสก์ท็อปไหม
มี เป็นเอนจินเดียวกันที่มีหน้าต่างครอบอยู่ สำหรับการทดสอบที่ไม่ได้เขียนสคริปต์ ไม่ใช่ฉบับตัดทอน: มีการทดสอบเปรียบเทียบสองอินเทอร์เฟซทีละความสามารถ และสิ่งที่ทำได้เพียงฝั่งเดียวต้องถูกประกาศและให้เหตุผล แทนที่จะแยกจากกันไปอย่างเงียบๆ
หน้าจอมีชุดเดียว พรีเซ็ต หลายชุดพร้อมกัน และเกี่ยวกับ แสดงต้นทุนของการรันก่อนเขียนอะไร รายงานความคืบหน้าขณะรัน และยกเลิกกลางคันได้โดยไม่ทิ้งไฟล์ที่เขียนค้างครึ่งหนึ่ง ยังเปิดไฟล์สูตรไม่ได้ - ตอนนี้สูตรเป็นเรื่องของบรรทัดคำสั่ง และหน้าต่างสร้างชุดในฟอร์ม