今回からソフトウェアテストに関するテクニックについて連載していきます。ただ、一口にソフトウェアテストといっても、非常に幅広いものです。そこで、ソフトウェアテストを分類、整理した上で、そのうちの主なテストの種類について取り上げていきたいと思います。
そこで今回は、まずソフトウェアテストの分類について解説していきます。
ソフトウェアテストの分類
皆さんは「○○テスト」というものをいくつか知っていると思います。ここでは、それらを工程・品質の観点・実行方法・技法という4つに分類し、さらにそれぞれに分類されるテストの種類について簡単に見ていきます。
工程
ソフトウェア開発は要件定義、設計、製造、テストといった段階を踏んで進められます。これらの段階を「工程」と呼びます。そしてテストの中でもさらに細かく工程に分割します。
まず、ソフトウェアを構成する最小単位(モジュール)に対して単体テスト[1]をします。続いて、単体テストを行ったモジュールを組み合わせて統合テスト[2]をします。そして最後に、モジュールをすべて統合し、さらにハードウェア・ミドルウェアなどとも結合してシステムテスト[3]をします。
大きく分けるとこの3段階ですが、それぞれのテスト工程をさらに細かいフェーズに分割することがあります。そのフェーズは、上の3段階と同様にテスト対象の範囲によって分割するだけでなく、この後で説明する品質の観点をもとにフェーズを分けることもあります。
また、これらの3段階は開発者が行うテスト工程です。この後で顧客側が受け入れテストを行い、要求通りにソフトウェアが作られているかを確認、承認して、開発が完了します。
品質の観点
テストの主な目的は、バグを見つけることによって品質を確保することです。この「品質」にもさまざまな観点があり、その観点別にさまざまなテストがあります。
最も一般的なテストは、テスト対象がもつ機能を確認する機能テストです。テスト対象に入力を与えたり、動作させたりしたときに、正しい実行結果が出るかどうかを確認します。また、機能テストと同様に重要なテストとして性能テストがあります。ソフトウェアは、ユーザがストレスを感じない程度の時間内で実行されなければなりません。また、性能テストに関連して、テスト対象が実行できる限界のリソースを見極めるための負荷テストも必要になります。
また、近年重要性を増しているテストにユーザビリティテストとセキュリティテストがあります。ユーザビリティテストは、ユーザにとっての「使いやすさ」に着目したテストで、特に高齢者や障がい者などに配慮した「アクセシビリティ」の高い作りになっているかどうかの確認が必要になる場合があります。セキュリティテストでは、ソフトウェアの実行中に機密情報が漏洩しないことや、外部からの悪意を持った攻撃に耐えられることを確認します。
この他にも、信頼性や保守性などさまざまな品質を確認するためのテストがあります。
実行方法
テストの実行方法は、テスト対象を動かしてみて結果を確認するのが一般的ですが、これは厳密にいうと動的テストという手法です。それに対して、テスト対象を動かさずにテストをする静的テストというものがあります。ソフトウェアを構成するソースコードを読む、すなわちレビューするのは静的テストの1つですし、ソースコードの記述パターンをチェックする静的解析という技法があります。
テストケース作成技法
テストを実行するには、どのようなテストで何を確認するかという「テストケース」を作る必要があります。このテストケースを作るための技法には大きく2つの種類があります。
1つ目は、テスト対象を「中の見えない箱(ブラックボックス)」としてとらえたブラックボックステストです。テスト対象に入力を与えて、実行された結果が正しいかどうかを確認します。このときに、テスト対象の中でどのような処理が行われているかは気にしません。テスト対象の「仕様」に基づいたテストケースの作成技法です。
もう1つは、テスト対象を「中の見える箱(ホワイトボックス)」としてとらえたホワイトボックステストです。テスト対象に入力を与えた際に、どのような順序で処理が実行されたり、データの値が変化したりするのかを確認します。テスト対象の「構造」に基づいたテストケースの作成技法です。
また、これらの技法をあわせて、仕様と構造の両方に着目しながらテストケースを作成するグレーボックステストという技法もあります。
効果的なテストを実施するには
このように、テストにはさまざまな種類があり、それぞれのテストの目的を十分に理解した上で、実施しなければなりません。これらのテストを効果的に実施する、すなわち品質を確保するためには、次のような工夫やテクニックが必要になります。
テストの実施範囲を明確にする
それぞれのテストで扱える範囲は厳密に決まっているわけではありませんが、重複してテストをしてしまうのは非効率です。たとえば、単体テストで確認した(細かい)ことを統合テストでまた確認するのは非効率です。また、機能テストをしながら性能を測るといったこともできないことはありませんが、性能の観点は別途テストを実施することで、より厳密な確認ができます。
正しいプロセスで行う
テストを実施する上では、どのような順序で作業をするのか、どのような成果物を作成するのか、その成果物を誰がいつどのような観点でレビューするのか、などといった「プロセス」を決めて、それに従うことが重要です。こうして作業の品質を高めることで、作成する成果物の品質も高くなります。テストではとくに、観点の抜け漏れの防止に大いに役立つでしょう。
ツールを効果的に利用する
テストでは、同じ作業を繰り返し実行することが多いので、それをツールに任せることで効率が上がります。また、たとえばテスト対象に高い負荷をかけるなど、人手で行うには難しいこともツールを使えば実現できる場合があります。このようにツールを適材適所でうまく使うことで、効果が上がります。ただし、ツールは万能、完璧ではありませんので、ツールに頼りすぎると十分なテストができなかったり、逆に時間を要してしまうこともありますので、注意が必要です。
テスト管理をする
テストにおけるテクニックという意味ですと、テストの実行だけでなく、管理的な側面も見逃せません。テストの管理では、作業がきちんと行われているか確認し、作業した結果の分析や評価を行い、そこで得た教訓を次の開発に活かしていきます。
管理というとプロジェクトマネージャや品質管理者などの仕事と思われるかもしれませんが、テストではテスト実施者自身が大いに関わる管理作業があります。それが「バグ管理」です。これは、バグトラッキングなどとも呼ばれ、テストを実施して見つかったバグを報告し、そのステータスを管理する必要があります。
情報を横展開する
先ほどのバグ管理のときに、そのバグはどのような観点のテストケースから見つけられたのか、バグを作りこんだ原因は何かといった情報を記録し、横展開することで、同種のバグをさらに見つけ出すことができます。また、これらの情報を活用することで、バグの再発防止やプロセスの改善につながります。
それぞれのテストでこれらのテクニックを使うことで、全体としても効率のよいテスト、効果的なテストが実現できます。
次回以降では、今回取り上げたテストの種類のいくつかについて、そのテストの実行手順やツールの活用方法などといったテクニックについて紹介していきます。