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

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

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

セクション|  Jianyuan フォーラム · モデルを見る

コミュニティ |  WeChat ID「TICPShanghai」を追加して「上海港安51房セキュリティコミュニティ」に参加してください

01

アプリケーション プログラミング インターフェイス (API)

アプリケーション プログラミング インターフェイス、英語の正式名は Application Programming Interface [7] (略して API) で、ソフトウェア コンポーネントが相互に通信し対話する方法を定義する一連のルールとプロトコルです。ユーザー インターフェイス (略して UI) とは異なり、API の目的は異なるソフトウェアを接続することにより、異なるソフトウェア アプリケーションが内部実装の詳細を知らなくても機能やデータを共有できるようにすることです。

APIの表現形式は、一般に、何らかのプログラミング言語で記述された関数(ファンクション)やデータ構造(データ構造)である。アプリケーションのプログラミング インターフェイスを定義および説明する文書は、API 仕様と呼ばれます。パブリック API とそれに対応する仕様により、アプリケーション開発者以外の開発者がこれらの API を呼び出し、新しく作成されたソフトウェア ロジックを通じて新しい機能を実装したり、オリジナルの機能を拡張したりすることができます。これにより、開発者はよりモジュール化され、スケーラブルで再利用可能なソフトウェアを構築できるようになります。API は最新のソフトウェア開発において重要な役割を果たしており、分散システム、マイクロサービス アーキテクチャ、およびアプリケーションの統合を促進します。API を使用することで、開発者は既存の機能を活用し、開発をスピードアップし、コードの保守性と再利用性を向上させることができます。

02

自動化された API テスト

ソフトウェア技術の発展に伴い、ソフトウェア構造が非常に複雑になり、ソフトウェア開発サイクルが短縮され続けるため、アプリケーションプログラムの品質と安全性を確保するために、API自体の機能の正確性と安全性がますます高まっています。 API テストが重要です。API テストは、API を直接テストするソフトウェア テスト手法であり、主に、開発者が作成した API が所定の機能目標、パフォーマンス目標、およびセキュリティ目標を満たしていることを確認するために使用されます。

1.jpg

最新のソフトウェア アーキテクチャのほとんどはモジュール化された階層化モデルを採用しており、機能的な対話とデータ送信は API を介してモジュールと階層間で実行されます。モジュールやソフトウェア層が提供するAPIにソフトウェアエラー(バグ)が発生すると、そのモジュールやソフトウェア層に依存する他のモジュールやソフトウェア層自体の機能にもエラーが発生します。最悪の場合、アプリケーション全体にエラーが発生し、ユーザー エクスペリエンスに影響を与え、ユーザー データのセキュリティが危険にさらされる可能性があります。したがって、API テストはソフトウェア開発プロセスにおいて非常に必要かつ重要な段階です。API テストが十分であり、テストされた API が正しいことが結果で示されている場合、これらの API を使用して構築されたアプリケーションまたはプログラム機能は、基本的な品質とセキュリティを保証できます。

初期のソフトウェア開発のウォーターフォールモデル(ウォーターフォールモデル)から、現在主流のアジャイル開発(アジャイル開発)やDevOpsに至るまで、ソフトウェア開発サイクルが短縮され、アプリケーションの品質とセキュリティをいかに効率的に確保するかがより注目を集めています。自動テストが誕生しました。API テストも自動化の時代に入りました。一般的な自動 API テスト手法 (単体テスト、ファズ テストなど) から特定のプログラミング言語テスト フレームワーク (pytest[9]、JUnit[10] など)、従来のアプリケーション プログラミング ライブラリ (ライブラリ) API テストから Web シナリオ RESTful API までテスト、自動化された API テスト技術は広く開発されています。

03

自動化された API テスト オブジェクト

API 自動テストの対象は現在、関数レベル API (関数レベル API) と RESTful API の 2 種類に主に分類されます。前者は、従来のプログラミング ライブラリ (またはサードパーティ ライブラリと呼ばれる) またはシステム ライブラリで開発者に提供される API インターフェイスであり、機能するには開発者がソフトウェア コード内で実際に呼び出す必要があります。後者は、Web およびクラウドのシナリオで広く使用されている REST 仕様の API であり、通常はクライアントからサーバーへの HTTP リクエストの形式で提供されます。両者の自動テストの形式は同じであり、どちらもテスターがテストを完了するために API 呼び出しを行うための特定のテスト ドライバーを作成する必要があります。テストの重要な内容は、API 呼び出しの実行結果が期待どおりであるかどうかを確認することでもあります。 API の実行中に何らかの間違いが発生したかどうか。違いは、関数レベルの API は通常ローカル環境で実行されるのに対し、RESTful API はクラウド環境で実行されることです。API の呼び出し形式が異なり、全体的な対話環境やテスト フレームワークも異なります。

3.1 関数レベルの API

関数レベルAPI(関数レベルAPI)とは、主にライブラリAPIとシステムコールを指します。一般的なソフトウェア開発プロセスでは、開発者によって記述された単一の関数、またはソフトウェア モジュールで公開される API インターフェイスも関数レベル API のカテゴリに属します。このタイプの API の自動テストは、主に開発者によって作成されたテスト ドライバーまたは自動生成されたテスト ドライバーを通じて行われます。

ライブラリ API とは、Android SDK や Python 公式標準の API など、ソフトウェア開発者が呼び出すことができる SDK (Software Development Kit)、標準ライブラリ (Standard library)、およびサードパーティ ライブラリ (Third-party library) の機能を指します。図書館。通常、ライブラリ API はアプリケーション全体を構築する基礎となるものであり、ソフトウェアがユーザーに提供するさまざまな高度な機能は、既存の API を呼び出したり、既存の API を組み合わせたりすることで実現されるため、ライブラリ API の正当性や安全性は自明のことです。

システム コール (syscall) は、開発者がユーザー空間およびシステム カーネルと対話するためにオペレーティング システムによって提供されるインターフェイスを指し、Linux の open、malloc、fork などの基礎となるオペレーティング システム機能にアクセスするために使用されます。

3.2  RESTful API

RESTful API は、直感的で短い URI (Uniform Resource Identifier) を通じてリソースを定義し、JSON や XML などのファイル形式を通じてデータを送信します。RESTful API は、GET、POST、DELETE、PUT などの HTTP 動詞のセマンティクスに基づく操作を使用して、これらのリソースを操作します。HTTP リクエストの処理中に、API はデータベースに対してデータの読み取り/書き込みを行ったり、他の Web サービスと通信したりする必要がある場合があります。RESTful API をテストするには、さまざまなエンドポイント用の HTTP メッセージを作成するだけでなく、正しいクエリ パラメーターと本文ペイロード メッセージを選択することも必要です。


この記事では、自動化された API テストの開発履歴とテスト対象の共有に焦点を当て、アプリケーション プログラミング インターフェイス (API) の概念と、ソフトウェア開発におけるその役割と重要性を体系的に紹介します。その後、アプリケーション プログラミング インターフェイス (API) ベースの自動テスト (パート 2)で、単体テストやファズ テストなど、現在の主流の自動 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/132619082