3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Postman テストスクリプトリファレンス

Last updated at Posted at 2024-05-13

本記事は、Postman JavaScript reference の日本語訳です(2024年5月13日更新)。

Postman JavaScript API の機能により、pm オブジェクトを使用して、リクエストとレスポンスのデータと変数にプログラムでアクセスし、変更することができます。また、コレクションランナー用のリクエストワークフローを構築するために、実行順序を動的に変更することもできます。

スクリプトで変数を使う

pm API を使って、Postman の各スコープの変数にアクセスして操作することができます。

リクエストの実行時に動的変数を使って値を生成することができます。

Postman は様々な変数スコープをサポートしています。pm オブジェクトはグローバル変数、コレクション変数、環境変数のいずれかを特定してアクセスするためのメソッドと、異なるスコープの変数にアクセスしたりローカル変数を設定するための pm.variables メソッド群を提供します。

  • 現在のスコープに Postman 変数があるかどうかをチェックする:
pm.variables.has(variableName:String):Function  Boolean
  • 指定した名前の Postman 変数の値を取得する:
pm.variables.get(variableName:String):Function  *
  • 指定した名前と値を持つローカル変数を設定する:
pm.variables.set(variableName:String, variableValue:*):Function
  • 構文 {{$variableName}} を使って、スクリプト内の動的変数の解決された値を返す:
pm.variables.replaceIn(variableName:String):Function:  *

例:

const stringWithVars = pm.variables.replaceIn("こんにちは、私の名前は {{$randomFirstName}} です");
console.log(stringWithVars);
  • 現在のスコープにあるすべての変数とその値を含むオブジェクトを返す。優先順位に基づいて、複数のスコープの変数を含むことになる。
pm.variables.toObject():Function  Object

変数スコープは、変数を参照するときに Postman が変数に与える優先順位を、順位の高い順に決定します:

  • グローバル
  • コレクション
  • 環境
  • データ
  • ローカル

最も狭いスコープを持つ変数が他を上書きします。例えば、現在のコレクションとアクティブな環境の両方に score という名前の変数がある時に、pm.variables.get('score') を呼び出した場合、Postman は環境変数の現在の値を返します。pm.variables.set を使用して変数の値を設定する場合には、その値はローカルであり、現在のリクエストまたはコレクションの実行時のみ保持されます。

// コレクション変数 'score' = 1
// 環境変数 'score' = 2

// 1回目のリクエストの実行
console.log(pm.variables.get('score')); // 出力:2
console.log(pm.collectionVariables.get('score')); // 出力:1
console.log(pm.environment.get('score')); // 出力:2

// 2回目のリクエストの実行
pm.variables.set('score', 3); // ローカル変数
console.log(pm.variables.get('score')); // 出力:3

// 3回目のリクエストの実行
console.log(pm.variables.get('score')); // 出力:2

詳細は Postman Collection SDK Variables reference を参照してください。

また、pm.environmentpm.collectionVariablespm.globals を用いて、個々のスコープで定義された変数にアクセスすることもできます。

スクリプトで環境変数を使う

スクリプトはアクティブな(現在選択されている)環境の変数にアクセスして操作するために pm.environment メソッド群を使うことができます。

  • アクティブな環境の名前:
pm.environment.name:String
  • 環境に指定された名前の変数があるかどうかを調べる:
pm.environment.has(variableName:String):Function  Boolean
  • アクティブな環境の指定された名前の変数を取得する:
pm.environment.get(variableName:String):Function  *
  • アクティブな環境で指定された名前と値を持つ変数を設定する:
pm.environment.set(variableName:String, variableValue:*):Function
  • 構文 {{$variableName}} を使ってスクリプト内の動的変数の解決された値を返す:
pm.environment.replaceIn(variableName:String):Function  *

例:

// 環境に変数 firstName と age が存在
const stringWithVars = pm.environment.replaceIn("こんにちは、私の名前は {{firstName}} で、{{age}} 歳です。");
console.log(stringWithVars);
  • アクティブな環境のすべての変数とその値を1つのオブジェクトで返す:
