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

ソフトウェア開発における品質保証の要となるソフトウェアテスト。しかし、その奥深さと複雑さは、時にテスト担当者を悩ませます。

テストはどこまで行えば十分なのか、バグを完全になくすことは可能なのか、限られた時間とリソースで最大の効果を出すにはどうすればいいのか。

これらの問いに答える羅針盤となるのが、「ソフトウェアテストの7原則」です。

国際的なソフトウェアテスト技術者資格認定機関であるISTQBが提唱するこの原則は、長年のソフトウェア開発とテストの経験から導き出された普遍的なガイドライン。テストの限界、効率的なテストの進め方、品質に対する考え方など、テストに関わる人が共通認識を持つべき重要な概念を提供します。

そこで今回はソフトウェアテストの7原則の内容を詳しく解説し、現場でどのように活用すればテストの効率と品質を向上させられるのか、具体的な事例を交えながらわかりやすくお伝えします!

▼テスト効率化の方法についてはこちら▼

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

ソフトウェアテストの7原則は、ソフトウェアテストを行う上で、テスト担当者が知っておくべき基本的な考え方をまとめたものです。

この原則は、国際的なソフトウェアテスト技術者資格認定機関であるISTQB(International Software Testing Qualifications Board)が提唱しており、ソフトウェアテストの世界において広く認知されています。

これらの原則は、長年のソフトウェア開発とテストの経験から導き出されたもので、テストの限界や効率的なテストの進め方、品質に対する考え方など、テストに関わる人が共通認識を持つべき重要な概念を提供しています。

これらの原則を理解し、適切にテスト計画やテスト実施に役立てることで、テストの効率と品質を向上させることが可能となります。

7原則の内容

①テストは欠陥があることは示せるが、欠陥がないことは示せない
 (Testing can show the presence of defects, but not their absence.)

テストによってバグの存在を証明することはできても、バグがまったく存在しないことを証明することはできないという原則です。

②全数テストは不可能
 (Exhaustive testing is impossible.)

あらゆる入力やパターンをすべて網羅してテストすることは現実的に不可能であり、リスク分析や優先度付けによってテスト範囲を絞る必要があるという原則です。

③早期テストで時間とコストを節約
 (Early testing saves time and cost.)

バグはソフトウェア開発のなるべく早い段階で発見すべきで、開発初期からテスト(静的テストも含む)を行うことで手戻りを減らし、修正コストを抑えられるという原則です。

④欠陥の偏在
 (Defects cluster together.)

見つかるバグの多くはシステムの一部のモジュールや機能に集中する傾向があるという原則です。いわゆる「パレートの法則」で、全体の8割の欠陥は2割のコンポーネントに潜むとも言われます。

⑤殺虫剤のパラドックスに注意
 (Beware of the pesticide paradox.)

同じテストケースを繰り返していると次第に新しい欠陥が見つからなくなるという原則です。虫に殺虫剤の耐性が付くように、テストもマンネリ化すると効果が薄れることを意味します。

⑥テストは状況次第(コンテキストに依存)
 (Testing is context-dependent.)

テストの方法や重点項目はシステムの文脈(業種・規模・目的など)によって異なるべきという原則です。

たとえば安全重視の制御ソフトとWebアプリでは求められるテストが異なります。

このようにプロジェクトの状況に応じて最適なテスト戦略を選ぶ必要があるでしょう。

⑦「バグゼロ」の落とし穴
 (Absence-of-errors fallacy.)

「バグが一つもないソフトウェア=高品質」とは限らないという原則です。検出・修正した欠陥の数だけで品質を評価するのは誤りで、ユーザのニーズを満たすことこそ重要だと戒めています。

それでは、それぞれの原則について詳しく見ていきましょう。

原則1: テストは欠陥があることは示せるが、欠陥がないことは示せない

テストを行う目的は不具合(バグ)を見つけ出すことであり、テストによって「ソフトウェアにバグが存在しない」ことを証明することはできません。

言い換えると、テストでバグが見つからなかったとしても、それは“バグがない”という証拠にはならないのです。

極めて入念にテストして問題が検出されなくても、テストしていないケースや想定外の条件下では不具合が潜んでいる可能性があります。

現場での具体例

テストチームはテストの計画段階でカバレッジを最大化する工夫をしつつ、それでも不確実性については認識しておく必要があります。

例えば、「今回のテスト範囲・条件ではバグは見つからなかった」という形で結果を正確に報告し、関係者に過信を与えないようにします。

さらに、リリース前後の障害対応計画も予め用意しておきましょう。

