欠陥が報告されたときに最初にすべきことは何か?

Problem

QA中のQAチームやサービスを使っているユーザーから欠陥が報告された時、あなたは最初に何をするだろうか? 悔しがったり、恥ずかしいと思ったり、その欠陥の修正にすぐに着手していないだろうか?

これに関して、『テスト駆動開発入門』では、次のように記されている。

Q:欠陥が報告されたときに最初にすべきことは何か。
A:失敗する最小のテストを作成し、実行した後に修正する。
『テスト駆動開発入門』p.136 回帰テスト

なぜ?

テストを最初から完璧にするのはほぼ不可能。最初のコーディング時に作成していたテストから漏れたパターンが欠陥により発見される場合がある。また、欠陥を糧にどうすれば次に回帰テストを最初に書く際に漏れたパターンのテストを書けるようになるかを考える切欠にもなる。

どのように?

欠陥を修正する際は次の手順で行う。

  1. 手元で欠陥を再現させる
  2. ソースコードを注意深く調べ、欠陥を発生させている最小の箇所を絞り込む
  3. 絞り込んだ最小の箇所で欠陥を再現し、欠陥を修正したらエラーとならない自動テストを書く
  4. 書いたテストを実行し、エラーとなることを確認する
  5. 欠陥を修正する
  6. 書いたテストを実行し、エラーとならないことを確認する
  7. すべてのテストを実行し、欠陥に対する修正箇所が他の箇所をエラーとしていないことを確認する

1つ1つ手順を書くと非常に量が多い(=面倒)ように感じるかもしれないが、これにはいくつかのメリットがある。

メリット1:欠陥が本当に自分の考えた原因で発生しているのかが明らかになる

基本的にどんな原因で欠陥が発生しているのかは推理している。そのため、推理が外れていると“ここが原因と考えて修正したけど、別の条件の時は再度同じ欠陥が発生してしまった”ということが起こる。推理とは“ある事実をもとにして、未知の事柄を推し量ること”である。そこで、自分が絞り込んだ最小の箇所の自動テストを書き、欠陥を再現することで、その事実を積み重ね、欠陥の原因という未知の事柄をより明らかにするのである。

メリット2:対象に対する理解が深まる

欠陥の原因の最小の箇所を注意深く調べることで対象に対する理解が深まることに繋がる。欠陥が発生した原因は対象に対する理解が浅かった、ということもあり、そういった場合、欠陥を修正する前に書いた自動テストが成功してしまうことさえも起こりえる。特に欠陥の修正は既存のソースコードに対する調査の割合が非常にウェイトが大きくなる。そのため、もし対象に対する理解が浅い場合でも、対象に対する理解を深める良い機会にもなりえる。

メリット3:テストの堅牢さが高まる

欠陥を修正する際に自動テストを追加することで、欠陥が本当に修正されたか即座に確認できる。そして、自動テストとして追加することで、今後何らかの原因で欠陥が再発した際も自動テストがエラーとなることで、即座に問題を把握できるようになる。

メリット4:気付きが得られる

テストを書いて問題ないと思っていたけど欠陥が出た、ということは自分では気付いていないパターンや視点があったということを意味している。欠陥によって、そのパターンや視点に気付けたというのはなかなか得られない貴重な経験でもある。そのパターンや視点は普段何気なくコードを書いていると見落としていた自分自身のクセかもしれない。次にテストを書く時には同じことを繰り返さないように、注意した方が良い点でもある。

まとめ

  • テストを書いている時間はないとか、テストを書くのはROI(Return On Invested Capital)が悪いと思い込み勝ちである
  • しかし、1つ1つ手順を実施することは非常に多くのメリットがある
  • そのメリットを考慮すれば、テストを書くのは実は合理的かつ効率的な対応である