FunnyTools methodology
PDF 與圖片工具怎麼驗證?頁數、格式、尺寸、重新開啟與 Round Trip 測試
檔案工具最危險的bug,是畫面顯示『完成』,使用者到另一個軟體才發現輸出損壞。
更新:
檔案工具的測試不能只寫:
Download button clicked。
真正要測:
下載的東西是什麼。
一、最小PDF Fixtures
repo應保留自己生成、無個資的:
- 1頁PDF
- 2頁PDF
- 3頁PDF
- portrait
- landscape
- small text page
用途:
- merge
- split
- rotate
- delete
- extract
- reorder
- image conversion
- compression
二、Merge PDF Test
輸入:
- A:1頁
- B:2頁
預期:
3頁。
還要確認:
- A在前
- B頁順序保留
- 檔案可開
- 不為0 byte
三、Split PDF Test
輸入:
3頁PDF
依產品設計:
- each page
- selected ranges
預期:
頁數與range完全一致。
四、Rotate Test
只轉第2頁90°。
驗證:
- page count仍3
- 第1、第3不變
- 第2rotation metadata/content正確
五、Delete / Extract Test
Delete page2:
剩1、3。
Extract page2:
只剩原page2。
這兩個工具搜尋意圖很像,但測試結果相反。
六、Reorder Test
原順序:
1,2,3
改:
3,1,2
輸出重新打開後:
必須真的3,1,2。
不能只測UI拖曳順序。
七、PDF → Image
驗證:
- 輸出張數 = page count(在工具限制內)
- PNG/JPG格式正確
- dimensions >0
- 可開啟
不要測:
搜尋文字仍存在。
因為轉成影像本來就會失去PDF文字語意。
八、Image → PDF
驗證:
- 每張圖對應頁
- 順序正確
- page count
- PDF可開
若有:
- page size
- orientation
則加入fixture。
九、Compression Test
最容易寫錯的測試:
output一定比input小。
不應。
某些檔案已高度壓縮:
重寫後可能一樣大甚至更大。
應驗證:
- output valid
- page count unchanged
- content still opens
- tool正確顯示size difference
不能把「縮小」作為所有fixture的硬assert。
十、圖片格式 Fixtures
至少:
- 100×50 PNG
- transparent PNG
- opaque JPG
- WebP
- very small image
- odd dimension,例如101×73
十一、Resize Test
輸入:
100×50
keep ratio,width=200:
預期:
200×100。
若設定任意:
200×200
則視keep-ratio開關決定。
十二、PNG → JPG透明度
透明PNG轉JPG:
JPG沒有alpha。
工具需要:
- 背景色
- 或固定flatten規則
fixture要測:
透明區最後變什麼。
十三、JPG Lossy
JPG encode/decode:
pixel-by-pixel不一定完全相同。
所以不要用hash equality。
可以測:
- dimensions
- format
- decode success
- reasonable size
十四、Round Trip 不是永遠適用
PNG → JPG → PNG:
不會回到原始PNG像素。
PDF → image → PDF:
不會恢復原始PDF語意。
測試方法必須知道:
轉換是否理論可逆。
十五、大檔測試
自動suite不應每天跑超大fixture拖垮CI。
可分:
- small regression fixtures
- manual stress test
例如:
- 20MB image
- 40MB PDF
依工具實際limit執行release smoke test。
十六、Browser Compatibility
File API / Canvas / PDF library在:
- Chrome
- Edge
- Safari
- iOS
可能有差異。
重要release:
至少主流browser smoke test。
十七、FAQ
為什麼壓縮後反而更大?
可能,尤其原檔已最佳化。
PDF下載成功就代表內容正確?
不代表。
JPG轉回PNG可以復原嗎?
不能恢復已丟失的有損資訊。
大檔要放Git嗎?
不建議,small fixture進repo,大型stress asset可另管理。