もし本番稼働後に想定外の不具合が発覚しても迅速に対処できる体制を整えておけば、被害を最小限に抑えられます。

テストでバグが検出されなくても「本当に十分なテストケースだったか?」を振り返り、必要に応じてテストケースの見直しや追加を行う姿勢が大切です。

原則2: 全数テストは不可能

文字通り、考え得るあらゆるテストケースを網羅することはできないという原則です。

ソフトウェアの入力値や事前条件の全組み合わせをテストすることは、ごく簡単なプログラムを除いて非現実的ですよね。

現実のソフトウェアでは入力も状態も組み合わせが膨大になり、時間も人的リソースも無限ではないため、リスクにもとづいて重要なテストに絞り込む必要があります。

現場での具体例

イメージしやすい例として、2つの入力AとBの積を計算して出力Cを返すような単純なプログラムを考えてみましょう。

仮にAとBが1〜100の整数だとしても、その組み合わせは1万通り(100×100)にもなります 。

実際のソフトウェアでは入力値がもっと多様だったり、外部環境の状態も影響したりするため、テストパターンは容易に天文学的数字に膨れ上がるでしょう。

より現実的で効率的なテストをおこなうためには、リスクにもとづくテスト計画立案が肝要です。

プロジェクトのスケジュールやリソースが限られている中で最大の効果を出すには、ソフトウェアの性質やユーザに与える影響度を踏まえて優先度の高い機能や典型的な使用パターンにテストを集中させます。

具体的には、境界値分析などのテスト設計手法を活用して重要ケースを代表値でカバーすることが有効です。

先ほどの例でも、AとBの全組み合わせ1万通りを試す代わりに、「例えばAとBが100のとき正常終了し、101のときエラーになる」といった境界値に着目したテストを行えば充分です。

このようにテスト技法を駆使して効率よく欠陥を検出しましょう。

また、テスト範囲や優先度については関係者と合意形成し、認識を合わせておくことも重要です。「全数テストはできないが、この範囲までテストすればリスクは許容範囲に下がる」という線引きをチームで共有しておくのです。

原則3: 早期テストで時間とコストを節約

ソフトウェアテストは可能な限り早い段階から開始するべきであり、そうすることで欠陥の早期発見・早期修正が可能になり、結果的に時間とコストの節約につながるという原則です 。

開発プロセスの初期(要件定義や設計の段階)から静的テスト(レビューやインスペクション)を実施し、その後の動的テストも前倒しして行うことで、後工程での大きな手戻りを防ぎます。

この考え方は「シフトレフト(テストの左シフト)」とも呼ばれます。

現場での具体例

バグを発見するタイミングによって、修正にかかる工数は大きく異なります。

極端な例として、納品直前の受け入れテストで重大な欠陥が見つかった場合、プログラムを修正した上で影響範囲の機能を全て再テストする羽目になります。それはまるで家を建て終わった後に基礎から作り直すような大工事になってしまいます。

一方、実装直後の単体テストで不具合に気付けば、その部分のコードを修正し再テストするだけで済みます。釘一本の打ち間違いに気付いたらすぐ抜いて打ち直せるようなもので、影響範囲も小さく抑えられます。

さらに言えば、コーディングを始める前、つまり設計段階のレビュー(静的テスト)で不備を発見できれば、そもそも実装でミスが発生しないため理想的です。

以上のように、不具合は見つけるのが早ければ早いほど修正コストが低く抑えられます。

しかしながら、現場ではテスト工程が後回しにされるケースが散見されます。

たとえば、要件定義〜基本設計を自社で行い、詳細設計〜結合テストを外部委託するような開発では、テスト工程が開発の後半に集中しがちです。

その結果、結合テストや受け入れテストの段階で重大な欠陥が表面化し、納期直前になってスコープ変更や追加工数が発生するというトラブルが起こりえます。

これではリリーススケジュールが大幅に遅延したり、コスト超過を招いたりしかねません。

この状態を防ぐためにも、開発初期からテストを計画・実施するフローを取り入れましょう

具体的には、要件や設計のレビュー(インスペクション)を計画に組み込むことで、実装前の不備を洗い出します。

またコーディング開始後も、単体テストや継続的インテグレーションを活用して実装中から逐次テストを行います。

これにより欠陥を常に早期に潰し込めます。

さらに、テスト計画を立てる際にはテスト実施の優先順位にも配慮しましょう。システム全体に影響が大きい重要機能や、過去の経験上バグが混入しやすい箇所から優先的にテストを行うことで、後工程での大幅な手戻りを防ぎつつコストを抑制できます。

例えば、新しく複雑なモジュールからテストし、安定した既存モジュールは後回しにするといった工夫です。

