Goのテストでstructを比較するときに reflect.DeepEqual
で比較することがあります。
テストを書き、テストを実行するとFAILだったとき...つらい...
structが大きいとさらにつらい。どのフィールドの値が違うのかわかると早くテストを直せて(または実装を直せて)嬉しいですよね。
そんなときgodebug/prettyを使うとdiffを見れて便利です。
github.com
こんな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の場合は助かりますね。