13.8 構造体の比較にgo-cmpを使う

Goのテストにおいて、複雑な構造体の値を比較したいことがよくあります。ロジックの結果はなんらかの値として作用することが多いので、型の値を比較したいと思うのは自然なことです。値が等価かどうかの判定には、go-cmp 1というライブラリが便利です。

1

https://github.com/google/go-cmp 2021/12時点の最新である v0.5.6 で確認しています。

13.8.1 go-cmpを使う理由

構造体をstretchr/testifyを使って比較すると、reflect.DeepEqual()よりも手軽にわかりやすいエラーが表示できることは紹介しました。より高度な検証を行いたい場合、あるいはGoの標準のテストの書き方に合わせたいのであれば、go-cmpをおすすめします。

13.8.1.1 テストを標準的な形式で書きやすい

Goはテストのフレームワークを提供していません。テストは testing パッケージを使って実装します。どのようなフレームワークを使うかはプロジェクトメンバーの構成や状況によって変わるので、一概に何が良いと決めることはできません。Goはテストの書き方の標準的な書式を用意しており、Goにあまりなじみのない新規参画者やテストのフレームワークになじみのない開発者も、ベテランであっても同じようにテストコードを読めることを目指しています。go-cmpreflect.DeeqEqual() の代わりに使用できます。

リスト13-6: go-cmp を使ったスライスを含む構造体の比較
	// go-cmp の Diff を使って値を比較
	if diff := cmp.Diff(tom