Apidogで自動テストワークフローを設計する際、APIリクエスト、データベースクエリ、Forループ、ForEachループ、スクリプトなど、様々な種類のテストステップを使用します。

多くの場合、あるステップで生成されたデータは、後続のステップで使用する必要があります。これにより、データがプロセスを駆動し、ステップが相互にリンクされる論理的な流れが生まれます。
例えば、次のような場合があります。
- 前のステップでユーザーのトークンを取得したり、特定のレコードを取得するためにデータベースクエリを実行したりする
- そして、それらの結果を次のステップのエンドポイントリクエストで使用する。
ここで重要な疑問が生じます。
先行する(アップストリーム)ステップのデータを、後続の(ダウンストリーム)ステップで正しく参照するにはどうすればよいでしょうか?
Apidogにおけるデータ受け渡しの2つのメカニズム
Apidogの自動テストでは、異なるテストステップ間でデータを渡す主な方法が2つあります。
1. 「動的値(Dynamic Values)」による前ステップデータの取得
「動的値(Dynamic Value)」機能を使用すると、前の(アップストリーム)ステップの出力を後の(ダウンストリーム)ステップで直接参照できます。これにより、データを保存することなく、その場でデータを取得できます。

2. 変数を保存して再利用する
アップストリームのステップから重要なデータを抽出し、変数として保存することができます。これらの変数は、後続のどのステップでも再利用できます。

これら2つのデータ受け渡し方法を習得することは、Apidogで効率的でデータ駆動型の自動ワークフローを構築するための鍵となります。
この記事では、異なる種類のテストステップでデータを処理する方法を、データの抽出方法とデータの使用方法の2つの側面から説明します。これら両方を理解することで、より柔軟で連携の取れたテストワークフローを構築できるようになります。
エンドポイント応答データの抽出と使用
エンドポイント応答データの理解
自動テストでは、APIリクエストは通常、構造化されたJSON応答を返します。これは多くの場合、後続のテストステップへの入力として機能します。

他のステップタイプとは異なり、エンドポイント応答はより複雑になる傾向があり、ネストされたオブジェクトや配列が頻繁に含まれます。
エンドポイント応答からデータを抽出する方法
テストステップ間でエンドポイント応答データを抽出し、渡す主な方法は2つあります。
方法1:動的値参照
「動的値(Dynamic Values)」を使用して、前のステップのデータを直接参照します。
- ダウンストリームステップの任意の入力フィールドで、魔法の杖アイコンをクリックします。
- 「Retrieve Pre-step Data(前ステップデータの取得)」を選択します。
- Apidogが正しい式を自動的に挿入するため、手動で記述する必要はありません。

方法2:データを変数として抽出する
エンドポイントのポストプロセッサにある「変数抽出(Extract Variables)」機能を使用して、応答から特定のフィールドを変数として抽出することもできます。
例えば、応答内の製品のid
を抽出するには:
- 変数名を
products_id
に設定します。 - JSONPath:
$.products[0].id
を使用します。

後続のステップでは、{{products_id}}
を使用して簡単に参照できます。
エンドポイント応答から抽出したデータを使用する方法
API応答からデータを抽出したら(「動的値(Dynamic Values)」または「抽出された変数(Extracted Variables)」のいずれかを使用)、そのデータをダウンストリームステップでいくつかの方法で使用できます。
1. エンドポイントリクエストでデータを使用する
- 動的値(Dynamic Value)経由:以前と同様に、入力フィールドの魔法の杖アイコンをクリックし、「Retrieve Pre-step Data(前ステップデータの取得)」を選択すると、Apidogが正しい式を自動的に挿入します。
- 抽出された変数(Extracted Variable)経由:以前に値を変数(例:
products_id
)として保存した場合は、APIリクエストのパラメータとして{{products_id}}
を使用するだけです。

2. データベース操作でデータを使用する
API応答をデータベースクエリの入力として使用できます。どちらの方法も機能します。
- 動的値(Dynamic Value)方式
SELECT * FROM products WHERE id = '{{$.1.response.body.products[0].id}}'
動的値を使用して、SQLクエリでAPI応答データを直接参照します。

- 抽出された変数(Extracted Variable)方式:製品IDを
products_id
という名前の変数として抽出した場合は、次を使用します。
SELECT * FROM products WHERE id = '{{products_id}}'
3. Forループ
でデータを使用する
API応答からの配列の長さに応じてステップを繰り返すには:
- 動的値を使用して配列の長さを取得します。例えば:
{{$.1.response.body.products.length}}
これにより、ループの繰り返し回数が設定されます。

4. ForEachループ
でデータを使用する
エンドポイントから返された配列の各項目をループ処理したい場合:
- 動的値(Dynamic Value)方式:配列全体を直接抽出します。例えば、
{{$.1.response.body.products}}

