はじめに
今回はGo言語のテストについて学習していきたいと思います。
テスト
Go言語には、テストを書くための標準パッケージであるtestingがあります。testingパッケージを使用すると、Go言語の関数やメソッドをテストすることができます。このパッケージを使用すると、テストの実行、エラー処理などを簡単に実行できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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メソッドを使用してエラーメッセージを出力します。
エラーの値を比較する
エラーが期待値と同じ値を持つことを確認する方法です。
1 2 3 4 5 6 7 8 9 10 | 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
関数を使って、エラー値が期待値と同じであることを確認します。
エラーの型を比較する
エラーが期待値と同じ型を持つことを確認する方法です。
1 2 3 4 5 6 7 8 9 10 | 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リクエストをテストするための例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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言語はテストの内部パケージも優秀なので、ちゃんとテストを作成してプロジェクトの環境を良くしたいです。