こんにちは。テストオペレーション部のとりです。

ソフトウェアテストに携わっていると、時々耳にする言葉として「殺虫剤のパラドックス」というものがあります。皆さんは聞いた事ありますか?「あ~あれね」とすぐに察する人も多いと思いますが、「IT業界なのになぜ殺虫剤?」「パラドックス?」と頭にハテナが浮かぶ人もいると思います。

私自身は言葉とおおよその意味は知っていましたが、「殺虫剤のパラドックス」という比喩表現が面白いなぁと常々思っていたので、改めてその意味を調べてみました。

既に知ってた人には言葉だけが独り歩きしない様に改めて意味を知って貰いたいのと、知らなかった人には「殺虫剤のパラドックス」を機会にソフトウェアテストの世界に興味が持てる様に本記事を書きます。

殺虫剤のパラドックスとは?

「殺虫剤のパラドックス」とは、ソフトウェアテスト技術者試験のJSTQB FoundationLevelのシラバスでも説明されている、ソフトウェアテストの7原則の1つに含まれている言葉です。

ソフトウェアテストの7原則

– テストは欠陥があることは示せるが、欠陥がないことは示せない

– 全数テストは不可能

– 早期テストで時間とコストを節約

– 欠陥の偏在

殺虫剤のパラドックスにご用心 ←ここ

– テストは状況次第

– 「バグゼロ」の落とし穴

JSTQB FoundationLevelシラバス
JSTQB-SyllabusFoundation_Version2018.J03

ものすごく分かりやすく言うと、同じ殺虫剤(テスト)を繰り返し使うと、次第に害虫(bug、欠陥)は駆除できなくなるよ。という意味です。JSTQBシラバスでは以下の様に説明されています。

同じテストを何度も繰り返すと、最終的にはそのテストでは新しい欠陥を見つけられなくなる。この「殺虫剤のパラドックス」を回避するため、テストとテストデータを定期的に見直して、改定したり新規にテストを作成したりする必要がある(殺虫剤を繰り返し使用すると効果が低減するのと同様に、テストにおいても欠陥を見つける能力は低減する)。ただし、自動化されたリグレッションテストの場合は、同じテストを繰り返すことでリグレッションが低減しているという有益な結果を示すことができる。

ここには2つの事が書かれています。

・同じテストを何度も繰り返すと、最終的にはそのテストでは新しい欠陥を見つけられなくなる。
・自動化されたリグレッションテストの場合は、同じテストを繰り返すことでリグレッションが低減しているという有益な結果を示すことができる。

まずは1つ目の部分に触れます。

同じ殺虫剤ではいずれ害虫は駆除できなくなる

「同じテストを何度も繰り返すと、最終的にはそのテストでは新しい欠陥を見つけられなくなる。」同じテストを繰り返した(同じテストケースを使用した)場合、最終的には新たな欠陥は発見されなくなります。これは潜在する欠陥を全て取り除いたという事では無く、あくまでそのテストで取り除ける範囲の欠陥が無くなったという話です。

例えば以下の様な仕様のログイン画面があったとします。

・IDは英数字で6桁まで

それに対して、正常系のテストケースとして

・英字6桁のIDを入力してログインを行う


というテストを行った場合、英字6桁のID入力で起こる欠陥については発見できますが、それを直してしまえばこのテストケースでテストを繰り返しても新たな欠陥が見つかる事はほぼありません。上記のテストケースはあくまで桁数上限のIDでログインが行えるかという観点でしたが、新たに欠陥を探す場合は更に以下の様な観点を追加する必要があります。

・英数字を混ぜた6桁のID
・6桁未満のID

また仕様が変更され、英数字で6桁までだったのが、

・IDは英数字記号で10桁まで

となった場合は、元のテストケースでは記号や10桁のIDで発生する欠陥は発見できないため、更に見直しが必要となります。

この様に同じ殺虫剤を使っていては、それに耐性のある欠陥は見逃されてしまうため、定期的にテストを見直す必要があります。

リグレッションテストは殺虫剤のパラドックスにあたらない

「自動化されたリグレッションテストの場合は、同じテストを繰り返すことでリグレッションが低減しているという有益な結果を示すことができる。」

前節では、同じテストを行っていては新たな欠陥は見つからない…と、あたかも同じテストを行う事は効果的では無いかの様な話になっていましたが、リグレッションテストについてはそれが当てはまりません。これが2つ目の説明部分です。