- 変数抽出(Extract Variable)方式:配列全体が
products
変数として抽出されていると仮定し、ループ内で{{products}}
を直接挿入します。

5. スクリプトでデータを使用する
スクリプト内で前のステップのデータを使用するには、pm.variables.get()
メソッドを使用します。方法は次のとおりです。
- 動的値(Dynamic Value)方式:前のステップからデータを直接読み取ります。
const products = pm.variables.get("$.1.response.body.products")

- 変数抽出(Extract Variable)方式:配列または値を変数として保存した場合は、次のスクリプトを使用してデータを取得します。
一時変数の値を取得します。
const products = pm.variables.get("products")
環境変数の値を取得します。
const products = pm.environment.get("products")
グローバル変数の値を取得します。
const products = pm.globals.get("products")
{{products}}
のような補間構文を直接使用することはできません。代わりに、上記で述べた適切なメソッドを使用して変数の値を取得する必要があります。データベースクエリ結果の抽出と使用
データベースデータの理解
データベースクエリステップが実行されると、オブジェクトの配列形式で構造化されたデータが返されます。たとえ1つのレコードしか返されない場合でも、それは配列でラップされます。例えば:

エンドポイント応答とは異なり、データベースステップからのデータは動的変数を使用して直接アクセスできません。まず、値を変数に抽出する必要があります。
データベースからデータを抽出する方法
データベースステップでSQLクエリを実行すると、Apidogは応答を次のような構造化データに自動的に解析します。
[
{
"id": "1000",
"title": "Title 1",
"description": "Description for Title 1"
}
]
その後、JSONPathを使用して特定のフィールドを抽出し、変数として保存できます。
例えば:
- 変数名:
products_id
- JSONPath:
$[0].id
(最初の項目のIDを抽出するため)。結果セット全体を抽出したい場合は、$
を使用します。 - ダウンストリームステップは、
{{ }}
を介して変数を参照します。例えば:{{products_id}}

データベースから抽出したデータを使用する方法
1. エンドポイントリクエストでデータを使用する
データベースクエリがIDを返し、それを変数(products_id
)として保存した場合、ダウンストリームのエンドポイントリクエストで直接使用できます。

2. ForEachループ
でデータを使用する
クエリがレコードのリストを返し、それぞれを個別に処理したい場合は、配列全体をForEach
ループのソースとして使用できます。

前提として、データベース操作で変数を抽出する際に配列全体を保存します。例えば:
- 変数名:
products
- JSONPath:
$

3. スクリプトでデータを使用する
抽出されたデータベース変数をスクリプトで使用するには、他の変数と同じ方法を使用します。
一時変数の値を取得します。
const products = pm.variables.get("products")
環境変数の値を取得します。
const products = pm.environment.get("products")
グローバル変数の値を取得します。
const products = pm.globals.get("products")
Forループ
からのデータの抽出と使用
Forループ
の仕組み
Forループ
は、特定の一連のアクションを複数回繰り返すために使用されます。定義された繰り返し回数に基づいて実行されます。
ループの固定回数を設定するか、前のステップから返された配列の長さ(.length
)のような動的値を使用できます。例えば: {{$.1.response.body.products.length}}
:

注:データを出力する他のステップとは異なり、Forループ
自体はデータを直接返しません。ループが何回実行されたかを示すインデックス値(0から始まる)のみを提供します。
Forループ
からデータを抽出する方法
実行プロセス中に、動的変数構文を使用して現在のループインデックスにアクセスできます:{{$.9.index}}

- 数字の
9
は、Forループ
ステップのIDを指します。 - 各ステップには一意のIDがあります。
- インデックスは最初のループで0から始まり、2番目のループで1、といった具合に続きます。
Forループ
から抽出したデータを使用する方法
1. スクリプトでデータを使用する
テストスクリプトでループ関連の情報を使用したい場合は、pm.variables.get()
を使用して現在のインデックスを取得できます。
// Get the current loop index
const index = pm.variables.get("$.7.index");

2. 他のデータソースと組み合わせてデータを使用する
Forループ
の一般的なユースケースは、配列をループして各項目を処理するなど、以前のステップからのデータを処理することです。
// Get the array from a previous step
const products = pm.variables.get("$.1.response.body.products");
// Get the current loop index
const index = pm.variables.get("$.7.index");
// Access the current item in the array using the index
console.log(products[index]);
これにより、各ループの反復中に配列内の各項目に対してバッチ操作を実行できます。
ForEachループ
からのデータの抽出と使用
ForEachループ
の仕組み
ForEachループは、配列データのために特別に設計されています。配列内の各要素を自動的に反復処理し、同じ一連の操作を実行します。
ForEachループ
とForループ
の主な違いは、ForEachループ
が各反復で現在の配列要素の完全なデータを自動的に抽出し、子ステップで直接アクセスできるようにすることです。
ForEachループ
でのデータアクセス
ForEachループ
内では、システムが自動的に2つの特殊な変数を作成します。
- 現在のループ要素:現在処理中の配列要素の完全なデータが含まれます。例えば:
{{$.4.element}}
。配列にオブジェクトが含まれている場合、{{$.4.element.id}}
、{{$.4.element.title}}
などのプロパティに直接アクセスできます。

