ソフトウェアのテストはなぜ困難なのか
ソフトウェアのテストが難しい、というのは聞いたことがあると思います。
IT業界ではこのことは一般的に認識されていると思います。
では、なぜソフトウェアのテストは困難なのでしょうか?
ソフトウェアのテストが困難である主な理由
- 仕様が複雑
テストをするためには、そのソフトウェアが満すべき仕様が明確でなくてはなりません。ですが、ソフトウェアの規模が大きくなると、仕様が複雑化し、明確でない部分もでてきます。 - 条件の分岐が多すぎて総てを網羅し尽せない
あるモジュールのなかに10個のif文があるとします。
単純にすべてのケースについてテストしようとすると、2の10剩の入力パターンが必要となります。
適切にモジュール化されていない場合にはもっと酷い状況になるでしょう。 - 後付けのテスト
最近ではテスト駆動開発が一般に浸透するようになってきましたが、過去に書かれたコードをメンテナンスする場合には、テストコードを後から追加することになります。
テスト駆動開発では、テストから設計へのフィードバックが頻繁に行われるため、インターフェースは使い易く改善され、テストコードを書き易くなります。
テストコードを後から追加する場合には、コードのリファクタリングが必要なケースが少くありませんが、テストコードを追加するためのリファクタリングなので、当然テストコードが存在しない状態でのリファクタリングとなります。
テストコードなしでのリファクタリングは危険が伴い、細心の注意が必要となります。 - テストの実行が面倒
理想としてはテストはコードを変更するたびに行うべきですが、テストが手動の場合、毎回実行するのが面倒になり、テストへの心理的ハードルが上ります。
開発者の効率やメンタルヘルスにおいて、テストが自動化されている、というのは重要です。 - テストへのリソースが確保されていない
最近は開発コスト削減への圧力が様々な要因からあります。
なんとかテスト工数を減らせないか、と考える人々が出てくるわけです。
しかし、品質はどうでも良いプロジェクトでもない限り、テスト環境をきちんと構築しないとプロジェクトの後の方でバグが頻繁したり、リリース後のバグや変更によるコストが大きくのしかかってきます。
このように、いくつかの要因が重なってテストを困難なものにしています。
ですが、必要のない機能を削って仕様を簡素化し、テスト駆動開発を行い、コードの変更のたびに繰り返し簡単にテストを実行できればテストを困難にする要因の大半を取り除くことができます。
いわゆるアジャイルな開発手法では、このような点がよく考慮されています。