我的 SQL 問答專案,PostgreSQL 整合測試有過。但後來查到,測試自己加了隔離規則,產品實際用的 migration 卻漏了部分規則。
要求很清楚:A 公司不能看到 B 公司的資料。
測試另外建了一套資料庫,把規則加好,A 當然看不到 B。產品設定漏掉的東西,就這樣被測試自己補掉了。
後來就讓測試用產品同一份 migration,不要另外建一套。再到測試資料庫裡,把讀取權限固定,換新舊規則跑看看。舊的會查到別家公司的資料,新的才擋住。這只能說測試裡重現了問題,正式環境有沒有發生過、修正上線了沒,還要另外查。
之前 AI 說完成,我會叫它跑測試。查完這次,我還會看:這份測試到底驗到了什麼?
我想看它怎麼失敗
現在 AI 修完 bug,我會要求它拿出證據:原來那個錯還在的時候,這份測試抓不抓得到?
用訂單當簡化例子。A、B 公司各有一筆訂單,用 A 的身分查詢,要拿到 A 的,而且不能出現 B 的。不能只檢查「沒有 B」,不然整個查詢壞掉、什麼都沒回傳,也可能通過。
這個例子可以在隔離的測試環境故意拿掉保護。B 的訂單跑出來,測試就要報錯;加回去才通過。但如果只是資料庫連不上,那跟抓到這個 bug 沒關係。
測試本來沒過,後來怎麼過的,我也會看。它是修好程式,還是把檢查刪掉、把預期結果改成跟程式一樣?如果原本的要求沒變,就不能靠改答案讓它過。
像這個例子,我會在動工前把驗收條件寫清楚:
- 測試資料庫要用產品的 migration 建立。
- 用 A 的身分查,必須拿到 A 的訂單,也不能收到 B 的。
- 在隔離的測試裡拿掉保護,測試必須因為 B 的訂單出現而失敗。
答案來自公司的資料隔離要求。不管 AI 怎麼寫查詢,都得符合。不能讓它照著自己的程式再寫一份答案,兩邊完全可以一起錯。
新增的測試真的有跑嗎?
另一個專案放了四份 LLM 測試腳本,但 CI 只會執行特定位置和命名的測試檔。那四份不符合規則,就沒被執行。其他測試照樣通過。
後來就把漏掉的測試補進去。所以現在它說測試都過了,我還會叫它把結果打開,看這次加的那幾個到底有沒有跑。
最後還要接起來跑
資料庫那段測過,還要看登入到查詢有沒有接對。現在 AI 都能操作 Chrome 了,就讓它在測試環境真的登入、打開訂單頁。A 公司要看得到自己的訂單,API 也不能回傳 B 公司的資料。只開個頁面、沒報錯,還不知道這些有沒有做對。
我沒有要求每次都做 TDD,或把 coverage 衝到百分之百。但跨服務、裝置或關鍵流程有改動,就要在安全的測試環境接起來跑,連同相關的失敗情況一起查。
中間有 Kafka、Redis,也要先決定:訊息重複收到怎麼辦、處理到一半掛掉怎麼接、快取可以多久沒更新。接起來測的時候,就驗這些結果。哪一段服務還沒接上、哪個設定還沒驗,直接寫出來。
這幾次是跟 AI 一起查、一起修的,原本的問題不一定是它寫的。我把這些要求補進 Codex 和 Claude 的全域規則裡,但各專案有沒有照做,還要逐一確認。
下次 review AI 修的 bug,我會要它拿出三樣東西:新增測試的執行結果、測試用的產品設定,以及它能抓到原本錯誤的證據。少了哪一個,就先記下還沒驗什麼,不急著說修好了。