測試爬蟲解析邏輯時,最直覺的做法是把某個真實頁面的完整 HTML 存成一份 fixture 檔案,測試時讀取它、跑解析邏輯、斷言結果。但一份真實頁面的 HTML 常常有幾十 KB,裡面絕大部分內容(廣告區塊、頁尾、無關的側欄)跟這段解析邏輯完全無關。
整份真實內容:優點是最貼近真實情況,如果來源站的頁面結構有某個你沒注意到的細節(例如某個屬性只在特定條件下才出現),整份存下來比較不容易漏掉;缺點是檔案龐大、可讀性差——測試失敗時要在幾十 KB 的 HTML 裡找出跟這次測試相關的那一小段,並不輕鬆。
精簡到只留必要片段:優點是 fixture 檔案小、可讀性高,測試失敗時能直接看懂 fixture 裡有什麼、預期解析出什麼;缺點是精簡的過程可能不小心刪掉了某個「當下覺得無關,實際上會影響解析結果」的細節,變成一份跟真實情況有落差的假資料。
實務上常見的折衷是:保留頁面的真實 DOM 結構(class 名稱、巢狀層級),但把不影響測試的內容(大量文字、圖片位址、不相關的區塊)替換成精簡的佔位內容。這樣 fixture 檔案體積下降,可讀性提升,同時保留了「解析邏輯依賴的真實結構」,不會因為精簡過頭而遺漏會影響解析結果的細節。
選哪一種取捨,取決於這份 fixture 存在的目的:如果目的是「驗證解析邏輯能正確處理某個真實來源的完整結構」(例如第一次針對某個新來源寫解析邏輯時),保留完整內容比較保險;如果目的是「驗證某個已知邊界情況的處理邏輯」(例如 Day 05 講過的項目編號解析例外),精簡到只留下觸發那個邊界情況所需要的最小片段,測試意圖會更清楚,也更容易維護。
你的測試 fixture 是整份真實資料,還是精簡過的片段?如果是精簡過的,你怎麼確認精簡過程沒有不小心刪掉會影響測試結果的細節?
明天是一個案例:一個看似綠燈的測試,其實沒斷言到真正關鍵的行為。