Goのテストでstructを比較するときに reflect.DeepEqual
で比較することがあります。
テストを書き、テストを実行するとFAILだったとき...つらい...
structが大きいとさらにつらい。どのフィールドの値が違うのかわかると早くテストを直せて(または実装を直せて)嬉しいですよね。
そんなときgodebug/prettyを使うとdiffを見れて便利です。
こんなUserのstructがあったとします
type User struct { ID string Name string Email string }
テストでstructを reflect.DeepEqual で比較し一致するかをチェックします
一致しなかった場合、pretty.Compare
でdiffを表示してみます
func TestCompare(t *testing.T) { tests := []struct{ user User want User } { { user: User{ ID: "id", Name: "inari", Email: "inari111@example.com", }, want: User{ ID: "id", Name: "inari111", Email: "inari111@example.com", }, }, { user: User{ ID: "id", Name: "inari111", Email: "inar222@example.com", }, want: User{ ID: "id", Name: "inari111", Email: "inari111@example.com", }, }, } for _, test := range tests { if !reflect.DeepEqual(test.user, test.want) { t.Errorf("error: %s", pretty.Compare(test.user, test.want)) } } }
テスト実行結果
$ go test --- FAIL: TestCompare (0.00s) user_test.go:49: error: { ID: "id", - Name: "inari", + Name: "inari111", Email: "inari111@example.com", } user_test.go:49: error: { ID: "id", Name: "inari111", - Email: "inar222@example.com", + Email: "inari111@example.com", } FAIL exit status 1 FAIL github.com/inari111/godebug-pretty 0.011s
小さいstructなら必要ありませんが、大きいstructの場合は助かりますね。