はじめに
まず、はじめに本記事は「ユニットテストの良さを伝えること」が目的です。
ターゲットは、テストを書いたことのない新卒・学生エンジニアの方々を想定しています。
インターン時代に僕がテストについて学び、考えたこと・気付いたことを共有して、この記事を読んだ人に「テスト書いてみようかな?」って思わせるのがゴールです。
なので、内容のほとんどがテストに対する思いやモチベーションについてです。
具体的なテストの書き方については別記事でまとめようと思っているので、それを読んで頂ければと思います(^^)
あくまで個人的な考えなので、「これってこうじゃないの?」とか、「これってどういうことと?」などのツッコミはバシバシくださいm( _ _ )m
ユニットテスト is 何?
ユニットテストについて知ってもらうために、ユニットテストとは何かというところから始めたいと思います。
ユニットテスト(単体テスト)とは、ソースコードの個々のユニット、すなわち、1つ以上のコンピュータプログラムモジュールが使用に適しているかどうかを決定するために、関連する制御データ、使用手順、操作手順とともにテストする手法である。by Wikipedia
うーん、難しい。
僕はもっとフラットに考えていて、"プログラムの最小単位(ユニット)で、検証(テスト)を行うもの"だと思っています。
僕の場合大抵は、プログラムの最小単位をメソッドとして扱っています。
ユニットテストを書く理由
次に、ユニットテストを書く理由についてです。ユニットテストを書く理由は調べれば沢山出て来ると思います。
しかし、折角なのでこの記事では僕がユニットテストを書く理由を1つだけご紹介しようと思います。
それは、"自信を持ってコーディングするため"です。
僕は、自分が書くプログラムが常に完璧であると胸を張って言えません。「本当にちゃんと動くのか?」「今書いたところ他に影響及ぼしてないか?」「もっといい書き方があるんじゃないか?」など疑心暗鬼になりながらコードを書いています。
しかし、ユニットテストを書くようになってから「テスト通ってるから大丈夫」「最低限この動きが保証されていればOK」「もっと良い書き方があったらリファクタリングすればいいやー」くらいに割り切って考えるようになりました。
「自信を持ってコーディングするため」ってユニットテストを書く理由としては弱いかもしれませんし、ピンとこないかもしれません。
しかし、僕がテストを書く理由のほとんどは"これ"なんです。
ユニットテストのメリット・デメリット
僕のテストに対する熱い思いを語ったところで次は、ユニットテストのメリット・デメリットについて述べようと思います。これについては、あらゆる記事で沢山紹介されているので、個人的な意見を述べようと思います。
ユニットテストを書くメリット
ここでは、個人的にユニットテスト書いてて良かったなと思えたことを列挙しようと思います。だいたい以下の3つですね。
- クラスが疎結合になる
- リファクタリングが楽になる
- デバッグが楽になる
2,3に関してはなんとなくわかると思うので、1についてだけ説明しようと思います。
僕がいつも苦戦するのが、クラスを疎結合にすることです。
オブジェクト指向でプログラミングしていると、あるクラスが他クラスに依存していることがしばしば起こります。
実際にユニットテストを書いてみるとわかると思うんですが、他のクラスに依存しているクラスのテストって書きにくいんですよね(理由は別記事で)。
ユニットテストが書きにくいなって思った時はリファクタリングの良い機会になります。そのタイミングでリファクタリングすれば段々と疎結合になっていくはずです。
ユニットテストのデメリット
デメリットについても個人的な意見です。
- テストを書く分、工数を取られる
- テスト文化を浸透させるのが大変
1.に関しては単純に考えれば、テストを書く分、普段より工数が取られてしまうと思います。しかし、デバッグにとられる時間を考えてみるとそんなに変わらない気がします。
2.に関してはとても難しいことだと思います。ユニットテストを書いたことのない人に書かせることも大変なのに、それをチーム、または組織に広めることはかなり大変なことだと思います。
この記事のターゲットに対して、僕が考える解決策は、「チームの1番"若い人"がユニットテストを書く」ことです。
組織は所属する人の3割が変われば変化するそうです。
テストの書ける"若い人"がチームに新しく入るメンバーにユニットテストを教えるようになれば、いつの日かテスト文化が浸透するはずです(^^)
ユニットテストを導入するにあたって
ユニットテストを導入するにあたって、まず知って欲しいのが、テストの文法自体はそんなに難しくないということです。
しかし、テストを書いていて難しいと感じたことは多々あります。
では、なにが難しいのでしょうか?
僕は、テストのスコープだと思います。
テストのスコープ
僕がテストを書いていていつも思うのは、「どこまでテストを書いたら充分なのだろうか」ということです。
少なすぎるテストは問題外ですし、多すぎるテストも無駄でしかありません。つまり、必要なテストだけを書くというのが難しいのです。テストを書いたことのない人がテストを煩わしく思うのがこれが理由だと思います(僕がそうでした)。
でも、安心してほしいのが、必要なテストだけを書くテクニックは存在します(詳しくは別記事で)し、最初は無駄なテストを沢山書いても良いと思います。そのうち段々と慣れてくるはずなので、とにかく書いてみることが大切だと思います。
さいごに
ここまで読んでみていかがだったでしょうか?
この記事を読んで少しでも「ユニットテスト書いてみようかな?」と思って頂けたのであれば幸いです。
テストを書けるようになれば、エンジニアとしてワンランク成長できるはずです。この機会に是非テストを書くことをおすすめします。