pm.environment.toObject():Function  Object
  • アクティブな環境から変数名を指定して変数を削除する:
pm.environment.unset(variableName:String):Function
  • アクティブな環境のすべての変数を消去する:
pm.environment.clear():Function

変数を編集できるかどうかはワークスペースのアクセスレベルに依存することに注意してください。

スクリプトでコレクション変数を使う

スクリプトは pm.collectionVariables メソッド群を使用して、コレクション内の変数にアクセスし、操作することができます。

  • コレクションに指定された名前の変数があるかどうかをチェックする:
pm.collectionVariables.has(variableName:String):Function  Boolean
  • 指定された名前のコレクション変数の値を返す:
pm.collectionVariables.get(variableName:String):Function  *
  • コレクション変数に指定された名前と値を設定する:
pm.collectionVariables.set(variableName:String, variableValue:*):Function
  • 構文 {{$variableName}} を使って、スクリプト内の動的変数の解決された値を返す:
pm.collectionVariables.replaceIn(variableName:String):Function  *

例:

// コレクションに変数 firstName と age が存在
const stringWithVars = pm.collectionVariables.replaceIn("こんにちは、私の名前は {{firstName}} で、{{age}} 歳です。");
console.log(stringWithVars);
  • コレクション内のすべての変数とその値をオブジェクトで返す:
pm.collectionVariables.toObject():Function  Object
  • コレクションから指定された変数を削除する:
pm.collectionVariables.unset(variableName:String):Function
  • コレクションからすべての変数を消去する:
pm.collectionVariables.clear():Function

スクリプトでグローバル変数を使う

スクリプトは pm.globals メソッド群を使用して、ワークスペース内のグローバルスコープで変数にアクセスし、操作することができます。

  • 指定された名前のグローバル変数が存在するかチェックする:
pm.globals.has(variableName:String):Function  Boolean
  • 指定された名前のグローバル変数の値を返す:
pm.globals.get(variableName:String):Function  *
  • 指定した名前と値を持つグローバル変数を設定する:
pm.globals.set(variableName:String, variableValue:*):Function
  • 構文 {{$variableName}} を使って、スクリプト内の動的変数の解決された値を返す:
pm.globals.replaceIn(variableName:String):Function  String

例:

// グローバルに変数 firstName と age が存在
const stringWithVars = pm.globals.replaceIn("こんにちは、私の名前は {{firstName}} で、{{age}} 歳です。");
console.log(stringWithVars);
  • オブジェクト内のすべてのグローバル変数とその値を返す:
pm.globals.toObject():Function  Object
  • 指定されたグローバル変数を削除する:
pm.globals.unset(variableName:String):Function
  • ワークスペース内のすべてのグローバル変数を消去する:
pm.globals.clear():Function

変数を編集できるかどうかは、ワークスペースのアクセスレベルに依存することに注意してください。

スクリプトでデータ変数を使用する

スクリプトは、pm.iterationData メソッド群を使用して、コレクション実行中にデータファイルから変数にアクセスして操作できます。

  • 指定された名前の変数が現在のイテレーションデータに存在するかどうかをチェックする:
pm.iterationData.has(variableName:String):Function  Boolean
  • イテレーションデータから指定された名前の変数を返す:
pm.iterationData.get(variableName:String):Function  *
  • イテレーションデータ変数をオブジェクトで返す:
pm.iterationData.toObject():Function  Object
  • iterationData オブジェクトを JSON 形式に変換する:
pm.iterationData.toJSON():Function  *
  • 指定された変数を削除する:
pm.iterationData.unset(key:String):Function

リクエストデータとレスポンスデータを使ったスクリプティング

pm.requestpm.responsepm.infopm.cookies など、様々なメソッド群が Postman スクリプトのリクエストデータとレスポンスデータへのアクセスを提供します。さらに pm.sendRequest を使ってリクエストを送ることもできます。

リクエストデータを使ったスクリプティング

