一般的なシステム開発では、ウォーターフォール型の開発手法を採用している企業や現場が数多くあります。この開発手法の流れは端的に言うと、「設計→プログラミング→テスト」の流れとなっています。開発の流れは理解しているけど、以下のことに疑問を持ったことはないでしょうか?
- 「フェーズごとにテストを行っているけど、違いはなに?」
- 「テストは正直面倒くさい。一回でいい気がする。」
そこで今回は各テストフェーズにおける違いについてご紹介いたします。
前半はフェーズごとにテストを行う理由や各フェーズでどのようなテストをするのか解説いたします。後半はフェーズごとに解説いたします。
プログラムは人の手で作られるため、必ずバグが含まれます。
テスト工程は誤って混入したバグを取り除くために、必要不可欠です。
各フェーズにおけるテストの紹介(前半)
なぜフェーズごとにテストをするのか
各フェーズにおけるテストの違いを解説する前に、まずこの章ではフェーズごとにテストを実施する理由を改めて説明いたします。
結論から言えば、フェーズごとにテストを行うのは目的が異なるからです。
例えば、開発直後に行う単体テストと終盤に行うシステムテストでは目的が異なります。
前者は各プログラムのフロー分岐や命令処理の確認など、内部の細かいバグを確認しています。後者は本番の運用と同様にシステムを利用してみて、運用に支障がないかを確認しています。
見つけたいバグの違いが、フェーズごとにテストを行う理由となっているとも言えます。
単体テストとは何か?
前章ではフェーズごとにテストを行う理由をご紹介しました。
ここからは具体的に各フェーズにおけるテストの目的やテスト内容を解説いたします。
まずは単体テストから説明いたします。
単体テストとは文字どおり、モジュールやプログラム単体を確認するテストになります。
プログラム内部に注目しているため、ホワイトボックステストに分類されます。
単体テストでは主に制御フローテストとデータフローテストが実施されます。
テストの目的は詳細設計書やプログラム設計書どおりに、モジュールやプログラムが動作するかを確認することです。コーディングミスによる分岐誤りや間違った命令がないかを
確認します。
テスト実施者は基本的にコーディングしたプログラマー自身が実施します。
① 制御フローテスト:
制御フローテストとは、コーディングしたプログラムの分岐処理や命令を確認するテストです。プログラム内は数多くの分岐があり、条件によって様々なルートを通ります。また分岐後に行う命令処理も当然異なります。
「条件」「分岐」「分岐後の命令」を確認するのが、制御フローテストになります。
プログラムの複雑さによっては、制御フローテストは大変労力のかかるテストになります。
そのため、制御フローテストには粒度が存在しています。
「ステートメントカバレッジ」「デシジョンカバレッジ」「複合条件カバレッジ」です。
粒度が一番荒いのが「ステートメントカバレッジ」、一番細かく行うのが「複合条件カバレッジ」となります。
② データフローテスト:
データフローテストとは、主にプログラムの内で定義した変数が適切に使用されているかを確認するテストです。
プログラム内では数多くの変数や固定値が宣言・使用されています。データフローテストでは宣言した変数や固定値が使用されているかを確認しています。
近年ではプログラミング用のツールにデータフロー処理が実装されており、ツール側が発見してくれるケースがほとんどです。
結合テストとは何か?
次に結合テストにおける目的や内容について解説いたします。
結合テストとは、モジュールやプログラム単体を組み合わせて確認するテストになります。
詳細設計書単位のモジュールを組み合わせて実施します。モジュール同士を組み合わせた場合に、データの送受信にエラーがないかを確認しています。
例えばモジュールAとBがあり、モジュールA→Bの順に動作するシステムと仮定します。
モジュールAからBに向けて送信されるデータが、モジュールBに合わない場合はシステムが止まってしまいます。
郵便ポストには宅配便が入らないように、想定していないデータは受け取ることができないのです。
こうした各モジュール間の関係性を確認するのが、結合テストになります。
テスト目的は各モジュールやプログラムを組み合わせて、データの送受信に不備がないかを確認することです。単体テストがいくら完璧でも、想定していないデータがインプットされてはシステムが動かなくなります。
テスト実施者はコーディングしたプログラマー、もしくは開発チームの第三者が行います。
前半のまとめ
いかがでしたでしょうか?
前半を改めて振り返っていきましょう。
最初はフェーズごとにテストが異なる理由をご紹介しました。
目的の違いが、フェーズごとのテストの違いを生み出しています。
次に単体テストとはどのようなテストか、またテストの目的をご紹介しました。
単体テストは設計書に沿って作成されているかを確認する、プログラミング内部に注目したテストとなります。
最後は結合テストがどのようなテストか、またテストの目的は何かをご紹介しました。
結合テストではモジュール同士を組み合わせた場合に、データの送受信にエラーがないかを確認しています。
冒頭でもご紹介したとおり、テスト工程は誤って混入したバグを取り除くために必要不可欠です。各フェーズにおけるテストの違いを理解し、適切にテストを実施しましょう。
各フェーズにおけるテストの紹介記事(後半)
前半はなぜフェーズごとにテストをするのか、単体テスト・結合テストとは何かをご紹介しました。後半は以下のような疑問を持った方を対象としています。
- 「単体テスト・結合テストをやれば、十分なのでは?」
- 「ウォーターフォールの流れはよく分かった。アジャイル開発ではどうなの?」
そこで今回は残りのテストフェーズのご紹介とアジャイル開発にテストについてご紹介いたします。フェーズごとになぜテストを行うのか、そこに疑問を持っている方は第1回を参照していただければと思います。
システムテスト
まずはシステムテストとは何かを解説いたします。
システムテストとは、個々のプログラムやモジュールをすべて結合して行うテストになります。システムテストのフェーズは、要件定義で決めた内容をシステムとして、実現できているかを確認しています。その確認方法は数多くありますので、ここではかいつまんでご紹介します。一般的にシステムテストの実施者は、各画面を開発したプログラマー以外の第三者が行います。
-
確認テスト
一度テストしている部分を改めて確認するテストです。システムテストのフェーズでバグが発生した場合、もちろん修正⇒確認は行います。しかし、その修正による”影響”は確認対象から漏れることが多々あります。モジュール単体としては正常に動作するようになったが、次のモジュールに悪影響が出たというパターンも数多くあります。このようなパターンがあるので、一度パスした部分であっても再度確認する必要があります。修正箇所を中心に周辺でバグが発生していないかを確認する、これが確認テストです。
-
負荷テスト
製品やシステムに負荷をかけて動作を確認するテストです。例えばWebページの開発では要件定義の段階で、1日にどれくらいアクセス数まで耐えうるかを決めます。システムテストのフェーズでは、実際に定めたアクセス数に耐えうるかをテストします。
また定めたアクセスを超えた場合、どのような挙動になるかも合わせて確認します。定めたアクセス数を超えた場合、システムが止まるのは大きな問題です。そのため、要件定義で決めたデータ以上を投入して、挙動を確認するのも負荷テストの大きな役割です。一般的には要件定義で決めたデータ数・定めたデータ数の1.5倍の2パターンをかけます。
-
セキュリティテスト
文字どおり、セキュリティの面を確認するテストです。近年はネット環境の発達により、様々な方がシステムにアクセスできるようになりました。その中には悪意を持って、接続してくるユーザもいます。そのようなユーザからの攻撃に耐えうるか、システムに脆弱性がないかを確認するテストになります。セキュリティテストはテストにパスしたからといって100%安全とは限りません。そのため判定が難しいテストではありますが、ユーザのアクセスが多いWeb系の開発では必須のテストとなります。
受入テスト・運用テスト
次に受入テスト・運用テストとは何かを解説いたします。どちらのテストにも共通しているのが、クライアントがテストを行う点です。
受入テストは、クライアントの要求した内容が製品・システムに反映されているかを確認するテストです。クライアントに確認してもらうことで、より希望に沿ったシステムに近づくことを狙いとしています。
運用テストは実際の操作環境下で、製品・システムが動作するのかを確認するテストとなります。開発側もユーザの操作環境を想定して、開発・テストを行いますが想定には限界があります。そのため、運用テストで初めて試す操作環境も出てきます。クライアントの環境で動作確認をすることにより、システムに問題がないことを確認してもらいます。
アジャイル開発の場合
最後にアジャイル開発におけるテストフェーズを解説いたします。
アジャイル開発はその性質上、明確なテストフェーズを持ちません。ウォーターフォールのように単体テスト⇒結合テスト⇒システムテストという流れでテストを行わず、開発・修正内容に合わせてテストを選択します。ウォーターフォールのように大がかりにはなってしまっては小さく進めていく、アジャイル開発の利点がなくなってしまうからです。
アジャイル開発で特徴的なのが、テストの自動化です。小さな開発を連続で進めていくアジャイル開発では、単体テストを都度実施していては時間がなくなってしまいます。そのため開発段階で、テストコードを記載し単体テストの自動化を図っています。このスピード感がアジャイル開発の”肝”とも言えます。
まとめ
いかがでしたでしょうか?後半は、テストフェーズにおけるテストの違いをご紹介しました。改めて振り返っていきましょう。
まず最初にシステムテストとは何か、またテストの目的をご紹介しました。システムテストはクライアントの要求がシステムに反映されているかを確認するフェーズです。
次に受入テスト・運用テストとは何か、またテストの目的をご紹介しました。受入テスト・運用テストはともにクライアントが行うテストになります。どちらもクライアントに納得した製品・システムであることを確認してもらうことを目的にしています。
最後にアジャイル開発のテストフェーズについて解説しました。アジャイル開発はその性質上、明確なテストフェーズを持たずに都度テスト内容を変化させています。
今回は、テストフェーズについて解説してきました。各テストフェーズで観点の異なるテストをすることにより、堅牢なシステムが出来上がっていきます。より優れたシステムのために、各フェーズにおけるテスト適切なテスト実施をお願いします。
またシステム開発については下記の記事も参考にしてみてください。
Sqripts TOPページ