🧪
【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