pm.request オブジェクトはスクリプトが実行されているリクエストのデータへのアクセスを提供します。Pre-request スクリプトの場合、このオブジェクトはこれから実行されるリクエストであり、Post-response スクリプトの場合は実行済みのリクエストです。

pm.request オブジェクトの Pre-request スクリプトを使用して、実行前にリクエストの設定の様々な部分を変更することができます。

pm.request オブジェクトは以下のプロパティとメソッドを提供します:

  • リクエストURL
pm.request.url:Url
pm.request.headers:HeaderList
  • HTTP リクエストメソッド:
pm.request.method:String
  • リクエストボディのデータ。このオブジェクトは不変で、スクリプトから変更することはできない:
pm.request.body:RequestBody
  • 現在のリクエストに、指定された名前と値を持つヘッダーを追加する:
pm.request.headers.add(header:Header):Function

例:

pm.request.headers.add({
  key: "client-id",
  value: "abcdef"
});
  • 指定した名前のリクエストヘッダーを削除する:
pm.request.headers.remove(headerName:String):Function
  • 指定されたヘッダー名と値を挿入する(ヘッダーが存在しない場合、すでに存在するヘッダーは新しい値に更新される):
pm.request.headers.upsert({key: headerName:String, value: headerValue:String}):Function

詳細は Postman Collection SDK Request reference を参照してください。

レスポンスデータを使ったスクリプティング

pm.response オブジェクトは、Post-response タブに追加されたスクリプトにおいて、現在のリクエストに対するレスポンスで返されたデータへのアクセスを提供します。

pm.response オブジェクトは以下のプロパティとメソッドを提供します:

  • レスポンスのステータスコード:
pm.response.code:Number
  • ステータスのテキスト文字列:
pm.response.status:String
pm.response.headers:HeaderList
  • レスポンスの受信に要した時間(ミリ秒):
pm.response.responseTime:Number
  • 受信したレスポンスのサイズ:
pm.response.responseSize:Number
  • レスポンステキスト:
pm.response.text():Function  String
  • レスポンス JSON。受け取ったプロパティの詳細を取得するために使用できる:
pm.response.json():Function  Object

詳細は Postman Collection SDK Response reference を参照してください。

リクエスト情報を使ったスクリプティング

pm.info オブジェクトは、名前、リクエストID、反復回数を含む、リクエストとスクリプト自体に関連するデータを提供します。

pm.info オブジェクトは以下のプロパティとメソッドを提供します:

  • イベント。スクリプトがリクエストのどこで実行されているかに応じて prerequesttest になる:
pm.info.eventName:String
pm.info.iteration:Number
  • 実行予定のイテレーション回数の合計:
pm.info.iterationCount:Number
  • 実行中のリクエストの保存名:
pm.info.requestName:String
  • 実行中のリクエストを識別する一意の GUID:
pm.info.requestId:String

リクエスト Cookie を使ったスクリプティング

pm.cookies オブジェクトはリクエストに関連付けられた Cookie のリストへのアクセスを提供します。

pm.cookies オブジェクトは以下のプロパティとメソッドを提供します:

  • リクエストされたドメインに(名前で指定された)特定の Cookie が存在するかどうかをチェックする:
pm.cookies.has(cookieName:String):Function  Boolean
  • 指定した Cookie の値を取得する:
pm.cookies.get(cookieName:String):Function  String
  • オブジェクト内のすべての Cookie とその値のコピーを取得する。リクエストドメインとパスに定義されているすべての Cookie を返す:
pm.cookies.toObject():Function  Object

詳細は Postman Collection SDK Cookie List reference を参照してください。

pm.cookies.jar を使って、リクエスト Cookie へのアクセスにドメインを指定することもできます。

pm.cookies.jar メソッド群を使ってプログラムによるアクセスを有効にするには、まず Cookie の URL を allowlist に追加してください。

  • Cookie ジャーオブジェクトにアクセスする:
pm.cookies.jar():Function  Object

例:

const jar = pm.cookies.jar();
// Cookie メソッド...
  • 名前と値を使用して Cookie を設定する:
