4 テスト自動化

このスライドの目的

  • 職場の課題:テスト技法の役割り?
  • 技術(研究)と現場のギャップ
  • 現場側は:テスト自動化
  • マネジメント側:
    • 資源効率化

4.1 技術と現場のギャップ

4.2 自動テスト分類

graph TD
 a[テスト技法<br>自動テスト] 

 c[パス網羅型]
 c1[検索型]
 c2[シンボリック<br>実行型]
 c3[ランダム型]
 d[オラクル型]
 d1[実行の自動化]
 e[アサーション型]
 e1[ファジング]
 e2[パス解析]
 f[回帰型]

 a --> c --> c1
 c --> c2
 c --> c3
 a --> d
 d --> d1
 a --> f
 f --> d1
 a --> e
 e --> e1
 e --> e2


  • 2段目は,テスト結果の評価方法
  • 3段目が,自動化の方法

参考になる資料

  • 個別論文は沢山あるが
  • 実践例として組込み系に近い公開情報
  • ここをクリックHow SQLite Is Tested
  • 製品 SQLite library 155.8 KSLOC of C code
  • test scripts - 92053.1 KSLOC 製品の590倍
    • 自動テストのためスクリプトを開発した

自動テストの導入は
 自動ではない!

テスト実行が自動

ボトムアップ導入は,導入余力と知恵が無いと助からない マネジメントとの連携が必要

4.3 パス網羅型

  • ソースコードを入力として,
  • 次に示す3種の方法で
  • コード上のパスを通過する
  • 入力域を探る
  • 昔のホワイトボックステストの自動化

検索型

  • メタヒューリスティック検索技術は、テストケース⽣成プロセスを⾃動化し、よりコスト効率の⾼いテストプロセスのためのソリューションを提供するために広く使⽤されてきました。このテス ト⾃動化のアプローチは、「検索ベースのソフトウェアテスト」(SBST) と呼ばれることが多く、テストの⽬的、テストレベル、その他の特性が異なるさまざまなテストケース⽣成⽬的で使⽤されてきまし た。SBST 技術は本質的にヒューリスティックであるため、テスト⽬的を達成するためにどの程度のコストと効果がある

検索ベースのテストケース生成(Search-Based Test Case Generation)は、コンピュータプログラムのテストケースを生成するための自動化された方法です。この方法は、遺伝的アルゴリズムや最適化技術を使用して、テストケースを効率的に見つけ出すことを目指しています。

具体的には、以下のステップで行われます: 1. 目標設定: テストケースがカバーすべき機能や条件を定義します。 2. 初期テストケースの生成: ランダムに生成されたテストケースのセットを作成します。 3. 評価関数の設定: 各テストケースがどれだけ効果的かを評価するための基準を設定します。 4. 選択と交叉: 評価関数に基づいて最も効果的なテストケースを選び、それを基に新しいテストケースを生成します。 5. 反復: 4のステップを繰り返し、より良いテストケースを見つけ出します。

この方法は、特に大規模なソフトウェアシステムのテストにおいて、効率的に多くのテストケースを生成するのに役立ちます。

何か他に知りたいことがあれば教えてくださいね!

はい、いくつかの具体的なツールがあります。以下は、検索ベースのテストケース生成に使用される代表的なツールです:

  1. EvoMaster: 遺伝的アルゴリズムを使用して、Web APIやエンタープライズアプリケーションのシステムレベルのテストケースを自動生成するオープンソースのツールです。
  2. AALpy: Pythonで書かれたオートマトン学習ライブラリで、モデルベースのテストケース生成に使用されます。
  3. Tcases: モデルベースのテストケース生成ツールで、UI、コマンドライン、RESTful API、バックエンドなど、さまざまなシステムのテストに対応しています。
  4. Randoop: フィードバックを使用して検索を導くことで、ユニットテストケースを生成するツールです。
  5. Evosuite: 遺伝的アルゴリズムを使用して効率的に入力空間を探索し、テストケースを生成するツールです。

これらのツールは、効率的に多くのテストケースを生成し、ソフトウェアの品質を向上させるのに役立ちます。どのツールがあなたのニーズに最適かを評価してみてください。

