テスト管理
堅実なテストは、品質・リファクタリングによる保守性の向上に欠かせない条件です。
言語を問わず、テストを書くことは非常に重要ですが、この重要性を他者に伝えるのは難しいです。
プロジェクトにおいてこの重要性を共通認識とするには、実際にプログラミングがどれほど早くなるかを経験させることが重要です。
ここではテストの自動化による恩恵を記述していきます。
単体テスト
-
テストを完全に自動化して、その結果もテストにチェックさせる。
javaの場合はjUnitを利用してテストコードを記述し、後述するCI(Continuous Integration)を使ってコンパイルと同時にテストを実行させます。
自動化することでテストのチェックに割く時間が短縮され、バグの発見が迅速になります。 -
テストをきっちり書くことでバグ検出に絶大な威力を発揮する。
テストをきっちりと書くことと頻繁にテストを行うことで、コードの修正時に紛れ込んだバグの発見が容易になります。
これは、バグ検出・原因の特定が早くなり、ミスを起こしやすい箇所を意識することができます。 -
テストを頻繁に実行する。
コードの修正ごとに実装者がテストを行うのはもちろんですが、プロジェクトのテストコードすべてを1日に一度は行うようにCIで設定しましょう。
-
バグ報告を受けたら、まずそのバグを明らかにする単体テストを書く。
バグの報告を受けた場合、現象を再現できるデータを用意し確認します。その後、現象を修正する前にテストコードを記述しましょう。
バグのスコープを絞り込む必要があるか、関係す津不具合があるようであれば、複数のテストを記述します。
単体テストは、バグを突き止めるのにも、再度同じようなバグが単体テストをすり抜けないことを保証することにも役立ちます。 -
実行できない完全なテストより、実行できる不完全なテストのほうがまし。
テストを追加する際、対象のクラスがなすべきことをまず調べます。それから不具合を起こしそうなテストするようにしましょう。
フィールドのsetter/getterのテストなど、単純なものは書かないほうがよいです。これは、たくさんのテストを書こうとするあまり、必要なテストを書き漏らしてしますからです。
単純でバグのなさそうな箇所のテストを多く記述するよりも、少なくてもバグの潜んでいそうな条件のテストの方が重要ということです。 -
失敗の恐れのある境界条件を考えて集中的にテストする。
境界条件は得に重要なテストとなるので必ず記述するようにしましょう。
日付範囲などはバグが発生しやすく、また、意図していない処理となる可能性が高いです。テストをしっかりと書くことで未然に防ぐことができます。 -
例外のテストをわすれないこと。
例外が発生する箇所のテストも記述するようにしましょう。
例外の発生箇所の妥当性を意識でき、本当に例外を発生させる必要がある箇所なのか考えることができます。 -
テストでバグがみつからなくても、テストを書くことをやめてはならない。
テストからバグがみつからなくても、テストは書きましょう。
リファクタリングが必要になったとき、広範囲に影響がありそうな修正を行う際に、テストがあることで安心して修正できるためです。
参考文献
Continuous Integration
jenkinsの説明(省略)
Selenium
Seleniumの説明(省略)