在建置此 API 時,我們涵蓋了身分驗證、日誌記錄、Docker 化等內容。但我們還沒有討論的一件事是測試!如果您希望 API 能夠投入生產,那麼添加可靠的單元測試至關重要。在這篇文章中,我們將介紹 Go 中單元測試的基礎知識,以便您可以及早發現錯誤並交付高品質的程式碼。
單元測試可協助您驗證程式碼庫的每個部分是否如預期般運作。它們是您抵禦錯誤、回歸和其他令人討厭的意外情況的第一道防線。使用 Go 的內建測試庫,您可以快速設定測試:
準備好開始了嗎?讓我們深入了解一下! ?
Go 的測試框架很簡單並且直接整合到語言中。您可以透過使用 _test.go 後綴命名來建立測試檔案。讓我們先測試 main.go 中的一個簡單函數:
// main.go package main func Add(a, b int) int { return a b }
現在,建立一個名為 main_test.go 的檔案並加入以下程式碼:
// main_test.go package main import "testing" func TestAdd(t *testing.T) { result := Add(2, 3) expected := 5 if result != expected { t.Errorf("Add(2, 3) = %d; want %d", result, expected) } }
要執行測試,只需使用:
go test
如果一切正常,您將看到一則 ok 訊息。 ?
現在,讓我們為我們的 HTTP 處理程序之一編寫一個測試。我們將使用 Go 的 httptest 套件來建立模擬 HTTP 請求和回應記錄器。
// main_test.go package main import ( "net/http" "net/http/httptest" "testing" ) func TestGetBooksHandler(t *testing.T) { req, err := http.NewRequest("GET", "/books", nil) if err != nil { t.Fatal(err) } rr := httptest.NewRecorder() handler := http.HandlerFunc(getBooks) handler.ServeHTTP(rr, req) if status := rr.Code; status != http.StatusOK { t.Errorf("handler returned wrong status code: got %v want %v", status, http.StatusOK) } }
這樣,您可以隔離和測試您的處理程序,而無需啟動完整的伺服器。 ?
Go 有一種內建的方法來檢查測試覆蓋率。要查看測試覆蓋了程式碼的百分比,您可以運行:
go test -cover
如需更詳細的報道,請產生 HTML 報告:
go test -coverprofile=coverage.out go tool cover -html=coverage.out
開啟產生的 HTML 檔案以視覺化覆蓋了程式碼的哪些部分。這是查看哪裡可能需要額外測試的絕佳方法。
當測試依賴外部服務的功能(例如資料庫或外部API呼叫)時,您可以使用介面來模擬這些依賴關係。
// Define a simple interface for our database type Database interface { GetBooks() ([]Book, error) } // Implement a mock database type MockDatabase struct{} func (m MockDatabase) GetBooks() ([]Book, error) { return []Book{{Title: "Mock Book"}}, nil }
透過使用接口,您可以在測試過程中用您的模擬替換實際的依賴關係。這可以讓您的測試快速、隔離且可重複。
既然您已經開始建立單元測試,請嘗試將測試新增至 API 的其他部分! ?下週,我們將研究整合 CI/CD 管道,以便這些測試可以在每次更改時自動運行。敬請關注!
向您提問:您最喜歡的測試工具或技術是什麼?請在下面發表評論——我很想聽聽其他 Go 開發人員如何進行測試!
有了這些基礎知識,您就可以編寫可靠的測試,讓您的 Go API 更加可靠。有關更多測試技巧和高級技術,請繼續關注未來的帖子。測試愉快! ?
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3