Jianyuan フォーラム · モデルの表示丨アプリケーション プログラミング インターフェイス (API) に基づく自動テスト (パート 2)

著者 | 華東師範大学ソフトウェア工学部、黄山博士

         Su Ting 教授、華東師範大学ソフトウェア工学部

セクション | 建源フォーラム · モデル観察

コミュニティ| WeChat ID「TICPShanghai」を追加して「Shanghai Kongan 51fusa Security Community」に参加します。

上記「アプリケーション プログラミング インターフェイス (API) に基づく自動テスト (パート 1)」では、システムにアプリケーション プログラミング インターフェイスの概念が導入されています。 (API) とソフトウェア開発におけるその役割と重要性について説明します。開発プロセスと自動 API テストのテスト オブジェクトの共有に焦点を当てています。 この記事では、単体テストやファズ テストなど、現在の主流の自動 API テスト フォームとテクノロジーについて詳しく分析します。

04

自動化された API テストのフォームと手法

API の自動テストでは通常単体テストが使用されますが、これは現在のアジャイル開発の重要な部分でもあります。ファズ テストの台頭により、API ファジングは人気のある API テスト テクノロジになりました。以下では、単体テストとファズテストの 2 つのパートに分けて、自動化された API テストのフォームとテクノロジを紹介します。

4.1 単体テスト

単体テスト (モジュール テストとも呼ばれます) は、プログラム モジュール (ソフトウェア設計の最小単位) の正当性テストを実行するテスト形式 (またはテスト フレームワーク) です。プログラム ユニットは、アプリケーションの最小のテスト コンポーネントです。手続き型プログラミングでは、単体テストは単一の API または複数の API の組み合わせによって完了します。オブジェクト指向プログラミングの場合、単体テストは単一または複数のクラスのメソッドとオブジェクト間の対話によって完了します。単体テストは主に開発者 (Junit、pytest など) によって手動で作成されますが、自動テスト ケース生成テクノロジ (Randoop[6]、GraphFuzz[4] など) によって完了することもできます。

単体テストの一般的なプロセスは次のとおりです: (1) 単体テスト ケースを作成または生成します。これには、テスト環境の初期化、テスト対象の API の呼び出しによる対応する関数の実行、および呼び出し結果の確認が含まれます。(2) 単体テスト ケースの実行、実行結果を収集し、成功したものをカウントします。 テスト ケースと失敗したテスト ケース、失敗したテスト ケースは、API 実装のバグまたは欠陥を示します。関数レベル API であっても RESTful API であっても、単体テストは非常に効果的なテスト形式です。

92029.png

図 1 Junit 単体テストの例

図 1 に示すように、これは Junit 単体テスト フレームワークを使用して作成された Java 単体テスト ケースです。 「@Test」は、関数が単体テスト ケースを実行することを意味します。最初に AdderImpl オブジェクトを初期化し、オブジェクトの add メソッドを呼び出し、2 つのパラメータ 1 と 2 を渡し、最後に add メソッドの戻り結果が次のとおりであるかどうかを判断します。 3.結果が 3 でない場合、単体テストは失敗し、add メソッドの実装にエラーがあることを示します。それ以外の場合は成功します。

4.2 API模糊测试 (Fuzz Test)

ファズ テストは自動テスト テクノロジであり、そのコア コンポーネントであるファザーは、文法規則に基づいてテスト ケースを直接生成したり、既存のテスト ケースに基づいてテスト ケースをコンパイルして生成したりできます。ファジーテストは、開発者が作成したテストよりもプログラム内の境界条件をトリガーする可能性が高く、より多様なテストシナリオを引き起こす可能性が高いさまざまなテストケースを生成できるため、ファズテストはソフトウェアの堅牢性とソフトウェアの脆弱性をテストするのに役立ちます。

API のファズ テスト プロセスは、バイナリ プログラムの一般的なファズ テスト プロセスと同じです。ファザーは、突然変異用のシード ライブラリからシードを選択するか、文法規則に基づいてテスト ケースを直接生成し、テスト ケースを実行し、実行プロセスを監視してチェックします。実行時 処理中にクラッシュが発生したり、実行結果が期待どおりにならなかった場合は、潜在的な API エラーが見つかったと考えられます。

4.2.1 関数レベル API のファズテスト

LLVM プロジェクトの Libfuzzer[11] は、インプロセス カバレッジに基づく進化型ファズ エンジンです。ユーザーが提供したシード (特定のプログラム入力または API 呼び出しパラメーター) を読み取り、シードを変更して新しいテスト ケース入力を生成し、それをユーザーが作成したテスト ドライバーに渡すことにより、API ファズ テストを実装します。

