リアルタイムにTDDする

この記事はソフトウェアテストの小ネタ Advent Calendar 2020の23日目の記事になります。
他の方も色々記事を上げているので是非見てみてください。

qiita.com

今回のこの記事は大分前に技術的な検証はしていたのですが、暇がなくてブログにしていなかったので、これを機に記事にしておきたいと思います。

TDDとは

TDDとはテスト駆動開発(Test-Driven Development)の略称です。
大半の方には説明は不要かと思うので、詳しく説明は説明しません。
簡単にいうとユニットテストしながらプログラムを書いていくというプログラミングスタイルです。

TDDで不満なところ

TDDは私も好きなのでよくやっているのですが、テストを実行するのが面倒くさいと感じるときがあります。
ユニットテストを実行するには、コンソールをアクティブにしてテストを実行するコマンドを実行したり、IDEを使用してプログラミングしている場合はマウスで数クリックしたりしなければいけません。
ショートカットキーを覚えてれば良いのですが、そもそもテストしているということを意識していないで、勝手にテストしているというのが理想です。
テストコードを書いて、ファイルを保存して、テストを実行して、プロダクトコードを書いて、コードを保存して、テストを実行するという手順を何回も繰り返すので、この手間をなんとかしたいという思いがあります。

理想

じゃあどうなっているのが良いのかという話ですが、個人的にはファイルを保存したときにテストを勝手に実行して、結果を表示してれるのが理想です。
最近はファイルを保存するときにフォーマッタをかけてくれる仕組みがあったりしますしね。
まぁ、ただこの仕組みが使えるのはテストがすぐに終了するようになっているというのが条件です。
1分掛かるテスト実行を、ファイルを保存する度に実行して欲しいかと言われると微妙な気がします。

リアルタイムTDD

調べているとやっぱり同じように思っている人はいるようで、ファイルの保存を監視してくれるツールというのがありました。
今回はFacebookが作成しているwatchmanというOSSを使用して試してみました。
日本語でのドキュメントがあまりありませんが、ファイルの変更を契機としてmakeなどを実行してくれるツールになります。
makeを実行してくれるので、Makefileの書き方次第ですが、静的解析やテスト実行など柔軟に対応してくれるようです。
もちろん makeコマンドでなくてもコマンドを指定して使用することができるので、Makefileを用意しなくても気軽に使用できると思います。
今回はGo言語で検証を行いましたが、以下のような感じになり、リアルタイムにテスト出来る様になりました。 キャプチャ

分かりにくいかもしれませんが、下のターミナルではwatchmanを使用してファイルの変更を待機しています。 そして、最初にわざとテストを失敗する状態でソースコードを保存しています。下のターミナルでテストが失敗していることが分かります。
その後、ソースコードを変更して保存していて、下のターミナルでテストが成功してるのがわかります。

最後に

今回は簡単なプログラムでのみ試してみました。
規模が大きなコードになってきた場合はどれくらい使えるものになるのかはわかりません。
今回使用したソースコードなどはGithubにあげているので、興味があれば試してみてください。

github.com