......UDDって何?
UDD、それはマグロ氏が提唱する革命的な開発手法である。
詳細は↓こちらの資料を参照されたし。
UDDやりたくなったよね?
UDDはひとりでもできるし、今からでもはじめられる。
というか楽しいのでやるべき。
でも......
ひとりでやるより、だれかとやったほうが楽しそうだよね。
テストの苦楽をともにする仲間が欲しいよね。わかる。
よし、ライブラリつくろう!
そんなこんなで、私はいつのまにかUDD用のライブラリの開発していたのだった。
もちろん、UDDで。
やりたいこと
コンソール君と一緒にUDD!
つまり、テスト結果に応じて、「それでも!」or「ユニコーン!」をコンソールに表示したい!
技術選定
今回は、先の資料に準じて、Vitestを使用する想定でライブラリを作成していきます。
実装を簡単に説明
VitestではReportersを使うことで、テスト結果の出力をカスタマイズすることができます。(カスタムReporterを作成する手順はこちら)
今回のカスタムReporterは、onTestRunEndとonFinishedのフック2つだけの実装。
onTestRunEndはすべてのテストが終了したあとに呼び出されるフックで、テストの最終結果が取得できます。この結果によって、コンソールに表示するメッセージ(「それでも!」or「ユニコーン!」)を用意しておきましょう。
※このときコンソールに出力してしまうとテスト結果より前にメッセージが表示されてしまうので注意
onFinishedフックは処理の終わりに呼び出されるフックなので、用意しておいたメッセージは、最終のこのタイミングで出力します。
useBannerオプションは、メッセージをバナー形式で表示する/しないが選択できるオプションです(要らなかったかも)。
export default class VitestUddReporter implements Reporter {
useBanner: boolean;
message: string;
constructor(options?: VitestUddReporterOptions) {
this.useBanner = options?.useBanner ?? true;
this.message = "";
}
async onTestRunEnd(
_testModules: ReadonlyArray<TestModule>,
_unhandledErrors: ReadonlyArray<SerializedError>,
reason: TestRunEndReason,
) {
this.message = getMessage(reason, this.useBanner);
}
async onFinished(_files: File[], _errors: unknown[], _coverage?: unknown) {
try {
console.log(this.message);
} finally {
this.message = "";
}
}
}
あとはnpmパッケージにして...
完成!!!!
これであなたのUDDも盛り上がること間違いなし!
今回はVitestでしたが、Jest等でも同じことはできます(たぶん)。
お好きなテストフレームワークでUDD拡張をつくってみてください。
もちろんUDDで。
今回作成したライブラリはこちら