リグレッションテストは、システムがバージョンアップした際に既存仕様部分に対して実施されるテストです。「リグレッション」とは「回帰」「後戻り」「後退」といった意味を持ち、バージョンアップを挟むことにより、以前まで正常に動作していた機能が異常動作となったり、一度修正された欠陥が復活してしまうといった事を指しています。

また、リグレッションテストの実施タイミングとしては、リファクタリング後にも実施されます。リファクタリングとは、外部から見たソフトウェア機能の挙動を変えず、ソフトウェアの内部構造を変える事を指し、ソースコードを見直し内部構造を整理する事によって、処理の高効率化や保守性向上を図る事を目的としています。そうして内部構造を変えた際に、デグレードが発生していないかをリグレッションテストで確認します。

以上の様に、他の機能テストが新たな欠陥を発見し品質向上を目指すテストである事に対し、リグレッションテストは品質安定を確認する為のテストと言えます。

リグレッションテストでは前回と同じテストを繰り返す事にも意義があり、欠陥が見つからない事でリグレッション(後戻り)が発生していないという結果を出す事ができます。

前節の例を発展させて、具体例を挙げます。

・IDは英数字で6桁まで
・ID含むアカウント情報は、個別の登録画面で登録される

といった仕様を前提として、ログイン画面にて

・英字6桁のIDを入力してログインを行う

というテストを行ったとします。欠陥が発生しなければ、この時点で少なくとも英字6桁のIDではログインは行えるという事になります。次に仕様に変更が入り

・IDは英数字で6桁まで
・ID含むアカウント情報は、個別の登録画面および一括登録で登録される

と、アカウント情報の登録が一括登録でもされる様になった時、IDの仕様は変わっていませんが一括登録されたIDに欠陥があった場合に同じテストケースでも今回は欠陥が発見される可能性がでてきます。

この様に、殺虫剤のパラドックスは単純にテストを変化させる必要があるという事では無く、テストやその目的によって見直しが大事という事を伝えています。なお、リグレッションテストのテストケースは仕様が変わらなければ、その部分のテストケースは基本そのまま引き継ぎますが、機能追加や観点追加により見直しを行ってテストケースを追加する事はあります。

殺虫剤のパラドックスの元ネタ

ここからは余談です。パラドックスという言葉について調べてみました。一見正しそうにみえる推論から、受け入れがたい結論が得られるという意味の言葉で、有名な例としては「アキレスの亀のパラドックス」があります。(先を行く亀を人が追いかけて行った場合、人が追いついても亀はその時間を使って更に前を進むため人は亀を追い越せないという話。)
実はソフトウェアテストにおける「殺虫剤のパラドックス」という言葉には元ネタがあります。元々の意味は、害虫に殺虫剤を使うと特定の害虫の数が減る代わりに、その害虫が捕食していた別の害虫が増える事になり、結果として逆に害虫が増えてしまうという内容でした。

参考

wikipedia/Paradox of the pesticides

殺虫剤を使えば害虫は減るだろうという正しそうな推論に対して、逆の結果となってしまうというパラドックスです。それに対してソフトウェアテストおける「殺虫剤のパラドックス」は、殺虫剤に耐性ができてしまう(同じテストケースを使用し続ける事により新たな欠陥は発見されなくなる)という意味で使われているので、本来のパラドックスの意味とは微妙に違います。ただこれは、このテストケースでテストし続けていれば問題無いだろうという思い込みを止めて、求めてる品質が得られているか逆説的にテストケースを見直す事が品質向上のために必要、という教訓の意味でとらえれば私自身はしっくりきました。

まとめ

ということで、妙に印象に残る「殺虫剤のパラドックス」について紹介しました。こういう比喩表現の言葉は面白いですよね。ただ言葉の印象が強い分、意外と言葉のイメージだけで意味を捉えて本質からずれてしまう事もあるので、きちんと知る事は大事だと思いました。元ネタも調べてて面白かったです。またなにかソフトウェアテスト関連で印象深い言葉があれば、紹介したいと思います。

SHARE

  • facebook
  • twitter

SQRIPTER

AGEST Engineers

AGEST

記事一覧

AGESTのエンジニアが情報発信してます!
AGESTのサービスやソリューションのお問い合わせページはこちらです。

株式会社AGEST

Sqriptsはシステム開発における品質(Quality)を中心に、エンジニアが”理解しやすい”Scriptに変換して情報発信するメディアです

  • 新規登録/ログイン
  • 株式会社AGEST