ソフトウェア工学 動的検証
システムテスト(System Testing)とは
システム全体のテストをする。システム全体での動作を検査,主に例外・異常処理,非機能要求,品質,などを対象とする。(⇔単体テスト、結合テスト)
機能のテストでカバーしきれないところをテストする。
構成テスト(configuration testing)– 異なる構成上での動作に関して
ソフトウェアが保証する動作環境は数多くあるので、効率よくテストするのがポイント。
ー同値クラス分割の利用 いくつかの構成をグループ化して、グループ内は同じだとみなす。
ーペア構成テストの利用
その構成がユーザによく使われるか?その構成とこれまでにテストした構成との差は大きいかなどの情報から、テスト設計者がテストを設計する。
※機能テストが十分終わっていることが条件
負荷テスト(stress testing)– 負荷をかけた時の挙動に関して
短時間に大量のデータの入力,処理の実行, データの出力を行わせ、プログラムのあらゆる部分に負荷をかける。
→長期間にわたる高負荷での稼働をし、メモリリークなどに起因する障害の検出を行う。
※テストは完全に自動化すべきであり通常、自動化ソフトが用いられる。
• 人間が長期間同じように負荷をかけ続けるのは不可能
• 属人性・再現性が得られる
l性能テスト(performance testing)– 性能充足に関して
ソフトウェアの分析・設計段階で想定した性能が期待通り出ているかどうかのチェック。
想定する性能の定義が明確でなくてはいけないので、 定量的な基準による定義が必要。性能要求が満たされないことで大幅な手戻りが発生する場合もあるので、設計の段階からテストをするべき。
■アーキテクチャ検証
– 十分な性能を発揮できる構造になっているか
机上(静的)検査・プロトタイプでのテスト
■性能ベンチマーク
– 開発されたソフトウェアの性能テスト
■性能回帰テスト
– 変更されたソフトウェアの性能テスト
■性能チューニングと受け入れテスト
– 要求される性能を満たすかのテスト
■24×7性能モニタ
– 実データに似たデータでの模擬運用テスト
利用性テスト(usability testing)– 使いやすさに関して
UIの使い勝手・仕様をテストする。ユーザの側に立ち,ユーザの要求を満たしているかどうかをチェックするので、開発に関わる人間がするべきではない。
セキュリティテスト
機密性・完全性・可用性が保たれること
– 機密性(confidentiality)
• 許可された者だけが特定の情報にアクセスできる
– 完全性(integrity)
• 情報とその処理方法が正確で,完全であること
– 可用性(availability)
• 許可された利用者が,必要とする時に必要とする情報にアクセスできること
悪意のある攻撃なので、通常のテストでは対応できない。
テストの考え方としてはプログラムレベルとシステムレベルの2つに大別できる。
①プログラムレベルで脆弱性を検出
– コードレビュー
• テストでは見つからない脆弱性は多い
–静的解析ツールの利用による支援
– 入力テスト
• 境界値分析などによりテストケースを設計し,徹底的に入力テストを行う
– モジュール指向テスト
• プログラムを部品に分解し,部品ごとに徹底的な入力テストを行う
②システムレベルで攻撃への耐性をテスト
– 実際の攻撃の種類に合わせたテストパターン
• 不正プログラム
– ウィルス,ワームなど
• 情報漏洩,なりすまし,ソーシャルエンジニアリ
ング
• クロスサイトスクリプティング
• クエリインジェクション
• スパイウェア
典型的な攻撃パターン
オーバーフロー
メモリからプログラムを実行することが可能なアーキテクチャの計算機で潜在的に可能。バッファあふれを故意に発生させ、スタック領域中のリターンアドレスを書き換え、任意のプログラムを実行可能にする。
→領域長のチェックを行わないコードが原因。 配列・文字列の長さ、データ長(long/short,float/double)、ライブラリ関数(gets(), sprintf()など)。
フォーマット文字列バグ
フォーマット文字列の直接出力によるスタック情報などの漏洩。
動的にページを構成するWebサイトの入力チェックの甘さを突く攻撃する。 ユーザからの(テキスト)入力をそのままブラウザに表示するWebサイト
例(PHPスクリプト):
print("入力内容を確認してください.<br />");
print("名前:" . $_POST['name'] . "<br />");
※名前の入力内容にHTMLタグ(ブラウザで解釈される
スクリプト)が含まれていたら?
クエリインジェクション
サーバデータベースと連携する(Web)システムの入力チェックの甘さを突く攻撃
その他のテスト
スモークテスト(smoke test)
ビルドが正常にできているかどうかのテスト。本格的なテストができるのかどうかのテスト。ビルド時のミスによりソフトウェアが動かなくなっていないことを確かめる(ビルド確認テスト)。ハードウェアのテストのときに、電源を入れてテストをするときに煙が出てないか確認するところから来た名前。
回帰テスト(regression testing)
ソフトウェアの修正に伴って行うべきテスト。バグ修正により,関連する他の箇所でバグが発生しないかを確かめる。原則的には、今まで行ったテストをすべてやり直すことになるが、省力化するためには影響範囲を限定することが必要。影響範囲を限定することは難しい問題。