jar.set(URL:String, cookieName:String, cookieValue:String, callback(error, cookie)):Function  Object
  • PostmanCookie または互換性のあるオブジェクトを使用して Cookie を設定する:
jar.set(URL:String, { name:String, value:String, httpOnly:Bool }, callback(error, cookie)):Function  Object

例:

const jar = pm.cookies.jar();
jar.set("httpbin.org", "session-id", "abc123", (error, cookie) => {
  if (error) {
    console.error(`エラーが発生しました: ${error}`);
  } else {
    console.log(`Cookie は保存されました: ${cookie}`);
  }
});
  • Cookie ジャーから特定の URL の Cookie を取得する:
jar.get(URL:String, cookieName:String, callback(error, value)):Function  Object
  • Cookie ジャーから特定の URL のすべての Cookie を取得する。Cookie はコールバック関数で利用できる:
jar.getAll(URL:String, callback(error, cookies)):Function
  • 特定の URL の Cookie を削除する:
jar.unset(URL:String, cookieName:String, callback(error)):Function  Object
  • Cookie ジャーから特定の URL のすべての Cookie を消去する:
jar.clear(URL:String, callback(error)):Function  Object
  • 特定の URL の Cookie をクリアしてから、続けて Cookie を設定する:
jar.clear(URL:String, callback(error) => {
  jar.set(URL:String, cookieName:String, cookieValue:String, callback(error, cookie)):Function  Object
}):Function  Object

Cookie ジャーに対する関数呼び出しは非同期に実行されます。関数を順番に実行するには、コールバック関数を使用してください。

詳細は Postman Collection SDK Cookie reference を参照してください。

スクリプトからリクエストを送信する

pm.sendRequest メソッドを使用すると、Pre-request スクリプトや Post-response スクリプトから非同期にリクエストを送信することができます。これにより、計算を実行したり複数のリクエストを同時に送信したりする場合に、それぞれの処理の完了を待たずにバックグラウンドでロジックを実行することができます。コールバック関数を追加して、Postman がレスポンスを受信したときにコードが応答できるようにすれば、処理がブロックされる問題を回避できます。そして、レスポンスデータに対して必要な追加処理を行うことができます。

pm.sendRequest メソッドに URL 文字列を渡すか、ヘッダー、メソッド、ボディ、その他を含む完全なリクエスト設定を JSON で指定することができます。

// プレーンな文字列の URL の例
pm.sendRequest('https://postman-echo.com/get', (error, response) => {
  if (error) {
    console.log(error);
  } else {
  console.log(response);
  }
});

// 本格的なリクエストの例
const postRequest = {
  url: 'https://postman-echo.com/post',
  method: 'POST',
  header: {
    'Content-Type': 'application/json',
    'X-Foo': 'bar'
  },
  body: {
    mode: 'raw',
    raw: JSON.stringify({ key: 'これは json です' })
  }
};
pm.sendRequest(postRequest, (error, response) => {
  console.log(error ? error : response.json());
});

// テストを含む例
pm.sendRequest('https://postman-echo.com/get', (error, response) => {
  if (error) {
    console.log(error);
  }

  pm.test('レスポンスは問題なく処理できる', () => {
    pm.expect(error).to.equal(null);
    pm.expect(response).to.have.property('code', 200);
    pm.expect(response).to.have.property('status', 'OK');
  });
});

詳しくはリクエスト定義レスポンス構造のリファレンスドキュメントを参照してください。

リクエストのパスと名前を取得する

pm.execution.location プロパティを使って、フォルダーやコレクションを含むリクエストの完全なパスを配列形式で取得することができます。例えば、コレクション C1 のフォルダー F1 にある R1 という名前のリクエストに対して、以下の Post-response スクリプトコードは ["C1", "F1", "R1"] を返します:

console.log(pm.execution.location);
// リクエストのフルパスを配列形式で返す。例:
// ["C1", "F1", "R1"]