92030.png

図 2 Libfuzzer テスト ドライバーの例

図 2 は、Libfuzzer テスト ドライバーの例です。Libfuzzer によって生成されたテスト入力は、Data パラメーターを通じてテスト ドライバーに渡されます。ユーザーは、適切な処理の後にテスト入力をテスト対象の API に渡し、それによって API をテストします。 Libfuzzer のテスト ドライバーでは、開発者が単体テストの効果を達成するための条件チェックを記述することもできることは注目に値します。

Libfuzzer は当初、テスト入力生成の問題を解決しますが、API のファズテストの難しさは、より深い API 動作をトリガーする方法にあります。関数レベルの API をより効率的にテストするために、研究者はテスト ドライバーを効率的かつ自動生成する方法、つまり効果的な API 呼び出しシーケンス、API 実行環境、プログラム フラグメントを自動的に構築する方法を研究してきました。

FUDGE[2]は、コードスライスを合成してファズテスト候補ドライバーを生成するツールです。 FUDGE の核となる洞察は、効率的かつ有用な方法でライブラリ関数を実行するファズ テスト ドライバーを、コード ベース内の既存のコード スニペットから合成できるということです。 FUDGE の全体的なプロセスを図 3 に示します。ファズ テスト ドライバーの生成が完了すると、FUDGE は生成されたドライバーを評価のために開発者に渡します。

92031.png

図3 FUDGEの全体プロセス

FuzzGen[5] は、システム全体の分析を利用してライブラリのインターフェイスを推測し、そのライブラリ専用のファズ テスト ドライバーを合成します。 FuzzGen は開発者の関与を必要とせず、さまざまなプログラミング ライブラリで使用できます。 FuzzGen の中心となるアイデアは、システム内の既存のコードがプログラミング ライブラリをさまざまな側面で活用するということです。図 4 に示すように、システム内で既にライブラリを使用しているコードから開始し、システム全体を分析し、最初にどの API であるかを決定し、次に制御フローとデータの両方から抽象 API 依存関係グラフ (A2DG) を分類します。流れの側面。このプロセスでは、各パラメーターの可能な値とタイプを決定し、パラメーター間の依存関係を分析する必要があります。最後に、libFuzzer のスタブ コードが依存関係グラフに基づいて生成され、手動介入を必要とせず、幅と深さのバランスをより適切に保つことができるファズ テストを実行できます。

図4 FuzzGenの核となるアイデアの概略図

GraphFuzz[4] は、API 呼び出しシーケンス全体をデータ フロー グラフとして表現し、データ フロー グラフ内で指定された突然変異操作を実行することによって API 呼び出しシーケンスを構築します。図 5 は、GraphFuzz でサポートされる 3 つのデータ フロー グラフの変更操作 (削除、挿入、連結) を示しています。

図 5 GraphFuzz によってサポートされるいくつかの突然変異操作

関数レベル API のファズ テスト方法に関する一般的な研究作業に加えて、システム コールに特化したファズ テスト方法に関する研究作業もあります。これらの研究作業は、API の使用法をより深く調査するために API 呼び出しを構築する方法に焦点を当てています。 。

4.2.2 RESTful API のファズテスト

初期の頃、Chakrabarti [3] らは、ブラックボックスの仕様ベースの RESTful API テスト方法を提案しました。この方法では、XML ベースの拡張可能なテスト仕様言語を使用してテスト ケースを手動で構築する必要があります。ただし、手動でテスト ケースを構築するには、より多くのオーバーヘッドが必要となるため、その後の作業では、OpenAPI または Swagger の仕様から RESTful API のインターフェイス情報を抽出することで、テスト ケースの自動生成を実現しました。

EvoMaster[8] は、進化的アルゴリズムを使用して RESTful API テスト ケースを生成する検索ベースのファズ テスト ツールであり、完全に自動化されたブラック ボックス テスト ツールでもあります。サービスの目標に関するより多くの情報を収集して使用して、テスト ケースの生成をガイドできるため、RESTful サービス内のより深いロジックをテストする場合により効果的です。

RESTler[1] は、幅優先探索に基づいた最初のステートフル RESTful API ファザーです。 RESTlerはクラウドサービスのAPI仕様を解析し、リクエストシーケンスを生成し、クラウドサービスのAPIを自動的に呼び出してテストします。 RESTler は、まず Swagger インターフェイス ドキュメント (図 6 に Swagger インターフェイス ドキュメントの例を示します) を読み取ることで API の戻り結果間の依存関係を推測し、次に正当な API 呼び出しシーケンスを生成します。次に、RESTler は、無効な API 呼び出しシーケンスの生成を回避するために、API 呼び出しシーケンスの実行中にサーバーから返されたステータス コードに基づいて元の API 呼び出しシーケンスを変更します。

