「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go API に不可欠な単体テスト – 自信を持ってコードを構築

Go API に不可欠な単体テスト – 自信を持ってコードを構築

2024 年 11 月 8 日に公開
ブラウズ:601

Essential Unit Testing for Go APIs – Build Code with Confidence

この API を構築する中で、認証、ロギング、Dockerization などについて取り上げてきました。しかし、まだ話し合っていないことが 1 つあります。テストです。 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 ハンドラーの 1 つに対するテストを書いてみましょう。 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-apis-build-code-withconfidence-ne3?1に再現されています。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3