ソフトウェア開発において、単体試験(Unit Test)は非常に有用ですが、作成者のスキルによってその効果には差が出ることがあります。
mock化するために苦労することも多く、単体試験を行うのは大変ですよね。
そこで、プログラミング言語に依らない基本的な考え方として、経験上バグが出やすい単体試験作成の心得(ポイント)を3つに絞ってみました。
これらのポイントを意識するだけで、費用対効果の高い単体試験を実現することができます。
1. length=0とnull値の両方とも試験するべし
文字列や配列を取り扱うコードの試験時に有効です。
正常な値はもちろん試験するとして、長さ0とnull値だった場合に意図した動作となることを確認しましょう。
length=0とnull値の両方を試験することで、以下のようなバグを潰せます。
- 0文字を考慮していない(IndexOutOfRange系エラー)
- nullを考慮していない(NPE系エラー)
2. 配列は要素数0と3を試験するべし
配列を取り扱うコードの場合、最低限、要素数0個と3個は試験すべきと考えます。
1つ目の心得と同じ観点から0個は必ず試験すべきとして、なぜ1個でも2個でもなく、3個を試験すべきなのか。
それは、要素数0個と3個を試験することで、以下のようなバグを潰せるからです。
- ループを最後まで回さないといけないところ、1周で抜けてしまっている
- すべての要素を見ないといけないところ、最初の要素または最後の要素しか見ていない
3. 文字列比較は前方一致/後方一致も試験するべし
文字列比較を行うコードの場合、対象文字の前方一致および後方一致の観点で試験値を用意するとよいでしょう。
具体的には以下のような感じです。
<例>
/tmpディレクトリ直下に存在する「index.csv」というファイルを読み込んで処理を行う
<試験値>
/tmp/index.csv ← これはOKパターン
/tmp/index.csv.csv ← NGパターン、後ろに余計なものがついている
/tmp/tmp/index.csv ← NGパターン、前に余計なものがついている
比較ロジックには==比較、startsWith、endsWithなどさまざまな方法がありますが、これらが適切に選択されているかを検証することが重要です。
まとめ
同値分割や境界分析などはよく聞きますが、それ以外でもちょっとした工夫でバグを潰せる3つのポイントをピックアップしてみました。 これらを活用して、費用対効果の高い単体試験を目指しましょう!