ソフトウェアテストとは?【基本概念の整理】
ソフトウェアテストとは、開発したソフトウェアが想定どおりに動作するかを評価・検証することです。
テストには、 プログラムコードを実行してその結果からソフトウェアのバグを検出し、品質評価や動作確認を行う「動的テスト」と、プログラムコードを実行せずにドキュメントやソースコードをチェックして誤りや脆弱性を検出する「静的テスト」の2つがあります。
さらに、機能単体のテストからシステム全体のテストまで、開発工程ごとにテストを実行することで、問題を早期に発見し、ソフトウェアの信頼性を継続的に高めます。
ソフトウェアテストの目的は、製品の品質が基準を満たしているか検証することです。品質には機能性や安定性、セキュリティ性能、ユーザビリティなど、さまざまな要素が含まれます。
現代のソフトウェアは高度化・複雑化しており、開発段階でのわずかな設計ミスや実装ミスが、大規模なシステム障害を引き起こすことがあります。欠陥が未発見のままリリースされると、ユーザーから低品質なソフトウェアと評価され、開発会社は信頼を失うことになりかねません。
こうしたリスクを抑え、ユーザーが安心して使える製品を提供するためには、テストを通じて事前に問題を発見・修正することが必要です。隠れた欠陥を見つけ出し、リリース前に修正することが、ソフトウェアテストの重要な目的です。
ソフトウェアの品質は、開発担当者やテスト担当者だけでなく、実際に使用するユーザーにとっても大きな関心事です。
PTWが行ったアンケート調査では「アプリやWebサイトなどをリリースする前に、しっかりテストされていることは重要だと思うか?」という質問に対し、66.6%のユーザーが「とても思う」、24.6%のユーザーが「やや思う」と回答しました。合計すると、91%以上もの方が、テストの実施を求めているという結果になりました。
この結果から、ソフトウェアテストは単なるバグの発見作業にとどまらず、ユーザーの期待や信頼に応えるための重要な取り組みであることがわかります。
調査データ引用元:https://prtimes.jp/main/html/rd/p/000001581.000044800.html
ソフトウェアテストの7原則と実務での活かし方
ソフトウェアテストの7原則とは、開発担当者やテスト担当者が理解しておくべき、テストにまつわる基本的なガイドラインのことです。ISTQBの「テスト技術者資格制度 Foundation Level シラバス Version 2023V4.0.J01」では、ソフトウェアテストの7原則を定義しています。
ここでは、7原則それぞれの内容と実務でどのように活かせるかについて解説します。
出典:ISTQB「テスト技術者資格制度 Foundation Level シラバス Version 2023V4.0.J01」
ソフトウェアテストでは、欠陥が見つかれば、その存在をはっきり示せます。しかし、欠陥が見つからなかった場合では「欠陥がない」とは言い切れません。これはいわゆる「悪魔の証明」であり、存在しないものを証明することは不可能です。
開発側が想定しない操作や極端なデータ入力など、検証の範囲外に欠陥が潜んでいる可能性は常に残ります。また、テスト設計の段階で見落としがあれば、そもそも欠陥を検出する機会すら訪れません。
この原則は、テストが品質を確認する手段である一方、完全性を保証するものではないことを定義しています。
■ 実務での活かし方
テストの目的をあらかじめ明確に定めることが重要です。たとえば「致命的なバグの早期発見を優先する」「仕様通りに動作しているかを確認する」「リリース判断の材料をそろえる」など、目的によってテスト範囲や手法は大きく変わります。
テストでは「欠陥がないこと」は証明できない以上、あらゆるバグの摘出を目指すよりも、「どの程度まで確認するか」「確認の対象外とするリスクは何か」を関係者と共有することが大切です。
全数テストとは、ソフトウェアが取り得るすべてのパターンや条件をテストすることです。しかし、膨大なテストケースを洗い出して網羅的にテストすることは、ごく単純なソフトウェア以外では実質的に不可能といえます。
たとえば、2つの入力欄に100通りの値を入れるだけでも1万通りのパターンが生まれます。さらに、実際のソフトウェアでは、外部の環境やサービスとの組み合わせによってテストパターンは増加します。
人員や時間などのリソースが無限にあれば全数テストも可能ですが、現実にはそんなことはあり得ません。自動化を活用しても、時間の制約から全数テストを実施することは不可能です。
■ 実務での活かし方
実務では、限られたリソースを適切に分配しなければなりません。例として、以下のような取り組みがあります。
・リスク分析:リスクの種類や重要度を考慮して重点的にテストするべき箇所を知る
・同値分割法:出力結果が同じテストケースをグループ化する
・境界値分析:「◯◯以上」や「◯◯未満」など、使用条件の境界となる値に絞ってテストする
これらの方法を活用してテストケースを削減し、品質を保ちつつ、納期にも対応できる体制を整えましょう。
早期テストを実施することで、開発プロセス全体の時間とコストを節約できることが示されています。
後工程になるほど、プログラム同士の関係が複雑になり、欠陥を修正するための時間やコストが増大する傾向があります。初期段階での見落としが、後に大きな手戻りを引き起こし、修正作業が膨らんでいくことになります。
早期に問題を発見して修正することで、後工程での手戻りを減らし、全体的な時間とコストを大幅に節約できます。
■ 実務での活かし方
要件定義書の作成段階からドキュメントのレビューをすぐに行う、ソースコードを書いたらすぐに単体テストを実施するなど、早期にテストへ入ることが重要です。欠陥を早期に発見できれば、その分システム全体への影響を最小限に抑えられます。重要度の高い機能や過去に問題が起きた箇所を先にテストするのも有効です。
しかし、自分自身で作成した要件やコードには、自分がつくったものは正しいはずという「確証バイアス」が働くため、エラーや欠陥に気づかないことがあります。そのため、必要に応じて第三者にもチェックしてもらうことが重要です。
第三者の目を通すことで、見落としていた欠陥を早期に発見し、修正できます。
テストで見つかる欠陥は、システム全体に均等に発生するわけではなく、特定の領域に集中します。20%の要素が結果全体の80%を生み出すという、パレートの法則をイメージすると理解しやすいのではないでしょうか。
この偏りは、要件の複雑さや実装の難易度、開発者の経験不足などによって生じます。とくに、機能間の依存関係が強かったり、仕様変更が多かったりする箇所では、欠陥が発生しやすくなります。
■ 実務での活かし方
第一に、ソースコードの量だけでテスト対象を絞るのは避けるべきです。重点的にチェックしなければならないのは、コード量の少ないところだったという可能性があり、これを見逃すと後の手戻りにつながりかねません。
具体的にどういう箇所を検討するか、判断基準の例を以下に挙げておきます。
・欠陥が多発している
・機能が複雑になっている
・欠陥があった場合の影響が大きい
・開発実績が少ない
テスト開始後でも、欠陥の多い部分を発見したら、追加のチェックや設計の見直しを進めましょう。発生可能性の高い部分にリソースを割くことで、効率よく品質向上を図れます。
同じテストを何度も繰り返すと、新たな欠陥発見の効果が薄れていくという意味です。テストで見つかった欠陥は修正され、同じテストでは検出できない欠陥が残る、あるいは追加されるためです。
この原則は、以前は「殺虫剤のパラドックスにご用心」と名付けられていました。虫に同じ殺虫剤を使い続けると耐性を持った個体が生まれ、その個体が生き残るのと同じ現象がソフトウェアテストでも起こります。
■ 実務での活かし方
同じテストだけでは新たな欠陥を見逃すリスクが高まるため、定期的にテストケースを更新し、異なる観点からのチェックを加えていきましょう。また、複数人によるチェック体制を整えることで、バイアスを防ぎつつ、テストの幅を広げられます。
すべてのソフトウェアに適用できる、万能なテスト方法は存在しません。同じソフトウェアでも、開発段階や運用環境、ユーザーのニーズに応じてテストのアプローチや重点を変える必要があります。
このように、コンテキストに応じて適切なテスト計画を立て、柔軟に対応していくことが求められます。
■ 実務での活かし方
ソフトウェアの目的や利用環境、開発特性、リスクといった要素を細かく把握するところからはじめましょう。その上で、求められる品質を確保するためのテスト計画を立てます。
たとえば、短期間で開発とリリースを繰り返すアジャイル開発では、効率的にテストを行うために自動化が欠かせません。一方で、開発期間が長いウォーターフォール開発では、基本設計や詳細設計の段階で静的テストを徹底することで、後工程での手戻りを防ぐことが重要です。
また、開発スピードを優先する場合、テストスケジュールの管理が重要となり、精度が求められる場合には、規格や法律に基づいた詳細なテスト設計が求められます。
このように、対象となるソフトウェアの特性や開発手法を深く理解した上で、必要な観点を洗い出してテスト計画を立てることが大切です。
ソフトウェア開発において「欠陥ゼロ」を目指すことは理想的に思えますが、必ずしも高品質なシステムにつながるわけではありません。
たとえ欠陥がゼロであっても「操作が複雑で分かりにくい」「不要な機能が多い」など、ユーザーニーズから外れていれば満足度は上がりません。品質は単に欠陥がないことだけでなく、使いやすさや価値の提供も含まれます。
そもそも「テストは欠陥があることは示せるが、欠陥がないことは示せない」という1番目の原則により、欠陥ゼロは証明できません。根本的に実現不可能な状態を追い求めると、リソースを無駄にしてしまいます。
また、ソフトウェアが本当に価値のあるものかという視点が抜け落ちるリスクもあります。
■ 実務での活かし方
欠陥を減らすことに過度にこだわると、本来の目的を見失い、低水準な開発になったり、過剰にテストを行うことでスケジュールに余裕がなくなったりするリスクがあります。とくに、リリース直前にバグが発見された場合は、修正がほかの部分に影響を与え、新たな問題が発生するリスクがあります。
開発では、欠陥をゼロにすることに固執するのではなく、ユーザーが本当に求めている性能や信頼性をどれだけ実現できているかを常に意識することが重要です。
ソフトウェアテストでよくある2つの誤解
ソフトウェアテストは、単にソフトウェアを動作させて仕様通りに動くかを確認するだけではありません。ここでは、ISTQBが挙げるソフトウェアテストでよくある2つの誤解について紹介します。
プログラムを実行して結果を確認することは、ソフトウェアテストの一部分に過ぎません。テストが成り立つためには、実行前後に行ういくつかのプロセスが必要です。たとえば、テストの内容を決めるための計画や分析、テスト環境の準備、テスト実行後の評価や報告などがあります。
冒頭で話したように、テストには「動的テスト」と「静的テスト」の2種類があります。静的テストの強みは、プログラムが完成する前に問題を早期に発見できる点です。しかし、実際に動かしてみないとわからない挙動もあるため、動的テストも非常に重要です。
どちらか一方だけでテストが完結するわけではなく、ソフトウェアテストは品質を確保するためのさまざまな活動を組み合わせて行うものだということを理解しておきましょう。
ソフトウェアテストは、仕様どおりに動作するかを確認するものだと考えられがちですが、それだけでは不十分です。この誤解を持っていると、ユーザーにとって使いにくい、または役に立たない製品になってしまう可能性があります。
たとえば、ボタンが小さすぎて押しづらい、入力フォームの文字が全角か半角か分かりにくい、必要な機能が深い階層に隠れているなど、実際の使用時にストレスを感じることがあります。その結果、ソフトウェアは「正しく動く」けど「使いにくい」と評価されてしまいます。
そのため、テストではプログラムが仕様通りに動作するかを確認するだけでなく、ユーザーが必要な機能にアクセスしやすく、使い勝手がよいかどうかを確認することも重要です。実際の業務では、ユーザー目線での使いやすさを必ず確認しましょう。
これは単なる品質保証にとどまらず、ユーザーに価値を提供するという技術者としての責任でもあります。
ソフトウェアテストの精度を高める3つの実践法
ソフトウェアテストの精度を高めるには、担当者のスキル向上やテストケースの網羅だけでは不十分です。テストプロセスを取り巻く進め方や体制が重要であり、チーム内外での情報共有や客観的な視点を確保することがテストの質を大きく左右します。
では、具体的にどのように進めればよいのでしょうか。ここでは、テスト精度を向上させるための3つの実践法を紹介します。
テスト結果を報告する際には、伝え方によって受け手が心理的に抵抗を感じたり、批判的に受け取ったりすることがあります。「欠陥がありました」と言われても、開発者は喜ばないのが現実です。
無用なトラブルを避け、スムーズに連携を保つためには、次のような方法で報告を行いましょう。
● 全員で品質を高めるという協力的な姿勢を示す
● 欠陥部分の担当者を非難せず、中立な立場でやり取りする
● 客観的事実に基づいたフィードバックを行う
● 否定的な返事が来たら、その理由を理解しようと努める
● お互いの認識を確認し合うようにする
これらのコミュニケーションを実現するためには、報告の際だけでなく、普段からの関係性が重要です。チームメンバーとして、休憩時間の雑談などを通じて、お互いの理解を深める機会を持つことが大切です。
高品質なソフトウェアは、チーム全体の知識と協力によって実現されます。したがって、全員が品質への責任を持ち、問題点を共有し、意見を交換しながら仕事を進めることが重要です。
テスト担当者にできる行動の例としては、開発担当者と共にテスト戦略を立てる、ビジネス側と協力して受け入れ基準を定める、などが挙げられます。とくに問題点を議論する際には、前述のような建設的なコミュニケーションを意識しましょう。
さらに、メンバー同士が密に連携することで、それぞれの役割への理解が深まります。これにより、テスト担当者もほかメンバーの視点を理解し、配慮できるようになります。その結果、欠陥の見逃しを減らし、ビジネスのニーズに合った検証が可能になります。
テストの独立性とは、開発とは異なる担当者やチームがテストを実施し、客観性を高めようとする考え方です。
利点としては、まず開発者視点のバイアスを排除でき、思いもよらないバグの見逃しを防げることがあります。また、開発者がほかのコードを書く間にテストを進められること、第三者目線によってテスト結果の信頼性を高められることも挙げられます。
その反面、テスト担当と開発担当の間で認識のズレや情報共有の遅れが生じがちです。この問題に対処するために、テスト自体には独立性を持たせつつ、前後のプロセスでは開発と緊密な連携を取っていきましょう。
ソフトウェアテストの種類
ソフトウェアテストには、目的や段階に応じたさまざまな種類があります。ここではテストのレベルとタイプに分けて、それぞれの概要や役割を解説します。
テストレベルとは、開発の各段階において実施されるテストのグループを指し、ISTQBではこれを5つに分類しています。それぞれの概要と役割を詳しく見ていきましょう。
■ コンポーネントテスト
コンポーネントテストは、ソフトウェアの個々の機能や画面、あるいは少数のソースコードが組み合わされた小さな部分に対して、開発者が意図した通りに正しく動作するかどうかを確認するテストです。
これはテストの最小単位で、単体テスト、ユニットテスト、モジュールテストとも呼ばれます。たとえば、ログインページには以下のようなさまざまな要素が含まれています。
● ログイン時に必要な入力項目を規定するソースコード
● ログイン画面内の部品の色や配置を指定するスタイルシートのソースコード
● ログイン画面を表示するためのプログラムのソースコード
● ユーザーがログイン中かどうかを判定するソースコード
● ログイン画面で入力されたIDやパスワードをデータベースで確認するソースコード
● ログイン成功後、次の画面に遷移するためのソースコード
テスト実施のタイミングは、それぞれのコードが完成した直後、つまり開発の初期段階です。システム全体を組み立てる前に、部品個々の品質を確認し、後工程での手戻りを抑えることが目的です。
もしシステム全体を組み上げてから欠陥が出ると、プログラムが複雑に絡み合っているため、原因の特定や修正に多くの手間がかかります。そのため、コンポーネントテストでできるだけ早く欠陥を発見することが重要です。
■ コンポーネント統合テスト (結合テスト)
コンポーネント統合テストは、コンポーネントをつなぎ合わせ、それぞれが仕様どおりに連携するか、インターフェースが機能するかをチェックするテストです。コンポーネントテストの後に実施され、異なるシステム間での連携や相互作用をチェックします。
たとえば、ユーザー認証のプロセス場合、以下のように「画面X⇒機能A⇒機能B」といった流れで、表示やデータの入力が仕様通りに動作するかをテストします。
・ログイン画面で入力された情報がサーバーに送信される(画面X)
・IDとパスワードがデータベースと照合され、認証される(機能A)
・データベースから取得したユーザー名が次の画面に反映される(機能B)
コンポーネント統合テストの目的は、システム間のインターフェースに問題がないかを見つけることです。コンポーネントテストで確認した各要素が、システム全体として正しくデータをやり取りできるかを確認します。
コンポーネント統合テストではテスト実行に数分かかり、問題が発生した場合は複数の要素にまたがる分析が必要になります。コンポーネントテストを先に実施することで、結合テストで発生する問題をインターフェースの問題に絞り込めます。
■ システムテスト
システムテストは、システム全体が正常に機能するかを確認するテストで、機能的な動作だけでなく、非機能的な部分も設計書通りかどうかをチェックします。システム全体が本番環境に近い状態で適切に動作するかを確認します。
システムテストは、実際の運用シナリオを想定して行われます。テストによっては、本番と同じハードウェア環境を使用したり、予想される最大負荷やデータ量でシステムを動かしてテストすることがあります。
たとえば、ユーザーがパスワードを忘れるなどの業務上の問題が発生した場合に、どのようにリカバリーできるかをテストしたり、アクセスが集中するシチュエーションを想定して負荷をかけ、システムが耐えられるかをテストします。
■ システム統合テスト(結合テスト)
システム統合テストは、ほかのシステムや外部サービスとの接続に焦点を当てたテストのことです。たとえば、自社製品同士の連携や、外部の決済サービスとの連携などがテスト対象となります。
実施のタイミングは、システムテストの後が一般的です。しかし、ほかのシステムや外部サービスを必要としないソフトウェアの場合は省略されます。また、ハードウェアとの連携確認は、システム統合テストとシステムテスト、どちらの段階でも行われるケースがあります。テスト環境はシステムテストと同じく、実際の利用シーンを再現することが理想です。
■ 受け入れテスト
受け入れテストは、ユーザーの視点から行うテストです。システムが実際のビジネス環境で適切に運用できるかどうかが、主な確認ポイントとなります。
また、受け入れテストには、開発者が作成したテスト環境を発注者に引き継ぐという側面もあります。業務内容に変更があれば、システムにも変更が必要となることが多いですが、必ずしも以前の開発者に再発注するわけではなく、別の開発者や発注者自身のチームで変更作業を行うこともあります。
ここで、コンポーネントテストの環境が整備され、リグレッションテストが容易に行える状態であれば、変更時のリスクを大きく低減できます。コンポーネントテストの技術力が高ければ、その評価も大きくなり、システムの変更がスムーズに行えるようになります。
■ 機能テスト
機能テストとは、実装されたすべての機能が正常に動作するか確認するテストのことです。
【ソフトウェアにおける機能の例】
・フォームに入力できること
・ログインできること
・操作の通りに画面が遷移すること
・ユーザーの位置情報を取得できること
・外部決済サービスを利用できること
単一の機能だけでなく、複数のシステムをまたぐ機能も例に含まれているとおり、機能テストは単体テストから受け入れテストまで、あらゆる段階で実施します。対象は「すべての機能」になるため、フォームひとつとっても、全角半角の区別・英数字の組み合わせ・最大文字数の入力など、実際の使用シーンに即した幅広い観点から検証を行います。
■ 非機能テスト
非機能テストでは、機能面以外の要素が期待される水準を満たしているかを検証します。非機能テストの具体的な項目はISO/IEC25010が定めており、主に以下の8つの品質特性に分類されます。
1.性能効率性
処理速度、応答時間、スループットなど、システムの動作速度に関する確認
2.互換性
ほかのシステムやプラットフォームとの連携・共存が可能かどうか
3.使用性
ユーザーが直感的に操作できるか、視認性や操作性が優れているか
4.信頼性
長時間稼働しても問題が発生しないか、エラー発生時の回復能力などを確認
5.セキュリティ
不正アクセスの防止、データ保護、アクセス制御の有効性などを確認
6.保守性
バグ修正や機能追加が容易か、コードの可読性やモジュール性の高さを確認
7.移植性
別のOSやデバイスに移行しても問題なく動作するかどうか
8.機能適合性
要求された機能が過不足なく備わっているか
たとえば、ログインはできても動作が遅いとストレスを感じてしまいます。また、入力した情報の扱いが不明確だと、安心してソフトウェアを使うことができません。
機能がそろっていても、使いにくいとユーザーは満足しません。高い精度で非機能テストを行うには、どの程度のレベルが求められているのかを理解し、そのニーズに合わせてテスト設計を行うことが重要です。
■ ブラックボックステスト
ブラックボックステストは、ソフトウェアの内部構造を無視して、入力と出力の結果が正しいかどうかだけを確認するテスト手法です。このテストは、ユーザー視点で行うことが多く、単体テストから受け入れテストまで、さまざまな段階で実施されます。
たとえば、オンラインショッピングサイトを例に考えてみましょう。
● 商品をカートに入れたとき、正しく合計金額が表示されるか?
● クレジットカード情報を入力して「購入する」ボタンを押したとき、注文が正しく完了するか?
● 存在しない商品IDをURLに直接入力した場合、適切なエラーメッセージが表示されるか?
内部の機械がどう作られているか、どう動くかは考えません。「ユーザーとして問題なく使えるか?」という視点で確認します。ブラックボックスは「中身が見えない黒い箱」のようなイメージです。
■ ホワイトボックステスト
ホワイトボックステストは、ソフトウェア内部のプログラムがどのように動作するかを理解した上で、設計通りに動いているかを確認するテスト手法です。このテストは、コードの理解が前提となるため、通常は開発者が単体テストの段階で実施します。
たとえば、オンラインショッピングサイトを例に考えてみましょう。
● カートに商品を追加したとき、内部で在庫数を正しく減算しているか?
● 認証に失敗したときは、分岐処理で適切にエラーメッセージを返すようになっているか?
このように、内部構造を直接確認して、意図しない動作やエラーが発生していないかを検証します。ホワイトボックスは「中身が透けて見える箱」のようなイメージで、内部構造をチェックすることで、プログラム内の欠陥や実装ミスを早期に発見し、修正できます。
まとめ
ソフトウェアテストの7原則は、テストを効果的に行うための重要な指針であり、テスト担当者だけでなく開発者も理解しておくべき基本的なガイドラ インです。
欠陥ゼロの完全な証明は不可能であり、全数テストは現実的に不可能ですが、早期テストを実施することでコストと時間を節約できます。また、テストのアプローチはソフト ウェアの目的や開発環境によって異なるため、適切な計画と実行が求められます。
ポールトゥウィン株式会社(PTW)は、JTSQBプラチナパートナー認定を取得した「テストのプロ集団」として、ソフトウェアテストを提供しています。WEBサイトやモバイルアプリ、IoT機器などの検証実績が豊富で、お客様の商習慣やプロダクト特性を考慮し、テスト計画から実⾏までトータルでご提案します。
600機種・5,000台以上のスマートフォンやPC、さまざまな新旧OSなど、多様なテスト端末を完備しています。また、多数のテスターが在籍しており、お客様のご要望に応じて、常駐やラボ型⽀援、テレワークでの検証など、ご要望に合わせた稼働が可能です。
ソフトウェアテストでお悩みの方は、ぜひ一度ご相談ください。