Goのstructを比較してdiffを見るなら godebug/pretty が便利

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の場合は助かりますね。