現在の要素の名前を取得するには、pm.execution.location.current プロパティを使用します。例えば、F1 という名前のフォルダーの Pre-request スクリプトに以下のコードを追加すると、F1 が返されます:

console.log(pm.execution.location.current);
// 現在の要素の名前を返す。例:
// F1

スクリプトで pm.execution.locationpm.execution.location.current プロパティを使用すると、リクエストが送信されたときに何の項目が実行されるかを知ることができます。この情報により、API テストやコレクション構造内の現在の場所に合わせたロジックや操作をスクリプトに実装することができます。

Pre-request スクリプトからリクエスト実行をスキップする

pm.execution.skipRequest メソッドを使って、Pre-request スクリプトからリクエストの実行を停止することができます。

pm.execution.skipRequest():Function

リクエスト、コレクション、フォルダーの Pre-request タブで pm.execution.skipRequest メソッドを使うことができます。pm.execution.skipRequest() に到達すると、リクエストは送信されません。Pre-request タブの残りのスクリプトはすべてスキップされ、テストは実行されません。

例:

// 認証トークンが存在しない場合は、このリクエストをスキップする
if (!pm.environment.get('token')) {
    pm.execution.skipRequest()
}

コレクションランナーでは、pm.execution.skipRequest() に到達すると、Postman は現在のリクエストの実行をスキップし(Post-response スクリプトを含む)、次の順番のリクエストに移ります。実行結果には、そのリクエストに対するレスポンスとテストが見つからなかったことが示されます。この動作は Postman FlowsNewmanPostman CLI にも当てはまります。

pm.execution.skipRequest メソッドの使用はリクエスト、コレクション、フォルダーの Post-response タブではサポートされておらず、何の効果もありません。また、次のようなコンソールエラーが発生します:TypeError: pm.execution.skipRequest is not a function

JSON Schema でレスポンスデータを検証する

jsonSchema メソッドを使って、レスポンスデータを JSON Schema で検証するテストアサーションを書くことができます。Postman は Ajv JSON Schema バリデーターのバージョン 6.12.5 を使用して、レスポンスデータを JSON Schema で検証します。

テストアサーションを書くには、pm.response オブジェクトと Chai Assertion Library BDD 構文を使用して、レスポンスで返されるデータにアクセスします。

jsonSchema メソッドは、第一引数に JSON Schema をオブジェクトとして受け取ります。また、第二引数にはオプションの Ajv オプションのオブジェクトを受け取ります。

pm.response.<bdd-syntax>.jsonSchema(schema, options);

Postman では、リクエストの Scripts タブなどで JSON Schema を定義できます。そして、定義した JSON Schema に対してレスポンスデータのプロパティを検証するテストを書くことができます。

以下の例では、JSON Schema は、レスポンスデータに boolean データ型の「alpha」というプロパティを持たせることを要求しています。レスポンスデータにこのプロパティがないか、異なるデータ型である場合、テストは失敗します。この例では、BDD 構文 to.have を使用してアサーションを表現しています。

const schema = {
  "type": "object",
  "properties": {
    "alpha": {
      "type": "boolean"
    }
  },
  "required": ["alpha"]
};

pm.test('レスポンスは有効', function() {
  pm.response.to.have.jsonSchema(schema);
});

ワークフローのスクリプティング

コレクションランナーまたは Newman を使用するとき、pm.execution.setNextRequest メソッドを使ってリクエストワークフローを構築することができます。

setNextRequest送信を使ってリクエストを実行するときには効果がないことに注意してください。コレクションを実行するときにのみ効果があります。

コレクションを実行するとき(コレクションランナーや Newman を使うとき)、Postman はデフォルトの順番か、実行をセットアップするときに指定した順番でリクエストを実行します。しかし、pm.execution.setNextRequest を使ってこの実行順序を上書きし、次に実行するリクエストを指定することができます。

  • このリクエスト(コレクションで定義されたリクエスト名、例えば「顧客の取得」)の後に指定されたリクエストを実行する:
