」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Go API 的基本單元測試 – 充滿信心地建立程式碼

Go API 的基本單元測試 – 充滿信心地建立程式碼

發佈於2024-11-08
瀏覽:547

Essential Unit Testing for Go APIs – Build Code with Confidence

在建置此 API 時,我們涵蓋了身分驗證、日誌記錄、Docker 化等內容。但我們還沒有討論的一件事是測試!如果您希望 API 能夠投入生產,那麼添加可靠的單元測試至關重要。在這篇文章中,我們將介紹 Go 中單元測試的基礎知識,以便您可以及早發現錯誤並交付高品質的程式碼。

為什麼要進行單元測試?

單元測試可協助您驗證程式碼庫的每個部分是否如預期般運作。它們是您抵禦錯誤、回歸和其他令人討厭的意外情況的第一道防線。使用 Go 的內建測試庫,您可以快速設定測試:

  • 確保您的函數行為一致。
  • 使重構程式碼變得更容易,而不會引入新問題。
  • 增強您對一切正常運作的信心。

準備好開始了嗎?讓我們深入了解一下! ?


第 1 步:設定基本測試

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)
    }
}

運作原理:

  1. 測試函數:Go中的任何測試函數都必須以Test開頭並接受*testing.T參數。
  2. 斷言:我們檢查結果是否符合我們的預期。如果沒有,我們使用 t.Errorf.
  3. 來記錄錯誤

要執行測試,只需使用:

go test

如果一切正常,您將看到一則 ok 訊息。 ?


第 2 步:測試 HTTP 處理程序

現在,讓我們為我們的 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)
    }
}

解釋:

  1. httptest.NewRequest:建立一個新的 HTTP 請求。這模擬了對您的 /books 端點的請求。
  2. httptest.NewRecorder:模擬 HTTP 回應。我們稍後會檢查它是否符合我們的預期。
  3. ServeHTTP:使用模擬請求和記錄器呼叫我們的 getBooks 處理程序。

這樣,您可以隔離和測試您的處理程序,而無需啟動完整的伺服器。 ?


第 3 步:執行覆蓋率測試

Go 有一種內建的方法來檢查測試覆蓋率。要查看測試覆蓋了程式碼的百分比,您可以運行:

go test -cover

如需更詳細的報道,請產生 HTML 報告:

go test -coverprofile=coverage.out
go tool cover -html=coverage.out

開啟產生的 HTML 檔案以視覺化覆蓋了程式碼的哪些部分。這是查看哪裡可能需要額外測試的絕佳方法。


第 4 步:模擬外部依賴項

當測試依賴外部服務的功能(例如資料庫或外部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 更加可靠。有關更多測試技巧和高級技術,請繼續關注未來的帖子。測試愉快! ?

版本聲明 本文轉載於:https://dev.to/neelp03/essential-unit-testing-for-go-apis-build-code-with-confidence-ne3?1如有侵犯,請聯繫[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3