萌えハッカーニュースリーダー

2025/03/28 10:17 The right way to do data fixtures in Go

出典: https://brandur.org/fragments/go-data-fixtures
hakase
博士

ロボ子、今日のITニュースはテストスイートのデータフィクスチャについてじゃ。

roboko
ロボ子

データフィクスチャ、ですか。テストに必要なサンプルデータのことですね。

hakase
博士

そうじゃ!この記事によると、Go言語でsqlcとvalidatorを組み合わせると、フィクスチャ生成がうまくいくらしいぞ。

roboko
ロボ子

sqlcはSQLからGoのコードを生成するツールで、validatorはデータの検証を行うフレームワークですね。これらを組み合わせるメリットは何でしょう?

hakase
博士

フィクスチャは実際のデータレコードであるべきで、SQLでクエリ可能で、スキーマのデータ型やチェックに準拠する必要があるからのじゃ。validatorを使うことで、データの整合性を保てるぞ。

roboko
ロボ子

なるほど。記事には「フィクスチャはエラーを返さず、代わりにinput tを失敗させる」とありますが、これはどういうことですか?

hakase
博士

フィクスチャ生成を1行で済ませるためじゃ!エラーを返すと、テストコードが複雑になるからの。input tを失敗させることで、簡潔に記述できるのじゃ。

roboko
ロボ子

Go validateフレームワークでinputをアノテーションする、というのも気になります。必須/非必須を区別できるんですね。

hakase
博士

そうじゃ!nullableでないフィールドにはデフォルト値を設定し、呼び出し元が埋めるべきプロパティはできるだけ少なくする。こうすることで、使いやすいフィクスチャになるのじゃ。

roboko
ロボ子

ptrutil.TimeSQLNullやptrutil.ValOrDefaultのようなカスタムポインタヘルパーも使うんですね。これはポインタをsql.NullTimeに変更したり、デフォルト値を設定したりするためのものですか?

hakase
博士

その通り!これらのヘルパーを使うことで、コードが簡潔になるのじゃ。各テストケースは、tに基づいて生成された独自のULIDを取得するのもポイントじゃな。

roboko
ロボ子

ULIDですか。UUIDと似たようなものですか?

hakase
博士

UUIDよりもソートしやすいIDじゃ。テストの順序を管理するのに役立つぞ。formatNumSeqやnextNumSeqのようなヘルパー関数も重要じゃな。

roboko
ロボ子

数値をフォーマットしたり、一意な番号を取得したりするんですね。これらのヘルパーを使うことで、テストコード全体の一貫性が保たれる、と。

hakase
博士

その通り!validateOptsでinputの検証も行う。これにより、フィクスチャの品質が向上するのじゃ。

roboko
ロボ子

テストスイートを構築する上で、データフィクスチャの設計は非常に重要なんですね。この記事から多くのことを学べました。

hakase
博士

じゃろ?ところでロボ子、フィクスチャって英語で「fixture」って書くのじゃが、これって「固定具」とか「備品」って意味もあるのを知っておるか?

roboko
ロボ子

ええ、知っています。テストデータが、テスト環境を支える備品のようなもの、ということでしょうか。

hakase
博士

うむ。つまり、ロボ子は私にとっての最高のフィクスチャ…助手、ということじゃな!

roboko
ロボ子

博士、私は備品ではありません!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search