在 Go 軌道上的測試

學習如何在 Exercism 上測試你的 Go 練習。


只要切換到練習目錄並執行go test,就能執行 exercism 專案目錄中的 Go 練習。

cd exercism/project/directory/go/leap
go test

使用資料競爭偵測器執行測試

除了執行go test之外,有些練習應該加上資料競爭偵測器的旗標來執行,以確認你的解法不會引入資料競爭的 bug。 在相關的練習中,你會看到要你加上資料競爭偵測器旗標-race來執行測試的提醒。 執行go test -race來檢查資料競爭。 例如:

cd exercism/project/directory/go/bank-account
go test -race

執行基準測試

大多數練習都含有基準測試,你可以用它們來判斷解法的變動對效能有什麼影響。 如要執行某個練習的基準測試,請在練習目錄中使用go test -v --bench . --benchmem指令。

看看下面這段輸出。

BenchmarkReverse-16       403594              2537 ns/op             176 B/op         34 allocs/op

這表示這個基準測試執行了 403594 次疊代,才得到可靠的計時結果。 平均每次執行耗時 2537 ns。 每次操作平均發生 34 次記憶體配置,平均使用 176 位元組。

可測試的範例

有些練習會用到範例測試,它們會和標準的練習測試一起執行。 這些範例用來記錄並驗證練習的 API,對於判斷預期的練習 API 是什麼很有幫助。

Go fmt

請在提交程式碼之前,先對你的程式碼執行go fmt。

提示與訣竅

動手解練習

每個練習的 README.md 都會提供概括的說明,但 Go 測試程式會非常具體。 打開測試程式快速看過一遍,就算感覺像在作弊,也照做吧。 留意有幫助的註解、測試資料,還有測試函式的名稱。 在你寫下任何東西之前,先試著執行go test,看看錯誤訊息能不能給你一些起頭的靈感。

你的第一個目標是先讓程式能編譯,即使測試失敗也沒關係。 為此,你應該為函式建立「存根」。 意思是在函式主體裡留空,只留下它必須回傳的東西。 寫return 0或return "",或任何能讓它編譯過去的東西。 有時候為了弄清楚函式簽章,你得回頭更仔細地讀測試程式。 等你弄清楚所有必要的函式簽章之後,測試程式就會抱怨 0 是錯誤的答案。 這時再開始填寫函式主體。

修正錯誤

測試通常會在遇到第一個錯誤時就停下來。 修正那一個,重複這個過程,直到沒有錯誤為止。 go test有一些實用的選項。 go test -v會提供更詳細的輸出。go test -run <regexp>只會執行名稱符合<regexp>的測試。

panic 會產生大量輸出。 一開始看起來可能很嚇人,但勇敢一點。 看看 panic 輸出最上方,找出 panic 訊息。 那應該會大致描述問題所在。 然後繼續往下讀,找出第一個提到你程式碼的地方。 那通常會直接指出問題所在。

如果要找出並行程式的問題,試試go test -race。

整理你的程式碼

再說一次,執行go fmt。 Golint可以告訴你程式碼中go fmt抓不到的風格問題。 你也可以看看go vet,它會警告程式碼中潛在的問題。 閱讀並留意程式碼審查中常見的意見。 對於涉及並行的練習,即使測試通過了,也試試go test -race。 即使你為了基準測試的效能而最佳化,也要把可讀性放在心上。 有時候最佳化能幫你找到簡潔又好讀的解法,但在追求效能時,往往會忍不住放棄可讀性。

加分測試

少數練習有加分測試,只執行go test並不會跑這些測試。 如果你除了原本的練習之外,還要解這個加分練習,就必須輸入go test -tags bonus,或測試程式文件中提供的類似指令。