Testing Files Generator
ไทย

เอกสาร

ทุกอย่างที่เครื่องมือทำได้ จัดเรียงตามคำถามที่ผู้คนมาถามจริงๆ 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 ในแมนิเฟสต์ พร้อมบันทึกความเสียหายไว้ข้างๆ สองอย่างถูกปฏิเสธก่อนจะเขียนอะไร เพราะแต่ละอย่างจะวางไฟล์ที่แมนิเฟสต์อธิบายผิดไว้บนดิสก์:

ข้อที่สามรู้ล่วงหน้าไม่ได้ ถ้าความเสียหายทำงานแล้วไม่ขยับไบต์ใดเลย ไฟล์นั้นจะถูกทิ้งแทนที่จะถูกเขียน - การรันดำเนินต่อ บอกว่าเป็นไฟล์ไหน และจบด้วยรหัสออกแบบบางส่วน

ทีละขั้น พร้อมการทดสอบที่อ่านแมนิเฟสต์: วิธีทำไฟล์เสียหายสำหรับการทดสอบ

สูตรหน้าตาเป็นอย่างไร

สูตรคือไฟล์ 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 พิมพ์สูตรออกมาเพื่อให้คุณแก้ไขต่อจากตรงนั้น แต่ละพรีเซ็ตมีหน้าของตัวเองที่บอกว่าโดยทั่วไปมันพบอะไร ในชุดมีอะไร และรับการตั้งค่าใดบ้าง

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

มีหน้าต่างเดสก์ท็อปไหม

มี เป็นเอนจินเดียวกันที่มีหน้าต่างครอบอยู่ สำหรับการทดสอบที่ไม่ได้เขียนสคริปต์ ไม่ใช่ฉบับตัดทอน: มีการทดสอบเปรียบเทียบสองอินเทอร์เฟซทีละความสามารถ และสิ่งที่ทำได้เพียงฝั่งเดียวต้องถูกประกาศและให้เหตุผล แทนที่จะแยกจากกันไปอย่างเงียบๆ

หน้าจอมีชุดเดียว พรีเซ็ต หลายชุดพร้อมกัน และเกี่ยวกับ แสดงต้นทุนของการรันก่อนเขียนอะไร รายงานความคืบหน้าขณะรัน และยกเลิกกลางคันได้โดยไม่ทิ้งไฟล์ที่เขียนค้างครึ่งหนึ่ง ยังเปิดไฟล์สูตรไม่ได้ - ตอนนี้สูตรเป็นเรื่องของบรรทัดคำสั่ง และหน้าต่างสร้างชุดในฟอร์ม