単体テストも他の技能と同じく訓練が必要ですよね、きっと

ここ1週間くらい、単体テストを悩みつつ書いていたのですが、ようやく基礎の基礎の基礎くらいが微かに分かってきて、気持ちが落ち着いてきました。(ちなみに、もちろんプロダクトコードではないので、自分のテストスキルの低さを日記で喧伝しても、勤め先に迷惑は掛けないと判断している。…のだけど、どうだろう? 微妙だ…)

コードなんてまともに書いたことがないので、色々と躓きます。しかし、単体テストを書いたことがない人間が、単体テストを書けるようになるには、単体テストを書くしかない。当たり前です。そして、その手順は、おそらく次のようになります。

  1. まず、1つのクラスでよいので、テストのことなんか考えずに、気の向くままに実装を行う。
  2. 次に、予想以上のテストのしづらさに悪態をつきながら、泣く泣くテストを書く。テストを書けないところは、テスト対象のコードを直して、なんとか書く。
  3. そして、次のクラスを実装する時には、どうすればテストしやすいかを考えてコードを書くようになる。たとえ正解が出せなくても、考えるようにはなる。
  4. 2に戻って繰り返す。

文章にすると単純ですが、これでよいのだと思います。というか、そうするしかないでしょう。

なお、『体系的ソフトウェアテスト入門』に、次のような記述があります。

多くの管理職および一部の開発担当者は、コーディング方法を知っているならばテスト方法も知っているはずだと信じている。テスト能力はすべての開発担当者に最初から備わっているものだ、と思っているかのようである。すべてのレベルのテスト(単体テスト、統合テスト、システムテスト、受け入れテストなど)の一般的な概念、および単体テストを効果的に実行するために必要な具体的な技法について、開発担当者にトレーニングを施すべきである。

Rick Craig,Stefan P Jaskiel:『体系的ソフトウェアテスト入門』,p.106,日経BP出版センター,2004.10.

まさにそのとおりだと同意できます。やったことがない作業を上手くやろうとしても、そりゃ無理ですわよ奥さん、という話なのです。書いてみて初めて分かることが多いです。そもそも自分の場合、コーディング方法からしてあやしいわけですし。

今は、単体テストの基本的な所作を身に着けることを優先しているので、細かい部分や正しいやり方などを犠牲にしていますが、一段落したら復習したいです。何が分かり、何が分からないのかを、自分のために言語化したいです。また、JUnit拡張のツールは、Java用だけでも色々あるようなので、もっと触りたいです。