はじめに
テストは重要です。プログラムをすればするほどテストの重要性に気づきます。
最近アジャイルの勉強をして、実際の開発でベストプラクティスを取り込んでさらに重要性に気づきました。
今までの経験を踏まえてテストの重要性と失敗あるあるを再確認したいと思います。
簡単な修正なのでテストしない
1行だけ修正すれば大丈夫だ。これはテストしなくても問題ないね。コミット。
(次の瞬間)
システムアボートしたぞ!何かしたか?
え?コミットを。。。
お前の環境では動くのか?
。。。やってません。
動作確認ぐらいしろ!
どんな簡単な修正でも間違いはあります。最低限動作確認はしましょう。(本当はテストも必要)
網羅テストをしない
基本的なテストパターンを実施して。よしオッケー。後は条件の違いや計算式の違いだけだから大丈夫っと。コミット。
(より上位のテストにて)
あれ?この値おかしくない?このデータだとエラーが起きるよ。
調べてみます。(ログやモジュールを確認)
(1時間後)
ここかあ!条件間違ってる。計算式間違ってる。。。
原因わかったのか?単体テストではどうだったんだ?
あ、基本的なパターンしかやってなかったので。。。
すぐに修正して、今度はちゃんと全パターンテストしろよ!
テストカバレッジを考える必要があります。まずC0(命令網羅)は必須だと思います。C1(分岐網羅)とC2(条件網羅)は、あり得ないパターンや冗長なパターンだったりするので、状況に応じてだと思います。しかしC0でオッケーではなく、C1とC2も考慮した上で決めましょう。
いきなり結合テストで単体テストをしない
簡単なコードだからいきなり結合テストでオッケーだよね。
エラーだ。インターフェース間違ってたか。修正して、実行っと。
値が違う?計算式間違ってた。修正して、実行っと。
まだ値が違う。どこに問題があるんだ?
(何度か試してみても違う)
コード間違ってないと思うけど。。。上位モジュールでデバッグしてみるか。あれ?引数が間違ってる。別のモジュールのバグだ。
このモジュールのバグ見つけたから修正して〜。(担当者に伝える)
ああ、修正終わるまで待ちだ。。。
いきなり結合テストだとテストしたいモジュールのバグが別のモジュールのバグかわからず時間がかかることがあります。テスト自体の効率は単体テストの方がよいので必ず単体テストしてから結合テストに入りましょう。
テストコードを書かない
簡単なプログラムだ。はい完成。テストコードも必要ないだろう。コンソールから1回実行すればオッケーだね。
あれ?エラーだ。ここが違うのか。修正して、もう1回実行。
よし動いた。あれ?値が違う。条件によって計算式変える必要あるんだ。条件追加して。条件あるから2パターン実行しないと。
(何度かエラーや修正を繰返して)
結局テストパターン10個にもなってる。コンソールから実行だと面倒だ。(最初からテストコード書いてればよかった。。。と思いつつ)これで最後だからコンソールでやって終わらせよう。
また違う!修正して、コンソールから実行だと面倒だ。(最初からテストコード書いてればよかった。。。と思いつつ)これで最後だからコンソールでやって終わらせよう。(繰り返す)
プログラムは意図しない間違えがあるものです。繰り返しテストするのは当たり前なので最初からテストコードを書きましょう。
テストを自動化していない
バグを修正したぞ。単体テストを実行して。結合テストも実行して。オッケー。これでコミット。完璧だ。
(数日後)
あれ?この結合テスト結果前と違うんだけど。このモジュール修正した?
この前修正したかなあ。単体テストも結合テストもしたんだけど。。。
ああ、こっちのモジュールからも呼んでるだよ。対応するよう修正して。
はあ。。。
テストを自動化してないと修正したモジュールに影響あるテストが漏れる場合があります。規模によってですが最低限毎日全テストを自動実行しましょう。
まとめ
- プログラムの品質を確保する上でテストは重要です。いくらコードレビューを十分にしたところで、間違えはあるもので、必ず最後はテストで確認しましょう。
- テストの網羅度は最低限C0(命令網羅)100%が必須です。実行されていない部分にはバグが潜んでいます。C1(分岐網羅)、C2(条件網羅)は100%でなくとも考慮する必要はあります。必要な部分はテストに追加しましょう。
- テストは単体テスト→結合テストの順にやりましょう。結合テスト1発でオッケーならすぐに終わるかもしれません。しかし1発で終わることはまれだし、終われない場合は時間ばかり掛かってしまいます。
- テストはテストコードを書いて繰り返しできるようにしましょう。テストは何度も繰り返すものです。単体テストで何度も実行し、その後のテストやリリース後でもバグが見つかったら再度テストします。さらにはリファクタリングする時にも必要です。
- テストは自動化して毎日全テスト実行しましょう。日々修正しているモジュールは色んな要因でバグが混在します。テスト済みのテストコードは、毎日実行する事でデグレードを早期に発見できます。
自分が書いたコードは完璧だと思いがちで、テストは面倒だという気持ちが起こりがちです。でも実際は自分の書いたコードはバグばかりで、テストを何度も繰返して品質を向上させます。
面倒だと言う気持ちを捨てて、テストは重要だ、必要だという気持ちを持ちましょう。実際に経験して、失敗を繰り返さないとわからないのですが、やはりテストは重要なのです。