有一項 bug ,在調整前我請 Ray 評估需要多少時間。Ray 看了一下,告訴我:「星期三會好。」
很好,有明確時間,規格也請他重新敘述,目前符合想像,看起來萬事俱備,只欠東風。更驚人的是,到了星期三,功能居然如期交了出來。天知道我看著他回覆的「我做完了」有多感動。
但,基於前幾次累積下來的交手經驗,我還是多問了一句:「有自己測過嗎?」
「有,我測過了沒問題。」
很好。有測試,還準時交付,事情慢慢地走上了正軌,我的專案終於開始有救了嗎??擦著眼角的淚水,覺得今天的陽光特別燦爛。
星期四,我準備開始驗收。這次的功能有不同情境,我拿出 case 開始測試。
第一個:錯
沒關係,人生難免有意外,畢竟人無完人,可能只是沒有注意到吧?
第二個:錯
嗯......開始感受到一絲熟悉的氣息,果然是熟悉的 Ray 最對味。
第三個:還是錯
我看著眼前三個 Case,陷入了長考,同時回想了一下星期三回覆的:「有,我測過了沒問題。」一時之間,對「測過」這兩個字產生了濃厚的興趣,通過率目前看來0%,跟我對於測試過的定義似乎有一點點小小的差距。
在軟體開發中,工程師寫完 Code 後,通常不會直接丟到正式環境,而是會經過不同的 Environment(環境)進行開發與測試。依照不同專案,可能會有 Local、DEV、SIT、UAT、PROD 等環境。每個環境的用途、設定、資料甚至串接的服務都可能不同,因此「測過了」其實還有一個很重要的問題:
你在哪裡測的?
Local Environment 可以簡單理解成工程師自己電腦上的開發環境。
功能開發完成後,通常會先在 Local 進行基本的 Self Test,確定程式至少能正常執行,主要功能符合預期,才會再將 Code Commit、Merge,準備部署到共用的測試環境。因此,Local 測試正常,只代表第一關通過了,並不代表部署到其他環境後一定會得到相同結果。
當 Code 從 Local 進入 DEV、SIT 或 UAT 等環境後,面對的環境設定、測試資料、API 或其他串接服務都可能有所不同。
這也是為什麼軟體開發中偶爾會出現一句非常經典的話:「可是我 Local 明明是好的。」
(Ray 大也很常這樣跟我說)
所以當工程師說「測過了」,除了確認在哪個環境測,也要確認測試的版本和現在部署出去的版本是不是同一版。
即使 Local 已經測試成功,部署到共用環境後,還是可以先進行一次基本功能確認,例如 Smoke Test(冒煙測試),快速確認主要功能是否能正常運作。
Smoke Test 不會把所有 Test Case 從頭到尾完整測過一次,而是先挑幾個最基本、最重要的功能快速確認。例如網站能不能正常開啟、主要流程能不能操作,或這次修改的功能是否能正常執行。
「冒煙測試」這個名稱其實源自硬體測試的概念:設備通電後,先看看會不會直接「冒煙」。後來被軟體開發借來形容——先快速確認這一版會不會一上場就出大事。
如果連這些基本功能都有問題,就代表這個版本可能還不適合繼續進行更完整的測試。
對 PM 來說,不需要自己架環境,也不一定需要懂得怎麼部署,但至少測試時,可以再三確認一下:
在哪個環境測?
現在部署的是哪一版?
部署後有沒有再確認?
當然,依照專案成員之間的默契,測完了就是上 UAT 給我以及 USER 測試,因此無論到底是在哪個環境沒問題,測出來就是沒辦法。而且這些錯誤,是原本 BUG 就出現的地方,而非改過之後另外出現的錯誤,換言之,就是原本要修改的東西,並沒有解決。
後來,因為 Ray 的開發進度無法應付客戶,有機會再和前任工程師合作。他改出來的功能一次到位,程式碼乾淨整齊,debug 後複測沒有問題。
我:「你太強了,完全沒有錯喔你超棒!!」
工程師:「因為我會自己先測過一次啊:D」
當天下班踏著月色回家,月下吟詠:
需求交君無掛念,改成功能自安詳,當時只道是尋常。