「早く」「重点を押さえた」テスト実施が時間・コストの最適化につながるのです。

原則4: 欠陥の偏在

ソフトウェアに存在するバグは、ある特定のモジュールや機能に偏って集中する傾向があるという原則です。

経済学のパレートの法則になぞらえて、「全バグの8割は全モジュールの2割に潜む」とも言われます。

実際、リリース前のテストで見つかる不具合や運用中に発生する障害の大部分は、ごく一部のコンポーネントに集中します。

原因としては、複雑な機能や未成熟な新規モジュール、あるいは開発メンバーの得手不得手によって不具合混入率に偏りが生じることが挙げられます。

現場での具体例

例えば、あるプロジェクトで実施したテストの不具合報告を分析したところ、特定の機能Xからのバグ報告が全体の半数以上を占めていたということがよくあります。

別のプロジェクトでは、担当者Aが実装したモジュールばかり不具合が多発し、他の部分は比較的安定していた…というケースもあるでしょう。

このように、バグは均一に発生するのではなく、偏った分布を示すのが普通です。

またテストリーダーが各機能に均等にテストリソースを配分してしまい、肝心なバグ多発箇所を十分にテストしないというミスも起こりがちです。

あるいは、テストの途中でバグが多発している兆候が見えているのに計画を頑なに変更せず、結果として問題の多い箇所を十分検証できないままリリースしてしまう、という落とし穴もあります。

この原則を活かすには、テスト結果を逐次分析し、バグ発生が偏っている箇所がないか確認しましょう。

もし特定のモジュールで不具合が多いと分かれば、そこにテスト工数を重点投入するなど計画を柔軟に調整します。

また、テスト開始前の段階でも過去の類似プロジェクトの不具合データや開発メンバーの経験から「この部分は不安定になりやすい」「複雑度が高いからバグが出やすいかも」といった欠陥の偏在を予測し、リスクベースで重点を置くテスト領域を決めておくと良いでしょう。

なお、この原則は原則2(全数テスト不可能)への対策としても重要です。

テストすべきところとそうでないところをメリハリ付けすることで、有限のリソースで効果的なテストが可能になります。

原則5: 殺虫剤のパラドックスに注意

「殺虫剤のパラドックス」とは、同じテストを繰り返していると新たな欠陥が次第に見つからなくなるという現象を指します。

害虫駆除で同じ殺虫剤を使い続けると虫に耐性が付くように、ソフトウェアテストでも同じ一組のテストケースばかり実行していると、そのテストでは検出できるバグを出し尽くしてしまい、新しいバグが潜んでいても見逃してしまうのです。

これは特に長期のプロジェクトで、既存のテストケースに頼りきりになっている状況で陥りやすい落とし穴です。

現場での具体例

あるプロジェクトで毎回同じ回帰テストを行っていたところ、初期のテストサイクルでは多くのバグが見つかっていたのに、後半になるとほとんどバグが検出されなくなったとします。

しかしそれは「ソフトウェアが安定したから」ではなく、テスト手法がマンネリ化して網に引っかかるバグがいなくなっただけかもしれません。

同じ観点・手順のテストでは新規の欠陥は見つけにくくなっていくのです。

実際、検出漏れのバグが後になって顕在化し、「なぜテストで見つからなかったのか?」と問われたら、このパラドックスが原因だった…ということも起こり得ます。

そのような事態を防ぐためには、定期的にテストケースとテストデータを見直し、テストに多様性を持たせることが必要です。

各テストサイクルごとに観点を変えてみたり、新しい不具合例やユーザ視点のシナリオを取り入れたりして、テストケースをアップデートしましょう。

たとえば、前回は正常系を中心にテストしたなら、次回は異常系シナリオを重点的に追加する、あるいは別の視点を持つチームメンバーにテスト設計をレビューしてもらうなどのアプローチがあります。

また、探索的テストを実施して未知の観点からバグを探すのも有効です。

テスト自動化された回帰テストについては毎回同じテストを繰り返すこと自体は意味がありますが、それだけに頼るのではなく新規テストも並行して追加していくことで、回帰も新規もバランス良く欠陥検出ができる体制を維持しましょう。

原則6: テストは状況次第

 ソフトウェアテストのアプローチや重点事項は、プロジェクトの状況(コンテキスト)によって異なるという原則です。

開発するシステムの種類・目的・規模・ユーザ層・求められる品質特性などに応じて、適切なテスト戦略やテスト手法は変わります。

一つとして同じプロジェクトはない以上、「この方法さえ使えば完璧」という万能なテスト手法は存在しないのです。

現場での具体例

