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
5 レガシ-技術:テスト自動化
5.1 自動テスト分類
- 2段目は,テスト結果の評価方法
- 3段目が,自動化の方法
5.1.1 参考になる資料
- 個別論文は沢山あるが
- 実践例として組込み系に近い公開情報
- ここをクリックHow SQLite Is Tested
- 製品 SQLite library 155.8 KSLOC of C code
- test scripts - 92053.1 KSLOC 製品の590倍
- 自動テストのためスクリプトを開発した
5.2 パス網羅型
教科書的には,ホワイトボックステストの自動化技法です. ソースコードを入力として,次に示す3種の方式やアルゴリズムを使って, コード上のパスを網羅するように繰り返し,その入力域を求める.
パスを網羅する入力を求めるのであって,結果が正しいい=仕様に合致しているかを確かめるものではない.
ソフトウェア工学の分野で,古くから(1990年代)研究が行われ,数百KSのコードに対する成果が報告されている. 単体レベルでは,ほぼ100%の網羅が可能である.
5.2.1 検索型
検索ベースのソフトウェアテスト(SBST:Search-Based Softwate Test)の代表的な方式は,メタヒューリスティック検索技術です. テストケース⽣成プロセスを⾃動化し,よりコスト効率の⾼いテストプロセスのためのソリューションとして,産業界ではが言語対応のツールが市販されている.
産業界では,単体テストに限らず広い範囲においてさまざまなテストケース⽣成⽬的で使⽤されている.
具体的には,以下のステップでテストケース生成が行われる.
- 目標設定: テストケースがカバーすべき機能や条件を定義する.
- 初期テストケースの生成: ランダムに生成されたテストケースのセットを作成する.
- 評価関数の設定: 各テストケースがどれだけ効果的にパスを網羅したかを評価するための基準を設定する.
- 選択と交叉: 評価関数に基づいて最も効果的なテストケースを選び,それを基に新しいテストケースを自動生成する.
- 反復: 4のステップを繰り返し,より良いテストケースを見つけるまでループする.
代表的なツールとしては次のものがある.
- EvoMaster: 遺伝的アルゴリズムを使用して,Web APIやエンタープライズアプリケーションのシステムレベルのテストケースを自動生成するオープンソースのツールです.
- AALpy: Pythonで書かれたオートマトン学習ライブラリで,モデルベースのテストケース生成に使用されている.
- Tcases: モデルベースのテストケース生成ツールで,UI,コマンドライン,RESTful API,バックエンドなど,さまざまなシステムのテストに対応している.
- Randoop: フィードバックを使用して検索を導くことで,ユニットテストケースを生成する.
- Evosuite: 遺伝的アルゴリズムを使用して効率的に入力空間を探索し,テストケースを生成する.
5.2.2 動的シンボリック実⾏ (DSE)
動的シンボリック実⾏ (DSE) は,シンボリック実行と制約ソルバーを使ったプログラム パスの解析技法です. 他の方式より高速に動作します.
シンボリック実行とは,分岐命令の入力をあたかも変数としてリストアップし,その変数の連立制約式から動作をシミュレーションします. 制約ソルバーとは,特定の制約条件を満たす解を見つけるためのアルゴリズムやツールです.
DSE(動的シンボリック実行)は,ソフトウェアのテスト生成において非常に効果的な手法で,その動作原理は次のようなものです.
シンボリック実行の基本: DSEは,プログラムを実行する際に,具体的な入力値ではなく,シンボリックな値(変数や記号)を使って実行します.これにより,プログラムのすべての可能な実行パスを探索する.
パス条件の収集: プログラムが実行されると,各分岐(if文など)での条件がパス条件として収集されます.これらの条件は,プログラムの実行中に満たされるべき制約を表す.
新しいテストケースの生成: DSEは,収集したパス条件をもとに,これらの条件を否定したり,変更したりして新しいパス条件を作成する.これにより,異なる実行パスを探索するための新しいテスト入力を生成できる.
制約ソルバーの利用: DSEは,生成したパス条件を解決するために制約ソルバー(例:Z3)を使用し,与えられた条件を満たす具体的な入力値を見つける.
反復的な探索: 新しいテスト入力が得られると,DSEはその入力を使ってプログラムを再実行し,さらに新しいパス条件を収集します.このプロセスは繰り返され,プログラムの異なる部分をカバーするためのテストケースを生成する.
このように,DSEはシンボリックなアプローチを用いて,プログラムの多様な実行パスを効率的に探索し,高いカバレッジを持つテストケースを自動的に生成することができる.
動的シンボリック実行を使ったテストケース生成のツールとして次のものがある.
- TestComplete: ハードウェアやソフトウェアのテストを自動化するためのツールで,動的シンボリック実行をサポートしている.
- Selenium: オープンソースのテスト自動化ツールで,動的シンボリック実行を使用してテストケースを生成できる.
- Katalon Studio: クロスプラットフォームのテスト自動化ツールで,動的シンボリック実行をサポートしている.
- Ranorex Studio: ユーザーインターフェーステストを自動化するためのツールで,動的シンボリック実行を使用してテストケースを生成できる.
5.2.3 ランダム型
ランダム型とは,フィードバック指向ランダムテスト生成のアルゴリズムを利用したテストを自動的に生成する手法です. このアルゴリズムは,対象システムのメソッドを利用して,ランダムなメソッドシーケンスを作成する.その基本的な流れを以下に示す.
メソッドの選択: テスト対象のシステム(SUT)に含まれるクラスから,公開されているメソッドのリストを取得する.
ランダムなシーケンス生成: 取得したメソッドの中からランダムにメソッドを選び,これを組み合わせてメソッドシーケンスを生成する.このシーケンスは,実際のテストケースとして機能する.
フィードバックの利用: テストを実行した結果に基づいて,どのメソッドが効果的だったかを評価し,フィードバックを利用して,次回のテスト生成時により効果的なメソッドを選ぶようにする.
テストの多様性の確保: フィードバックを過剰に利用すると,生成されるテストが偏ってしまい,多様性が失われることがある.そのため,フィードバックの量を適切に調整し,テストの多様性を保つようにしている.
フィードバック指向ランダムテスト生成は,ソフトウェアテストの分野で広く利用されており,さまざまな実際の事例がある.
バグ検出: フィードバック指向ランダムテスト生成は,ソフトウェアのバグを見つけるために効果的です.特に,複雑なシステムや大規模なアプリケーションにおいて,ランダムに生成されたテストケースが予期しない動作を引き起こすことがあり,これにより隠れたバグを発見することができる.
回帰テスト: ソフトウェアの更新や修正後に,既存の機能が正常に動作するかを確認するための回帰テストにも利用されます.フィードバック指向ランダムテスト生成を用いることで,過去のテストケースを基に新たなテストケースを生成し,変更が他の部分に影響を与えていないかを確認できる.
動的シンボリック実行の補助: フィードバック指向ランダムテスト生成は,動的シンボリック実行(コンコリック実行)と組み合わせて使用されることがあります.動的シンボリック実行は,プログラムの全てのパスを探索するために時間がかかるため,フィードバック指向ランダムテスト生成で生成したテストケースをシードとして使用し,効率的にテストを行うことができる.
仕様のマイニング: フィードバック指向ランダムテスト生成を通じて,ソフトウェアの動的な振る舞いを観察することで,仕様を抽出する研究も行われている.これにより,ソフトウェアの期待される動作を明らかにし,テストの質を向上させることが期待できる.
業界での実践: 多くの企業がフィードバック指向ランダムテスト生成を実際の開発プロセスに取り入れています.特に,テストの自動化が進む中で,効率的にテストケースを生成し,ソフトウェアの品質を向上させる手段として注目されている.
5.2.4
5.2.5
5.3 オラクル型
5.4 回帰型
5.5 アサーション型
GoogleのOSS-FuzzがLLM(大規模言語モデル)を使用するようになったのは2023年8月16日です。この日から、GoogleはOSS-FuzzプラットフォームでLLMを活用して、より多くのバグを見つけることができるようになりました1
この論文は「Fixing Security Vulnerabilities with AI in OSS-Fuzz」というタイトルで、2024年11月21日に公開されました
https://arxiv.org/html/2411.03346v2?form=MG0AV3
https://atmarkit.itmedia.co.jp/ait/articles/2308/22/news096.html?form=MG0AV3
Code PathFinder のようなツールでC言語に対応するオープンソースソフトウェア (OSS) にはいくつかの選択肢があります。以下はその一部です:
CodeLite: CodeLiteは、C、C++、Rust、Python、PHP、JavaScriptなどのプログラミング言語に対応する無料のクロスプラットフォームIDEです。C言語の開発に特化しており、Windows、macOS、Linuxなどの主要なプラットフォームで動作します。
Code::Blocks: Code::Blocksは、C、C++、Fortran、D言語などのプログラミング言語に対応する無料のIDEです。シンプルで使いやすく、多くのプラグインが利用可能です。
GNAT Programming Studio: GNAT Programming Studioは、Adaプログラミング言語に特化したIDEですが、C言語の開発にも対応しています。AdaのコンパイラであるGNATを使用して開発を行います。
Eclipse CDT: Eclipse CDTは、EclipseのC/C++開発ツールで、C言語の開発に非常に強力なツールです。豊富なプラグインと拡張機能があり、大規模なプロジェクトにも対応します。
Qt Creator: Qt Creatorは、Qtフレームワークを使用してC++のアプリケーションを開発するためのIDEです。C言語の開発にも対応しており、クロスプラットフォーム対応が可能です。
これらのツールは、それぞれ異なる特徴と機能を持っており、開発者のニーズに応じて選択することができます。どのツールが最適かは、具体的なプロジェクトや好みによりますので、試してみてください。
他に知りたいことがあれば教えてくださいね!
はい、C言語のコードの制御パスを解析するためのオープンソースソフトウェアツールがいくつかあります。例えば、以下のツールがあります:
- Clang Static Analyzer: LLVMの一部で、C/C++コードの静的解析を行います。制御パスの解析も含まれています。
- Cppcheck: C/C++の静的コード解析ツールで、コードの品質を向上させるための様々なチェックを行います。
- Coverity: オープンソースのバージョンも提供されており、コードの品質とセキュリティの問題を検出します。
これらのツールを使うことで、C言語のコードの制御パスを効率的に解析できます。どのツールが一番適しているかは、具体的なニーズや環境によりますので、試してみてください。何か他にお手伝いできることがあれば教えてくださいね。