この投稿はC#アドベントカレンダー 2023(シリーズ 2)の 25 日目 🎄 の記事です。C#でスナップショットテストを簡単に始められるライブラリVerifyTests/Verifyについて紹介します。
スナップショットテストとは
スナップショットテストとは、ある時点のプログラムの出力をスナップショットとして保存しておき現在の出力と比較することで、予期せぬ変更が起こっていないか検証するテスト手法のことです。
(現在のところ)スナップショットテストと検索するとJest のスナップショットテストが最初のほうにヒットしますが、ここでは以下のように UI コンポーネントに対するテストとしてとても有効な手法として紹介されています。
A typical snapshot test case renders a UI component, takes a snapshot, then compares it to a reference snapshot file stored alongside the test.
もちろん UI コンポーネントに対して有効なテスト手法なのですが、別に UI コンポーネントだけのテストってわけではなく、 どうしても複雑になってしまうオブジェクトに対するリグレッションテストとして使い勝手がよいと思います。
また、UI 関連のテストとして似たようなテストに Visual Regression Testing があります。これはスナップショットを、シリアライズしたテキストではなく、スクリーンショットなどの画像として保存しておいて比較するテスト手法のことです。Jest の紹介では Snapthot Testing と Visual Regression Testing は区別しているんですが、どちらもある時点のスナップショットを作成しているという点は共通しているので、ここではどちらもスナップショットテストと呼ばせてもらことにします。
このスナップショットテストは非常に強力なテスト手法 なのですが、スナップショットの作成、管理、比較などやることがたくさんあり独自で実装するのは骨が折れます。こういう処理はライブラリに任せたいものです。
そこで Verify ですよ
そこで登場するのがスナップショットテストライブラリであるVerifyTests/Verifyです。
この Verify ですが、スナップショットテストに必要な基本的な機能はもれなく抑えているとても便利なライブラリです。xUnit などのテストフレームワークを組み合わせて使うのですが、以下のように C#で使われるたいていのフレームワークに対応しています。
スターも(現在のところ)2.2k ついていて NuGet 関連のレポジトリではかなりついているほうではないでしょうか。また、2023 年 9 月に AWS の FOSS fund にも選ばれています。ちなみにライセンスは MIT です。