🧪

【Go】Goのテストに入門してみた! ~構造体の比較テスト編~

に公開

はじめに

前回は「スライスとマップの比較テスト」を見ていきました。
今回は「構造体の比較テスト」に入門します!

前回の記事はこちら!

この記事でわかること

  • 構造体比較の基本
  • 複合型を含む構造体の比較方法
  • 構造体の比較テストを行うシーン

構造体比較の基本

構造体フィールドにスライスやマップなどの複合型が存在しない場合は、 == を使って比較することができます。

main_test.go
package main

import (
    "testing"
)

type User struct {
    ID int
    Name string
    Age int
}

func TestStruct(t *testing.T) {
    u1 := User{ID: 1, Name: "Taro", Age: 20}
    u2 := User{ID: 1, Name: "Taro", Age: 20}
    if u1 != u2 {
        t.Errorf("u1 and u2 are not equal")
    }
}

実行すると、以下のような結果を得ることができます。

ターミナル
# go test -v
=== RUN   TestStruct
--- PASS: TestStruct (0.00s)
PASS
ok      go-test-practice   

複合型を含む構造体比較

構造体フィールドに複合型が存在する場合は、== を使って比較することができません。
この場合は、reflect.DeepEqual() を使って比較します。

main_test.go
package main

import (
    "reflect"
    "testing"
)

type User struct {
    ID int
    Name string
    Age int
    Hobby []string
}

func TestStruct(t *testing.T) {
    u1 := User{ID: 1, Name: "Taro", Age: 20, Hobby: []string{"reading", "running"}}
    u2 := User{ID: 1, Name: "Taro", Age: 20, Hobby: []string{"reading", "running"}}
    if !reflect.DeepEqual(u1, u2) {
        t.Errorf("u1 and u2 are not equal")
    }
}

実行すると、以下のような結果を得ることができます。

ターミナル
# go test -v
=== RUN   TestStruct
--- PASS: TestStruct (0.00s)
PASS
ok      go-test-practice        0.191s

構造体の比較テストを行うシーン

構造体の比較テストは、処理結果が期待通りのデータになっているか確認したいときによく使われます。
代表的な例として、以下のようなケースがあります。

  • APIレスポンスの検証
    外部APIや自作エンドポイントから返ってくるレスポンスが、想定した値と一致しているかをチェック

  • データベース操作の検証
    抽出したレコードを構造体にマッピングし、その内容が正しいかチェック

つまり、外部からの入力や永続化されたデータを「期待通りの構造体で表現できているか」を確かめる場面でよく使われます。

まとめ

今回は「構造体の比較テスト」について学びました。

Goでは構造体の比較方法が、フィールドの型によって変わります。

  • 基底型のみで構成された構造体 → == で比較できる
  • スライスやマップなど複合型を含む構造体 → reflect.DeepEqual() で比較できる

APIレスポンスやデータベースから取得した値を検証する際には、構造体の比較テストがとても役立ちます。

次回は「Testify」に入門します!

参考

Discussion