例えば、自動運転システムや医療機器ソフトのように安全性が最重要なソフトウェアでは、テストにも極めて厳密さと網羅性が求められます。

境界値分析やフェールセーフの検証、異常系テストなどを徹底的に行い、人命に関わる不具合がないようあらゆる手を尽くすでしょう。

一方で、社内で使う簡単な業務ツールやスタートアップのWebサービスであれば、テストはある程度にとどめてまずユーザにリリースし、フィードバックをもとに改善していく方が価値が高い場合もあります。

また、開発手法の違い(ウォーターフォール型かアジャイル型か)によってもテストの進め方は異なります。アジャイル開発では短いイテレーションごとに小規模なテストとリファクタリングを繰り返すのに対し、ウォーターフォールでは各工程の後にまとまったテスト期間を設ける、といった違いがあります。

この原則を活かすために、プロジェクトの特性に応じてテスト計画をカスタマイズしましょう。

まずソフトウェアの目的と品質目標を明確にし、安全性・セキュリティ・性能・ユーザビリティなど、何を優先すべきかを洗い出します。

それに基づき、適切なテストレベル・テスト技法を選定します。

例えば、セキュリティ重視なら脆弱性診断やペネトレーションテストを計画に組み込み、ユーザ体験重視ならUI/UXのユーザテストを重視するといった具合です。

プロジェクトごとに最適なテスト戦略をデザインすることが重要です。

また、組織としてテンプレートのテスト計画がある場合も、鵜呑みにせず自プロジェクトの状況に照らして取捨選択・追加を行いましょう。

テスト担当者はこの原則を念頭に、コンテキストに合わせた柔軟な判断が求められます。

原則7: 「バグゼロ」の落とし穴

最後の原則は、「バグをすべて取り除けば良いソフトウェアになる、とは限らない」というものです。

テスト担当者がありとあらゆるテストを実施し可能な欠陥を全て発見・修正できると期待するのは誤りです。

また、たとえ指定された要件を全て満たし、既知の欠陥を全部直したとしても、ユーザーのニーズを満たさない使いにくいシステムでは意味がないという戒めでもあります。

品質とは単に欠陥の少なさではなく、システムが本来の目的をどれだけ果たせているかで評価すべきなのです。

現場での具体例

たとえば、ある製品で不具合を徹底的に潰し込み「既知のバグ0件」でリリースにこぎつけたとしましょう。

しかしユーザーからは「使いにくい」「動作が遅い」「欲しい機能が実装されていない」といった不満が続出しました。

この場合、いくらバグが一つもなくてもユーザーにとってその製品は価値が低く、品質が高いとは言えません。

また、バグ修正にこだわるあまり開発スケジュールが延びて市場投入が遅れ、競合にシェアを取られるといったリスクもあります。

極端に言えば、クラッシュもしないし誤動作もしないけれど誰にも使われないソフトを作っても意味がないわけです。

このような事態を防ぐために、品質の定義を欠陥件数以外の観点も含めて考えることが大切です。

機能要件のバグを減らす努力はもちろん必要ですが、それだけでなく非機能要件(使いやすさ、性能、セキュリティなど)の満足度や、ユーザーがそのソフトで目的を達成できるかを重視しましょう。

テスト計画時に「ユーザストーリーを満たすか」「受け入れ基準をクリアしているか」を品質ゴールとして明確化し、単なるバグ件数よりもユーザ価値に直結する指標にフォーカスします。

さらに、プロジェクトの関係者には早い段階で「完全無欠なソフトウェアは存在しない」ことを共有し、テストの目的はバグ撲滅ではなくプロダクトの価値向上であるという認識を持ってもらうよう働きかけましょう。

これは原則1の説明でも触れたようにステークホルダーとの重要な認識合わせにもなります。

原則同士の関係とバランスの取り方

ここまでソフトウェアテストの7原則を個別に見てきましたが、実際の現場ではこれらの原則をバランス良く組み合わせて適用していくことが大切です。

7原則はそれぞれ単独で完結するものではなく、互いに関連し合ってテスト全体の指針を形作っています。

例えば、原則1(欠陥の不在は証明できない)と原則2(全数テスト不可能)は組み合わせて「テストで完全無欠を保証することはできない」という事実を示しています。

これは原則7(バグゼロの落とし穴)にも直結しており、「すべての欠陥を検出・除去しよう」とする幻想を捨てる代わりに、ユーザ価値を重視したテストにフォーカスすべきことを教えてくれます。

まずこの基本的な前提をチーム全員が理解することで、無理な要求や過信を避け、建設的なテスト計画の議論が可能になります。