図 6 Swagger インターフェイスのドキュメントの例

05

要約する

自動 API テストには長い歴史があり、それ自体も常に進化し、改善されています。関数レベル API の自動テストのための汎用的な手法に関する研究をベースに、現在、Rust ライブラリや深層学習ライブラリ (PyTorch) の自動テスト手法に関する研究など、特殊なプログラミング言語や特殊な API シナリオに関するいくつかの研究が行われています。 、TensorFlow)。 RESTful API の自動テストも、SOAP テストの後に登場した新しいタイプの Web API テストです。ソフトウェアエンジニアリング技術の発展に伴い、APIも常に進化しており、さまざまなAPIの特性に基づいて、対応する自動テストソリューションをどのように構築するかが、自動APIテストの中心的な課題となります。

参考文献:

[1] ヴァゲリス・アトリダキス、パトリス・ゴデフロイド、マリーナ・ポリシュチュク。 2019. RESTler: ステートフル REST API ファジング。 2019 年の IEEE/ACM 第 41 回ソフトウェア エンジニアリング国際会議 (ICSE)、748–758。 DOI:https://doi.org/10.1109/ICSE.2019.00083

[2] ドマゴイ・バビッチ、ステファン・ブクル、ヤオホイ・チェン、フランホ・イヴァンチッチ、ティム・キング、マルクス・草野、カロリーヌ・レミュー、ラースロー・シェケレス、ウェイ・ワン。 2019. FUDGE: 大規模なファズドライバー生成。 2019 年第 27 回 ACM 欧州ソフトウェア エンジニアリング会議およびソフトウェア エンジニアリングの基礎に関するシンポジウム (ESEC/FSE 2019) の会議議事録、Association for Computing Machinery、ニューヨーク、ニューヨーク、米国、975 ~ 985。 DOI:https://doi.org/10.1145/3338906.3340456

[3] スジット・クマール・チャクラバルティとプラシャント・クマール。 2009. Test-the-REST: RESTful Web サービスをテストするアプローチ。 2009 年のコンピューティングの世界: 将来のコンピューティング、サービス コンピューティング、コグニティブ、アダプ​​ティブ、コンテンツ、パターン、302 ~ 308。 DOI:https://doi.org/10.1109/ComputationWorld.2009.116

[4] ハリソン・グリーンとタナシス・アヴゲリーノス。 2022. GraphFuzz: ライフタイム対応データフロー グラフを使用したライブラリ API ファジング。 2022 年の IEEE/ACM 第 44 回ソフトウェア エンジニアリング国際会議 (ICSE)、1070 ~ 1081。 DOI:https://doi.org/10.1145/3510003.3510228

[5] キリアコス・イスポグルー、ダニエル・オースティン、ヴィシュワート・モハン、マティアス・パイヤー。 2020. {FuzzGen}: 自動ファザー生成。 2271 ~ 2287 年。 2023 年 7 月 5 日 https://www.usenix.org/conference/usenixsecurity20/presentation/ispoglou より取得

[6] カルロス・パチェコ、シュヴェンドゥ・K・ラヒリ、マイケル・D・エルンスト、トーマス・ボール。 2007. フィードバック主導のランダム テストの生成。第 29 回ソフトウェア エンジニアリング国際会議 (ICSE'07)、IEEE、ミネソタ州ミネアポリス、米国、75 ~ 84 年。 DOI:https://doi.org/10.1109/ICSE.2007.37

[7] 2023. API。ウィキペディア。 2023 年 8 月 16 日 https://en.wikipedia.org/w/index.php?title=API&oldid=1170248429 から取得

[8] 2023. EvoMaster: システムレベルのテストケースを自動生成するツール。 2023 年 8 月 16 日に https://github.com/EMResearch/EvoMaster から取得

[9] pytest: より良いプログラムの作成に役立ちます — pytest ドキュメント。 2023 年 8 月 16 日 https://docs.pytest.org/en/7.4.x/index.html から取得

[10] JUnit 5。2023 年 8 月 16 日に https://junit.org/junit5/ から取得

[11] libFuzzer – カバレッジガイド付きファズテスト用のライブラリ。 — LLVM 18.0.0git ドキュメント。 2023 年 8 月 16 日 https://www.llvm.org/docs/LibFuzzer.html から取得

おすすめ

転載: blog.csdn.net/TICPSH/article/details/133088976