カテゴリー: TechBackEnd

[Go初心者]テストについて学習

はじめに

今回はGo言語のテストについて学習していきたいと思います。

テスト

Go言語には、テストを書くための標準パッケージであるtestingがあります。testingパッケージを使用すると、Go言語の関数やメソッドをテストすることができます。このパッケージを使用すると、テストの実行、エラー処理などを簡単に実行できます。

package main

import (
    "testing"
)

func TestAddition(t *testing.T) {
    result := add(1, 2)
    if result != 3 {
        t.Errorf("Expected result to be 3, but got %d", result)
    }
}

func TestSubtraction(t *testing.T) {
    result := subtract(5, 3)
    if result != 2 {
        t.Errorf("Expected result to be 2, but got %d", result)
    }
}

func add(x int, y int) int {
    return x + y
}

func subtract(x int, y int) int {
    return x - y
}

上記のコードでは、add関数とsubtract関数をテストしています。TestAddition関数は、add関数が期待どおりに動作するかどうかを、TestSubtraction関数は、subtract関数が期待どおりに動作するかどうかを確認します。それぞれのテスト関数は、*testing.T型の引数を受け取ります。関数内で、期待される結果が得られなかった場合には、t.Errorfメソッドを使用してエラーメッセージを出力します。

エラーの値を比較する

エラーが期待値と同じ値を持つことを確認する方法です。

if err != nil {
    t.Errorf("error: %v", err)
}

wantErr := errors.New("expected error")
if !errors.Is(err, wantErr) {
    t.Errorf("want %q, but got %q", wantErr, err)
}

このコードでは、期待値となるエラー値を定義します。そして、errors.Is関数を使って、エラー値が期待値と同じであることを確認します。

エラーの型を比較する

エラーが期待値と同じ型を持つことを確認する方法です。

if err != nil {
    t.Errorf("error: %v", err)
}

wantType := &MyErrorType{}
if reflect.TypeOf(err) != reflect.TypeOf(wantType) {
    t.Errorf("want %q, but got %q", reflect.TypeOf(wantType), reflect.TypeOf(err))
}

このコードでは、期待値となるエラーの型を定義します。そして、reflectパッケージを使って、エラーの型が期待値と同じであることを確認します。

httptest

httptestは、Goの標準パッケージの一部であり、HTTPリクエストをテストするためのパッケージです。テスト中にHTTPリクエストをシミュレートし、HTTPレスポンスを返すことができます。このパッケージを使用することで、Webアプリケーションのテストをより効率的に行うことができます。

httptestの使い方

httptestを使用するには、テストファイルでhttptest.NewServer()を呼び出す必要があります。これは、テスト用のHTTPサーバーを起動します。次に、テスト用のHTTPリクエストを作成し、httptest.NewRecorder()を使用してHTTPレスポンスを取得します。

以下は、HTTPリクエストをテストするための例です。

func TestHTTPHandler(t *testing.T) {
    req, err := http.NewRequest("GET", "/test", nil)
    if err != nil {
        t.Fatal(err)
    }

    rr := httptest.NewRecorder()
    handler := http.HandlerFunc(HTTPHandler)

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

    expected := "Hello World!"
    if rr.Body.String() != expected {
        t.Errorf("handler returned unexpected body: got %v want %v",
            rr.Body.String(), expected)
    }
}

上記の例では、HTTPリクエストを作成し、テスト用のHTTPサーバーで実行しています。HTTPレスポンスのステータスコードとボディを比較して、正しいレスポンスが返されたことを確認しています。

さいごに

Go言語はテストの内部パケージも優秀なので、ちゃんとテストを作成してプロジェクトの環境を良くしたいです。

おすすめ書籍

nukky

シェア
執筆者:
nukky
タグ: golang

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

2週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

4週間 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前