testing

8 posts

Symbolic Execution 找到了我 94% 測試覆蓋率都漏掉的整數溢位

你的單元測試只檢查特定輸入。Symbolic execution 檢查所有可能的輸入。以下是它的運作原理、成本,以及從哪裡開始。

你的測試套件有 94% 覆蓋率且零失敗。Symbolic execution engine 在三秒內就在你的程式碼中找到了一個 crash。 測試沒壞。覆蓋率指標沒有說謊。問題在於測試只驗證特定點上的行為。Symbolic execution 驗證的是整個輸入空間區域中的行為。如果 bug…

Metamorphic testing 發現了 147 個編譯器 bug 與一個自駕車缺陷。以下是它的運作原理。

Metamorphic testing 在 GCC、LLVM、Vulkan shader compiler 與 ADAS 模擬器中發現了真實的 bug。這篇文章用可執行的程式碼解釋這項技術,並說明它適合放在測試套件的哪個位置。

Metamorphic testing 在 GCC 與 LLVM 中發現了 147 個已確認的 bug,在汽車 OEM 使用的商業 ADAS 模擬器中發現了缺陷,並在一名行人被撞身亡的八天前,於一個自駕車感知系統中發現了致命缺陷。這項技術聽起來很學術,但這些 bug 可不是。 問題出在 oracle…

大多數 Metamorphic Relations 都沒用,這裡教你怎麼挑出好的

並非所有 metamorphic relations 都能抓到缺陷。弱的關係給你虛假的信心,強的關係才能找出真正的錯誤。以下是如何區分兩者,並建構一套真正有效的關係集合。

你為定價引擎寫了十二個 metamorphic relations。每個測試都通過。你對自己的涵蓋率感覺良好。 然後顧客回報大量折扣計算反了。你檢查你的關係套件。沒有任何一個測試失敗。你有加法一致性、單調性與idempotency的關係。沒有任何一個抓到折扣乘數的正負號錯誤。 這是 metamorphic…

不知道正確答案是什麼,要怎麼測試程式碼?

Metamorphic testing 讓你在不知道預期輸出的情況下驗證程式碼正確性。以下是它的運作方式、限制,以及如何開始使用。

你上線了一個為支援工單標記分類的機器學習模型。你的測試套件全綠。每個測試都通過了。 那些測試沒有一個真正檢查標籤是否正確。你根本不知道正確的標籤是什麼。沒人知道。對於真實世界的輸入,「正確」的輸出實際上無法得知,所以你只好檢查函式不會崩潰,或者輸出形狀符合預期。這不是測試。這是在祈禱。 這就是 oracle…

我把測試、程式碼和散文都放在一個 Markdown 檔案裡,再也不用往文件裡複製程式碼了

Literate programming 將 Markdown 檔案作為單一事實來源,使文件、測試和實作保持同步。以下是如何用三十行 Python 實現它。

你的文件、測試和程式碼是三份檔案,講著同一個故事,卻講得都很糟糕。 你在原始碼裡更新了函式簽名,忘了改 README 裡的範例。一週後,新進員工把過時的程式碼片段複製到了生產環境。你的測試檔案仍然把舊的行為編碼為預期結果。現在你有兩個 bug 和一個文件工單。…

乾等 race condition 是最爛的測試策略

model checking 如何在數秒內碾壓你在生產環境跑幾天才能發現 concurrency bug 的做法,以及如何把它用在自己的程式碼上。

在生產環境裡等 race condition 冒出來,那不叫測試。那叫披著勤奮外衣的僥倖。 你可以把應用跑上幾週,盯著 metrics dashboard,最後照樣發布一個 concurrency bug——它只會在兩個 request 剛好打進同一個 cache eviction window…

單元測試全綠,資料卻憑空消失

模擬資料庫測試只能驗證 SQL 語法,無法確認資料列是否能撐過當機、並發寫入或 schema 不符。以下是真的測試資料持久化的方法。

如果你在測試中使用模擬資料庫,你其實只是在驗證 repository 層是否呼叫了正確的方法。你並沒有測試資料能否在當機後存活、唯一約束是否真的阻止重複資料,或者transaction 失敗時是否會回滾。 這個差別很重要。模擬的 只會回傳你預設的結果。真正的…

不用淹沒在 mock action 裡也能測試 Redux

把每個 Redux action 都 mock 掉,只會讓你的測試變成變更日誌驗證器。以下介紹如何改用真實的狀態轉換來測試你的 store。

如果你曾經寫過一個測試,去驗證 是否被以完全正確的 payload 形狀呼叫,那你其實寫了一個「只要有人重新命名常數就會壞掉」的測試。 這不是測試你的狀態邏輯。這是在測試你的手指有沒有打對字串。 Redux 測試教學通常從 Jest mock 開始:監聽 ,斷言 action creator 被呼叫了,斷言 type…