他に知りたいことがあれば教えてくださいね!

動的シンボリック実⾏ (DSE)

動的シンボリック実⾏ (DSE) は、プログラム パスを体系的に探索して、 カバー率の⾼いテストを⽣成する最先端のテスト⽣成アプローチです。

この問題に対処するために、強 ⼒な制約解決ツール[7]、[14]、[19]の出現により最近⼈気が⾼まった動的シン ボリック実⾏(DSE)[18]、[34]、[41]を使⽤して、プログラムパスを体系的に探索 することで、カバー率の⾼いテストを⾃動的に⽣成できます。

DSEは、これらの制約の⼀部を体系的に否定して新しいパス条件を形成し、制 約ソルバーを活⽤してこれらのパス条件を解決し、新しいテスト⼊⼒を取得し ます。これらの新しいテスト⼊⼒は、将来の探索をプログラムのさまざまなパ スに導き、新しい制約を反復的に収集し、ステートメントなどの新しい構造カ バレッジを実現します。

DSE(動的シンボリック実行)は、ソフトウェアのテスト生成において非常に効果的な手法です。その動作原理を分かりやすく説明します。

  1. シンボリック実行の基本: DSEは、プログラムを実行する際に、具体的な入力値ではなく、シンボリックな値(変数や記号)を使って実行します。これにより、プログラムのすべての可能な実行パスを探索することができます。

  2. パス条件の収集: プログラムが実行されると、各分岐(if文など)での条件がパス条件として収集されます。これらの条件は、プログラムの実行中に満たされるべき制約を表します。

  3. 新しいテストケースの生成: DSEは、収集したパス条件をもとに、これらの条件を否定したり、変更したりして新しいパス条件を作成します。これにより、異なる実行パスを探索するための新しいテスト入力を生成します。

  4. 制約ソルバーの利用: DSEは、生成したパス条件を解決するために制約ソルバー(例:Z3)を使用します。制約ソルバーは、与えられた条件を満たす具体的な入力値を見つける役割を果たします。

  5. 反復的な探索: 新しいテスト入力が得られると、DSEはその入力を使ってプログラムを再実行し、さらに新しいパス条件を収集します。このプロセスは繰り返され、プログラムの異なる部分をカバーするためのテストケースが生成されます。

このように、DSEはシンボリックなアプローチを用いて、プログラムの多様な実行パスを効率的に探索し、高いカバレッジを持つテストケースを自動的に生成することができます。

ランダム型

フィードバック指向ランダムテスト[17]は、ソフトウェアテストを⾃動⽣成す る有望な技術である。この技術は、公開された

フィードバック指向ランダムテスト生成のアルゴリズムは、ソフトウェアのテストを自動的に生成するための手法です。このアルゴリズムは、システムのクラスから公開されているメソッドを利用して、ランダムなメソッドシーケンスを作成します。以下にその基本的な流れを分かりやすく説明します。

  1. メソッドの選択: テスト対象のシステム(SUT)に含まれるクラスから、公開されているメソッドのリストを取得します。

  2. ランダムなシーケンス生成: 取得したメソッドの中からランダムにメソッドを選び、これを組み合わせてメソッドシーケンスを生成します。このシーケンスは、実際のテストケースとして機能します。

  3. フィードバックの利用: テストを実行した結果に基づいて、どのメソッドが効果的だったかを評価します。このフィードバックを利用して、次回のテスト生成時により効果的なメソッドを選ぶようにします。

  4. テストの多様性の確保: フィードバックを過剰に利用すると、生成されるテストが偏ってしまい、多様性が失われることがあります。そのため、フィードバックの量を適切に調整し、テストの多様性を保つことが重要です。

このアルゴリズムは、ソフトウェアのバグを見つけるためのテストケースを効率的に生成するために広く利用されていますが、フィードバックの使い方には注意が必要です。過剰なフィードバックは、テストの効果を制限する可能性があるため、バランスを取ることが求められます。

利用例

