Robot Frameworkは、コードファーストなツールとは異なる立場を取っています。テストをプログラムコードとして記述する代わりに、人間が読みやすいキーワードの表として記述します。テストはほとんどチェックリストのように読めるため、QAアナリストやエンジニアが同じスイートを作成およびレビューできます。APIテストの場合、RequestsLibraryはHTTP呼び出しを同じ読みやすいキーワードに変換します。
このガイドでは、Robot Frameworkを使用してAPIテストをエンドツーエンドで自動化する方法を示します。フレームワークとその必要なライブラリをインストールし、最初のキーワード駆動型テストを記述し、リクエスト間でセッションを管理し、ステータスコードとJSONボディをアサートし、スイートが拡張可能になるように再利用可能なキーワードを構築します。すべての例は、Robot Frameworkが実際に使用するキーワードテーブル構文です。
Robot Frameworkとは何か、なぜAPIテストに適しているのか
Robot Frameworkは、テスト自動化およびロボティックプロセス自動化のためのオープンソースの汎用自動化フレームワークです。その際立った特徴はキーワード駆動型構文です。テストは平易な表形式で記述され、PythonまたはJavaで実装されたキーワードのライブラリから複雑な動作が構築されます。
APIテストにとって、これには2つの実際の利点があります。まず、テストはコードを書かない人でも読めるため、テスターやプロダクトオーナーはスイートが何を検証しているかを理解できます。次に、フレームワークは拡張可能です。RequestsLibraryはPythonのrequestsライブラリをラップし、HTTP操作をキーワードとして公開する一方、他のライブラリはJSON、データベースなどをカバーします。キーワード駆動型構造が初めての方は、より広範な自動化テストフレームワークガイドで、他のフレームワークタイプの中でそれがどのような位置付けにあるか説明しています。
Robot Frameworkとそのライブラリのインストール
Robot Frameworkとそのライブラリはpipを通じてインストールされます。プロジェクトをクリーンに保つために仮想環境内で作業してください。
python -m venv .venv
source .venv/bin/activate
pip install robotframework
pip install robotframework-requests
pip install robotframework-jsonlibrary
これら3つのパッケージは、ほとんどのAPIテストのニーズをカバーします。
robotframeworkはコアエンジンおよびテストランナーです。robotframework-requests(RequestsLibrary) はHTTPリクエストをキーワードとして送信します。robotframework-jsonlibraryはJSONレスポンス内の値を抽出および検証します。
robot --versionでインストールを確認してください。スイートが大きくなるにつれて構文に関する質問が出てきた場合は、公式のRobot Frameworkユーザーガイドが参考になります。
1つの詳細が初心者を戸惑わせることがあります。Robot Frameworkは空白文字に敏感です。キーワードとその引数は、1つではなく少なくとも2つのスペースで区切られます。1つのスペースは同じトークンの一部として扱われます。Robot Frameworkプラグインを搭載したほとんどのエディタがこれを処理してくれますが、テストの解析に失敗した場合は、引数のスペースの誤りが最初に確認すべき点です。
最初のAPIテストを記述する
Robot Frameworkのテストファイルは.robot拡張子を使用し、*** Settings ***、*** Variables ***、*** Test Cases ***でマークされたセクションに分かれています。以下は、ユーザーエンドポイントをチェックする完全なファイルです。
*** Settings ***
Library RequestsLibrary
Library Collections
*** Variables ***
${BASE_URL} https://api.example.com/v1
*** Test Cases ***
Get User Returns 200
Create Session api ${BASE_URL}
${response}= GET On Session api /users/42
Status Should Be 200 ${response}
Get User Returns Expected Email
Create Session api ${BASE_URL}
${response}= GET On Session api /users/42
${body}= Set Variable ${response.json()}
Should Be Equal As Integers ${body}[id] 42
Should Be Equal ${body}[status] active
*** Settings ***セクションはライブラリをインポートします。Create Sessionは名前付きHTTPセッションを開きます。GET On Sessionはリクエストを送信し、レスポンスオブジェクトを返します。Status Should BeとShould Be Equalはアサーションキーワードです。robot tests.robotでスイートを実行すると、Robot FrameworkはHTMLレポートとログを自動的に生成します。
セッションの操作
Create SessionはベースURLを保存する以上のことをします。セッションはデフォルトのヘッダー、認証、クッキーを保持するため、それに基づいて行われるすべてのリクエストはその状態を継承します。これはログインを必要とするAPIにとって重要です。なぜなら、一度認証すればセッションを再利用できるからです。
*** Test Cases ***
Create Order With Authenticated Session
Create Session api ${BASE_URL}
${login}= POST On Session api /auth/login
... json={"email": "qa@example.com", "password": "test-pass"}
${token}= Set Variable ${login.json()}[token]
${headers}= Create Dictionary Authorization=Bearer ${token}
${order}= POST On Session api /orders
... json={"product_id": 7, "quantity": 2}
... headers=${headers}
Status Should Be 201 ${order}
...構文はキーワード呼び出しを次の行に継続させ、長いリクエストを読みやすく保ちます。Create Dictionaryはヘッダーマップを構築します。セッションが持続するため、再作成することなく複数の後続リクエストを行うことができます。セッションに関するRequestsLibraryのキーワードは、RequestsLibraryリファレンスに文書化されています。
レスポンスボディのアサート
ステータスコードの確認は最初のステップです。ボディを検証するには、JSONを解析し、そのフィールドをアサートします。Robot Frameworkの組み込みキーワードは等価性と包含をカバーし、JSONLibraryはパスベースの抽出を追加します。
*** Settings ***
Library RequestsLibrary
Library JSONLibrary
Library Collections
*** Variables ***
${BASE_URL} https://api.example.com/v1
*** Test Cases ***
Order Response Has Correct Shape
Create Session api ${BASE_URL}
${response}= POST On Session api /orders
... json={"product_id": 7, "quantity": 2}
Status Should Be 201 ${response}
${body}= Set Variable ${response.json()}
Dictionary Should Contain Key ${body} total
Should Be Equal As Integers ${body}[quantity] 2
${status}= Get Value From Json ${body} $.status
Should Be Equal ${status}[0] pending
Dictionary Should Contain Keyはフィールドの存在を確認します。Should Be Equal As Integersは、型不一致の予期せぬ事態なしに数値値を比較します。Get Value From JsonはJSONPath式を使用してネストされたデータにアクセスします。APIレスポンスに対して実行する価値のあるより広範なチェックについては、APIアサーションに関するガイドが良い補完となります。
再利用可能なキーワードの構築
すべてのテストでCreate Sessionとログインフローを繰り返すのは、キーワード駆動型におけるコピー&ペーストに相当します。Robot Frameworkでは、*** Keywords ***セクションで独自のキーワードを定義できるため、共通のステップが単一の読みやすい行になります。
*** Keywords ***
Authenticate And Open Session
Create Session api ${BASE_URL}
${login}= POST On Session api /auth/login
... json={"email": "qa@example.com", "password": "test-pass"}
${token}= Set Variable ${login.json()}[token]
Set Suite Variable ${AUTH_HEADERS} Bearer ${token}
*** Test Cases ***
Create Order
Authenticate And Open Session
${headers}= Create Dictionary Authorization=${AUTH_HEADERS}
${order}= POST On Session api /orders
... json={"product_id": 7, "quantity": 2} headers=${headers}
Status Should Be 201 ${order}
カスタムキーワードは、Robot Frameworkスイートが保守性を維持するための方法です。ログインエンドポイントが変更された場合、すべてのテストを編集するのではなく、1つのキーワードを編集するだけです。大規模なスイートの場合、共有キーワードをリソースファイルに移動してインポートします。これは、自動テストスクリプトの記述方法に関するガイドで説明されているのと同じモジュール化の規律です。
リソースファイルとは、テストケースを含まず、*** Keywords ***と*** Variables ***セクションのみを含む.robotファイルのことです。設定でResource common.robotを使用してテストファイルからインポートします。これにより、ログインフロー、ベースURL、およびその他の共有部分を1か所にまとめられます。プロジェクトが成長するにつれて、一般的なレイアウトでは、API領域ごとに1つのリソースファイルと、グローバルセットアップ用のトップレベルのリソースファイルが配置されます。テストケースとそれをサポートするロジックの分離は、キーワード駆動型構造の核心であり、より広範な自動化テストフレームワークガイドでは、それがなぜ拡張性があるのかを説明しています。
CIでのRobot Frameworkの実行
Robot Frameworkはヘッドレスで実行され、失敗時にはゼロ以外の終了コードを返します。これはパイプラインがビルドを失敗させるために必要なものです。また、ランナーはすべての実行後にoutput.xml、log.html、report.htmlを書き出すため、追加設定なしでCIアーティファクトを利用できます。
いくつかのフラグを使用すると、CIの実行がよりクリーンになります。--outputdirを使用してレポートを既知のフォルダに送信し、--includeと--excludeをタグとともに使用してサブセットを実行し、変数ファイルまたは--variableを使用してテストファイルを編集することなくベースURLや認証情報などの環境固有の値を注入できます。
robot --outputdir results --variable BASE_URL:https://staging.example.com/v1 tests/
[Tags]でテストにタグを付けることで、コミットごとに高速なスモークテストセットを実行し、毎晩フルスイートを実行できます。これをGitHub Actionsやその他のパイプラインに組み込む方法は、CI/CDにおけるAPIテストのウォークスルーと同じパターンに従います。依存関係をインストールし、コマンドを実行し、レポートアーティファクトを公開します。
専用のAPIプラットフォームがより役立つ場合
Robot Frameworkは、複合スキルを持つチームが共有できる、読みやすいキーワード駆動型テストが必要な場合に強力な選択肢です。ただし、API設計、モック、デバッグをすべて1か所で行いたい場合や、ライブラリを組み立てることなくOpenAPI仕様に対するスキーマ検証を行いたい場合には、あまり便利ではありません。
Apidogはこれらのニーズに直接対応します。視覚的なテストビルダー、自動OpenAPIスキーマ検証、CSVおよびJSONからのデータ駆動型実行、環境管理、HTMLレポートを提供し、CI用のCLIランナーも備えています。チームはしばしば両方を使用します。キーワード駆動型の読みやすさが最も重要な場合はRobot Frameworkを、設計、モック、およびテスト対象APIの広範なテストにはApidogを使用します。キーワードライブラリを記述することなく、Apidogをダウンロードして、すぐに機能するAPIテストスイートを立ち上げることができます。
よくある質問
Robot FrameworkはUIテスト専用ですか?
いいえ。Robot Frameworkは汎用自動化フレームワークです。RequestsLibraryを使用すればAPIテストをうまく処理でき、他のライブラリはデータベース、SSHなどをカバーします。そのキーワード駆動型設計はレイヤーにとらわれません。このフレームワークはSeleniumLibraryを通じてUIテストで人気を博しましたが、APIテストも同様に一般的な用途です。
Create Sessionとプレーンなリクエストの違いは何ですか?
Create Sessionは、ベースURL、ヘッダー、クッキー、認証を保存する、名前付きの永続HTTPセッションを開きます。GET On Sessionのような後続のキーワードはこの状態を再利用します。これはログインを必要とするAPIにとって不可欠です。セッションレスのリクエストでは、呼び出し間でクッキーや認証が引き継がれないため、毎回すべてを再送信する必要があります。
Robot Frameworkを使用するためにPythonを知る必要がありますか?
テストを記述するだけなら必要ありません。キーワードテーブル構文はプログラマー以外のユーザー向けに設計されており、RequestsLibraryはすでにHTTP操作をキーワードとして公開しています。Pythonの知識が役立つのは、まったく新しいキーワードライブラリを記述したい場合のみです。ほとんどのAPIテストのニーズは既存のライブラリでカバーされているため、多くのチームはPythonをまったく記述しません。
APIテストに関してRobot Frameworkとpytestを比較するとどうなりますか?
pytestはコードファーストであり、アプリケーションコードの横にテストを置きたいPythonチームに適しています。Robot Frameworkはキーワード駆動型であり、読みやすいテーブル形式のテストを重視する複合スキルのチームに適しています。どちらもCIで実行され、レポートを生成します。選択は、生の機能よりも、誰がスイートを記述し保守するかによって決まります。
Robot FrameworkはOpenAPIスキーマに対してレスポンスを検証できますか?
そのままではできません。組み込みキーワードとJSONLibraryを使用して個々のフィールドをアサートすることはできますが、コミュニティライブラリはスキーマチェック機能を追加します。OpenAPIドキュメントに対する自動検証がワークフローの中心である場合、それをネイティブで行うApidogのようなプラットフォームを使用すると、ライブラリの組み立てと保守の手間を省くことができます。