また、原則2(全数テスト不可能)を受けて効果的なテストを行うためのアプローチが、原則4(欠陥の偏在)と原則5(殺虫剤パラドックス回避)です。

全てをテストできないからこそ、バグが多発しやすい箇所を見極めて重点的にテストする、そしてテストケースを定期的に見直し多角的にテストすることで新たな欠陥を見逃さないようにするという戦略が有効になります。

これらに原則3(早期テスト)を組み合わせれば、プロジェクト後半になって慌てて重点箇所をテストするのではなく、早期からリスクの高い部分を集中的にテストして欠陥を前倒しで仕留めることができるでしょう。

例えば、開発の初期段階で「重要度が高く不安のあるモジュールXの設計レビューとユニットテストを重点実施する」→「そこで洗い出した欠陥情報をもとにモジュールXの結合テストも追加強化する」といった具合に、早期かつ重点志向で進められるわけです。

さらに、原則6(コンテキスト依存)は他の全ての原則を包む前提と言えます。どの原則もプロジェクトの状況に合わせて解釈・適用しなければなりません。

例えば早期テスト(原則3)の重要性は多くのプロジェクトで共通ですが、ウォーターフォール型開発とアジャイル開発とでは「早期」の意味するところが異なるでしょう。また欠陥の偏在(原則4)も、プロダクトの種類によって偏在のパターンが違うはずです。

WebサービスならUI周りにバグが集中するかもしれませんし、組み込み制御なら特定センサーとのインターフェース部に集中するかもしれません。

自分のプロジェクト環境をよく観察し、7原則を機械的に当てはめるのではなく柔軟に運用することが大切です。

最後に、原則7(バグゼロの落とし穴)はテスト活動の最終目的を見失わないための指針として常に念頭に置きましょう。

バグを減らすこと自体が目的になってしまうと手段と目的が逆転します。あくまで「品質向上」「ユーザ満足の実現」が目的であり、そのための手段としてテストがあり原則があるのだという基本に立ち返ることが重要です。

以上のように、7原則は相互に補完し合う関係にあります。一つひとつを個別に守れば良いというものではなく、プロジェクト状況に応じてバランスよくすべてを考慮することで、効果的かつ無駄のないテストアプローチを導くことができるのです。

まとめ

今回はソフトウェアの7原則について徹底解説しました。

ソフトウェアテストの7原則は、テスト担当者がテストを行う上で重要な考え方をまとめたものです。これらの原則は、テストの限界、効率的なテストの進め方、そして品質に対する考え方など、テストに関わる人が共通認識を持つべき重要な概念を提供しています。

以下に、7原則の内容を改めてまとめます。

・テストは欠陥があることは示せるが、欠陥がないことは示せない:テストはバグの存在を証明できても、バグが全く存在しないことは証明できません。

・全数テストは不可能:全ての入力やパターンをテストすることは現実的ではなく、リスク分析と優先順位付けが重要になります。

・早期テストで時間とコストを節約:バグは開発の早い段階で発見するほど、修正コストを抑えられます。

・欠陥の偏在:バグはシステムの一部のモジュールや機能に集中する傾向があります。

・殺虫剤のパラドックスに注意:同じテストケースを繰り返すと、新しいバグが見つかりにくくなります。

・テストは状況次第(コンテキスト依存):テストの方法や重点は、システムの状況によって異なります。

・「バグゼロ」の落とし穴:バグがないソフトウェアが、必ずしも高品質とは限りません。

これらの原則を理解し、適切にテスト計画やテスト実施に役立てることで、テストの効率と品質を向上させることができます。

また、これらの原則は、テスト担当者が現場で遭遇する様々な状況において、適切な判断を下すための指針となるでしょう!

QA業務効率化ならPractiTest

テスト管理の効率化についてお悩みではありませんか?そんなときはテスト資産の一元管理をすることで工数を20%削減できる総合テスト管理ツール「PractiTest」がおすすめです!

PractiTest(プラクティテスト)に関する
お問い合わせ

トライアルアカウントお申し込みや、製品デモの依頼、
機能についての問い合わせなどお気軽にお問い合わせください。

この記事の監修

Dr.T。テストエンジニア。
PractiTestエバンジェリスト。
大学卒業後、外車純正Navi開発のテストエンジニアとしてキャリアをスタート。DTVチューナ開発会社、第三者検証会社等、数々のプロダクトの検証業務に従事。
2017年株式会社モンテカンポへ入社し、マネージメント業務の傍ら、自らもテストエンジニアとしテストコンサルやPractiTestの導入サポートなどを担当している。

記事制作:川上サトシ