「測試都綠燈了,應該沒問題」——這句話有一個沒有明講的前提:綠燈是在某個特定環境下測出來的結果,不是一個放諸四海皆準的保證。如果實際上線或跑 CI 的環境跟本機不完全一致,本機的綠燈不代表換了環境之後也會是綠燈。
在一次補齊測試覆蓋率的工作裡,AI 寫的測試程式碼用了較新版本語言才支援的語法(一種新式的屬性標記寫法)。這些測試在本機環境跑起來完全正常、顯示通過,但正式的持續整合流程裡,有一個維持較舊版本相容性的檢查項目——這批新語法在舊版本環境下不會被正確辨識,測試被悄悄地跳過執行,而不是報錯,直到那個檢查項目的結果被檢視時,才發現問題。
如果新語法在舊環境下直接跑不動、拋出明確錯誤,這個問題會很快被發現;但這個案例的麻煩之處在於,語法不相容的結果是「悄悄不執行」,而不是「執行失敗並報錯」——測試看起來像是跑過了,實際上根本沒有真的被執行到。這種「沒有錯誤訊息的失效」比報錯更難察覺,因為表面上一切正常。
寫程式碼的當下,很自然會用手邊環境支援的最新寫法,尤其是這種寫法通常更簡潔、更符合當下的慣用寫法。如果沒有明確意識到「這個專案需要相容到哪個版本」,這個限制不會自動出現在腦中,只會在真正碰到相容性檢查時才被揭露——而且揭露的方式,很可能是這種悄悄跳過而非直接報錯的形式,讓問題更晚才被發現。
你的專案裡有沒有明確的版本相容性限制?這個限制是寫在文件裡讓每個人都看得到,還是只存在某個人的記憶裡?
明天分析根因:「我覺得做完了」跟「有證據證明做完了」中間的落差。