フィードバック指向ランダムテスト生成は、ソフトウェアテストの分野で広く利用されており、さまざまな実際の事例があります。以下にいくつかの利用事例を紹介します。

  1. バグ検出: フィードバック指向ランダムテスト生成は、ソフトウェアのバグを見つけるために効果的です。特に、複雑なシステムや大規模なアプリケーションにおいて、ランダムに生成されたテストケースが予期しない動作を引き起こすことがあり、これにより隠れたバグを発見することができます。

  2. 回帰テスト: ソフトウェアの更新や修正後に、既存の機能が正常に動作するかを確認するための回帰テストにも利用されます。フィードバック指向ランダムテスト生成を用いることで、過去のテストケースを基に新たなテストケースを生成し、変更が他の部分に影響を与えていないかを確認できます。

  3. 動的シンボリック実行の補助: フィードバック指向ランダムテスト生成は、動的シンボリック実行(コンコリック実行)と組み合わせて使用されることがあります。動的シンボリック実行は、プログラムの全てのパスを探索するために時間がかかるため、フィードバック指向ランダムテスト生成で生成したテストケースをシードとして使用し、効率的にテストを行うことができます。

  4. 仕様のマイニング: フィードバック指向ランダムテスト生成を通じて、ソフトウェアの動的な振る舞いを観察することで、仕様を抽出する研究も行われています。これにより、ソフトウェアの期待される動作を明らかにし、テストの質を向上させることができます。

  5. 業界での実践: 多くの企業がフィードバック指向ランダムテスト生成を実際の開発プロセスに取り入れています。特に、テストの自動化が進む中で、効率的にテストケースを生成し、ソフトウェアの品質を向上させる手段として重宝されています。

これらの事例からもわかるように、フィードバック指向ランダムテスト生成は、ソフトウェアの品質向上に寄与する重要な手法として広く活用されています。

4.4 オラクル型

4.5 回帰型

4.6 アサーション型

4.7 引用論文

[1] T. Potuzak and R. Lipka, “Current Trends in Automated Test Case Generation,” in 2023 18th Conference on Computer Science and Intelligence Systems (FedCSIS), Sep. 2023, pp. 627–636. doi: 10.15439/2023F9829.

テストはソフトウェア開発の不可欠な部分です。同時に、個々のテストケースを手動で作成することは、時間がかかり、エラーが発生しやすいプロセスです。そのため、自動テスト生成方法に関する徹底的な研究が 20 年以上にわたって行われています。自動テストケース生成と見なすことができるアプローチは、非常に多様です。ただし、共通の機能は、テストケースのデータの生成です。最終的には、テストデータによってプログラムの分岐が決定され、ユニットテストからアプリケーション全体の動作に焦点を当てたテストまで、あらゆるテストレベルで使用できます。また、テストデータは、プログラミング言語やパラダイムなどの特定のテクノロジにほとんど依存しません。この論文は、テストデータ生成またはそれに基づくテストを扱う過去 20 年間の既存の文献の調査です。この調査は体系的な文献レビューではなく、事前に定式化された特定の科学的質問に回答しようとするものではありません。その目的は、既存の方法をマッピングして分類し、それらの共通機能を要約することです。このような調査は、関連作業の調査の出発点となるため、テスト データ生成の方法を開発しているチームにとって役立ちます。テストはソフトウェア開発の不可欠な部分です。同時に、個々のテストケースを手動で作成することは、時間がかかり、エラーが発生しやすいプロセスです。そのため、自動テスト生成方法に関する徹底的な研究が 20 年以上にわたって行われています。自動テストケース生成と見なすことができるアプローチは、非常に多様です。ただし、共通の機能は、テストケースのデータの生成です。最終的には、テストデータによってプログラムの分岐が決定され、ユニットテストからアプリケーション全体の動作に焦点を当てたテストまで、あらゆるテストレベルで使用できます。また、テストデータは、プログラミング言語やパラダイムなどの特定のテクノロジにほとんど依存しません。この論文は、テストデータ生成またはそれに基づくテストを扱う過去 20 年間の既存の文献の調査です。この調査は体系的な文献レビューではなく、事前に定式化された特定の科学的質問に回答しようとするものではありません。その目的は、既存の方法をマッピングして分類し、それらの共通機能を要約することです。このような調査は、関連作業の調査の出発点となるため、テスト データ生成の方法を開発しているチームにとって役立ちます。