pm.execution.setNextRequest(requestName:String):Function
  • 指定されたリクエスト(pm.info.requestId が返すリクエスト ID)をこのリクエストの後に実行する:
pm.execution.setNextRequest(requestId:String):Function

例:

// 別のリクエスト呼び出し中のスクリプト:
//pm.environment.set('next', pm.info.requestId)
pm.execution.setNextRequest(pm.environment.get('next'));

Postman ビジュアライゼーションのスクリプティング

Postman ビジュアライザーでレスポンスデータを表示するテンプレートを指定するには pm.visualizer.set を使用します。

pm.visualizer.set(layout:String, data:Object, options:Object):Function
  • layout必須
  • data(オプション)
    • テンプレートにバインドする JSON オブジェクトで、テンプレート文字列の中でアクセスできる
  • options(オプション)

例:

var template = `<p>{{res.info}}</p>`;
pm.visualizer.set(template, {
    res: pm.response.json()
});

Postman ビジュアライゼーションにレスポンスデータを組み込む

Postman ビジュアライザーテンプレート文字列内では、pm.getData を使用してレスポンスデータを取得します。

pm.getData(callback):Function

コールバック関数は2つのパラメータを受け付けます:

使用例:

pm.getData(function (error, data) {
  var value = data.res.info;
});

テストアサーションを書く

pm.test(testName:String, specFunction:Function):Function  Object

pm.test を使って、Pre-request スクリプトや Post-response スクリプトの中でテストの仕様を書くことができます。テストは名前とアサーションを含みます。Postman はテストの結果をレスポンスの一部として出力します。

pm.test メソッドは pm オブジェクトを返し、呼び出しを連鎖させることができます。以下のサンプルテストはレスポンスが有効かどうかをチェックします。

pm.test("レスポンスは問題なく処理できる", function () {
  pm.response.to.not.be.error;
  pm.response.to.have.jsonBody('');
  pm.response.to.not.have.jsonBody('error');
});

非同期関数をテストするために、オプションのコールバックを pm.test に渡すことができます。

pm.test('非同期テスト', function (done) {
  setTimeout(() => {
    pm.expect(pm.response.code).to.equal(200);
    done();
  }, 1500);
});
  • コード内の特定の場所から実行されたテストの総数を取得する:
pm.test.index():Function  Number

pm.expect メソッドを使って、ChaiJS expect BDD 構文を使ってレスポンスデータに対するアサーションを書くことができます。

pm.expect(assertion:*):Function  Assertion

pm.response.to.have.*pm.response.to.be.* を使ってアサーションを構築することもできます。

その他のアサーションについてはテストのサンプルを参照してください。

パッケージライブラリからパッケージをインポートする

pm.require メソッドを使って、HTTP リクエスト、コレクション、フォルダーの Pre-request スクリプトや Post-response スクリプトの中に、チームのパッケージライブラリからパッケージをインポートすることができます。パッケージの内容はパーソナルワークスペース、プライベートワークスペース、チームワークスペースからのみ実行されます。パッケージライブラリを使用すると、ワークスペース内のスクリプトやテストを再利用できます。パッケージライブラリを使用してスクリプトとテストを再利用する方法については、こちらを参照してください。

pm.require メソッドは、パッケージライブラリ内のパッケージ名を受け取ります。パッケージに呼び出したい関数やオブジェクトがある場合は、メソッドを変数として宣言してください。パッケージにコードか pm オブジェクトのインスタンスしかない場合は、メソッドを変数として宣言する必要はありません。

const variableName = pm.require('@team-domain/package-name');

variableName.functionName();

外部ライブラリを使用する

require(moduleName:String):Function  *

require メソッドを使うと、サンドボックスに組み込みのライブラリモジュールを使うことができます。利用可能なライブラリの一覧を、対応するドキュメントへのリンクとともに以下に示します。

以下の NodeJS モジュールもサンドボックス内で使用できます:

ライブラリを使用するには、require メソッドを呼び出し、パラメータとしてモジュール名を渡し、メソッドからの戻りオブジェクトを変数に代入してください。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?