自動テストのメリット
自動テストは「繰り返し」「誰でも」「手軽に」アプリケーションをテストできます。この特徴によって、実際の開発プロセスでは、下記のメリットがあります。
1. 自分の予想していなかった部分が壊れていること(Regression)を検知できる
2. ケアレスミスを防げる
3. 他のエンジニアにも実装を頼みやすい
システムに精通していないエンジニアに実装を頼んでも、適切な自動テストがあれば、ある程度の品質は保証できます。テストが失敗すれば、少なくとも使用からずれているといった問題は検知できます。さらに頼んだエンジニアのシステム設計理解も深まるという副次的なメリットも生まれます。自動テストが仕様書の代わりになるときもあります。
4. 自動テストが常に実行されているので、テスト対象のコードが動くという自信が持てる
5. コードの改善(リファクタリング)に取り組みやすくなる
もちろん安全度100%ではないですが、なかったらとても安全に利ファクタリングはできません。特に入力と出力が明確でテストパターンが網羅されている場合、リファクタリングは非常に進めやすくなります。
自動テストのデメリット
1. テストコードの追加にコストがかかる
テストコードの追加に際しても、テストデータの準備、設計、コーディングなどが必要になります。
2. 自動テストを構築するのにも技術力がいる
テストコードを書くのも本番コードと同等(あるいはそれ以上)の技術力、設計力が要求されます。誰でも簡単にテストを追加可能な設計ができる、高速・安定したテストを組むことができるエンジニアが必要です。
3. テストコードの追加の優先度が下がりがちになる
テストコードがなくてもアプリケーションは動いてしまうので、どうしても後回しになりがちです。どうしても本番のコード(テスト対象コード)の品質やバグFixが優先されてしまい、テストコード部分からカットされがちです。
本番コードは、みんな頑張って書くのですが、テストコードはあまり書きたがらない場合、テストカバレッジは下がってしまいます。例えば私の所属していたチームでは、一時期、本番コード (5人)、 テストコード (1人)という体制になってしまった時期もありました。
上記のような状態が慢性化しはじめると、
テストカバレッジが下がり、Regressionの検知率が下がる
↓
テストコードの価値が下がる
↓
誰も自動テストを信用しなくなる
↓
自動テストがつかいものにならなくなる (=誰も使わない)
ということになってしまいます。
ですので、自動テストを実施する際は
- テストコードをしっかりと設計できる技量を持ったチームか。
- テストコードを書くことを義務化できるほど工数、人員に余裕があるか。
- チームでテストコードを書く文化を作れるか。
といった点を十分に考慮し、どの程度までのテストを実施するのが好ましいか判断する必要がると思います。
筆者の体験した範囲で自動テストのメリットとデメリットを述べましたが、もっと詳しくちゃんと勉強したい方には以下の2冊がお勧めです。
実践テスト駆動開発
システムテスト自動化 標準ガイド
コメント
非常に共感できる話です。