- 現在のループインデックス:現在の反復回数(0から始まる)を表します。例:
{{$.4.index}}
。

注:数字の4
は、ForEachループ
ステップのIDを指します。実際のワークフローでは、これをプロセス内の正しいステップIDに置き換えてください。
ForEachループ
データの一般的なユースケース
1. エンドポイントリクエストでデータを使用する
ForEachループは、バッチデータ操作の処理に最適です。例えば、項目の配列がある場合、配列内の各項目に対してエンドポイントリクエストを自動的に送信できます。各ループ中、同じリクエストテンプレートが再利用されますが、{{$.4.element.id}}
などの異なるデータで埋められます。

2. データベース操作でデータを使用する
現在のループ項目からのデータを使用して、データベースクエリを実行したり、複数の行を挿入したりできます。
例:現在の項目のフィールドを使用してデータベースをクエリする
SELECT * FROM products WHERE id = '{{$.4.element.id}}'
式{{$.4.element.id}}
は、動的値機能を使用してアクセスできます。

現在の項目から複数のフィールドをテーブルに挿入する:
INSERT INTO products (id, title) VALUES ('{{$.4.element.id}}', '{{$.4.element.title}}')
3. スクリプトでデータを使用する
カスタムスクリプトでループからのデータをさらに処理する必要がある場合は、pm.variables.get()
メソッドを使用して値を取得できます。
// Get the current element
const item = pm.variables.get("$.4.element");
// Get the current index
const index = pm.variables.get("$.4.index");
スクリプトからのデータの抽出と使用
スクリプトデータの仕組み
ワークフローの他のステップとは異なり、スクリプトは後続のステップで直接使用できる出力を自動的に生成しません。スクリプトから後のステップにデータを渡したい場合は、手動で変数に保存する必要があります。
スクリプトからデータを抽出する方法
次のように、値を異なる種類の変数に保存できます。
// Get JSON response data
// 1. From the current endpoint response
// const currentData = pm.response.json();
// 2. Or get it from a previous step using a dynamic value
const preData = pm.variables.get("$.1.response.body");
// Save to environment variables
pm.environment.set('products', preData.products);
pm.environment.set('products_id', preData.products[0].id);
// Save to global variables
pm.globals.set('products', preData.products);
// Save to temporary variables (valid only during this run)
pm.variables.set('products', preData.products);
変数が抽出され設定されると、{{variableName}}
の構文を使用して後続のステップでそれらを参照できます。
スクリプトから抽出したデータを使用する方法
1. エンドポイントリクエストでデータを使用する
スクリプトで設定された変数は、ダウンストリームのエンドポイントリクエストのパラメータとして直接使用できます。例えば、スクリプトでproducts_id
を保存した場合、後続のリクエストで{{products_id}}
のように参照できます。

2. データベース操作でデータを使用する
スクリプト変数は、動的なSQLステートメントを構築するためにも使用できます。例えば:
SELECT * FROM products WHERE id = '{{products_id}}'
3. Forループ
でデータを使用する
スクリプトを使用してループカウントやその他の中間値を生成し、「一時変数」として保存し、Forループ
ステップに渡すことができます。
pm.variables.set("loopCount", 5);
その後、ループ設定で{{loopCount}}
を反復回数として使用します。
4. ForEachループ
でデータを使用する
配列全体を変数に保存し、それをForEachループ
のデータソースとして使用できます。
例:
// Optionally retrieve array from a previous step using dynamic values
// const preData = pm.variables.get("$.1.response.body.products")
const preData = [{id: 1}, {id: 2}, {id: 3}];
// Save to environment variable
pm.environment.set('products', preData);
その後、ForEachループ
でデータソースを{{products}}
に設定します。
まとめ
効率的な自動テストワークフローを構築するには、異なる種類のステップからデータを抽出し、使用する方法を理解することが不可欠です。
- エンドポイントおよびデータベースステップは、ビジネス関連のデータを生成します。
- ループステップは、ロジックの流れを制御します。
- スクリプトステップは、データの処理と変換に使用されます。
動的値参照と変数抽出を組み合わせることで、柔軟で強力なデータ駆動型テストプロセスを設計できます。
データ受け渡しのベストプラクティス:
- 一度だけ、またはたまにしか使用しない単純なデータには、動的値参照を使用します。
- 複数のステップで再利用したり、スクリプトで処理したりする必要があるデータには、変数抽出を使用します。
データの複雑さと使用頻度に基づいて適切な方法を選択することで、ワークフローの保守性と効率が向上します。