Postman Package Library と Package

2025/03/03に公開

https://qiita.com/KameMan/items/4e5325cd9a9775992897

2024年12月のQiita AdventcalenderでPostman Collectionで設定されているAPIコールに対して、呼び出し前のリクエストの操作と呼び出し後のレスポンスの操作が可能となるスクリプトの機能を紹介しました。

汎用的に繰り返し使われるものは都度都度スクリプトをコピーするよりも、まとめておいて再利用した方が効率的です。それを実現させるのがPackage Libraryです。
再利用したいスクリプトをPackageとしてまとめて、それを管理するのがPackage Libraryという関係です。

Package Library とは

よく使用されるスクリプトやテストを チーム内のパッケージとして保存し、再利用を簡単にする機能です。スクリプトやテストを 1 か所で管理し、個人、プライベート、およびチームのワークスペースで再利用することができます。

さっそくやってみる

1.環境構築

まずは前回の記事で、呼び出し前のリクエストの操作と呼び出し後のレスポンスの操作をJavaScriptで行うところまで再現しておきます。
https://qiita.com/KameMan/items/4e5325cd9a9775992897

pre-request
// 任意のヘッダーを設定する(例えば Content-Type)
pm.request.headers.add({ key: 'Content-Type', value: 'application/json' });

// 現在時刻を取得(ISO形式)
const currentDate = new Date().toISOString();  // 例: 2024-12-25T12:34:56.789Z

// リクエストボディを設定(例: JSON形式)
const requestBody = {
    name: "John Doe",
    email: "john.doe@example.com",
    timestamp: currentDate  // 現在時刻を追加
};

// リクエストのボディを設定
pm.request.body.update({
    mode: 'raw',
    raw: JSON.stringify(requestBody)
});

// ログで確認
console.log("Pre-request Script executed, sending data:", requestBody);
post-request
// レスポンスをテキストとして取得
const responseText = pm.response.text();

// 現在時刻を取得(ISO形式)
const currentDate = new Date().toISOString();  // 例: 2024-12-25T12:34:56.789Z

// レスポンスの内容と現在時刻をログに出力
console.log("Response received at " + currentDate + ":", responseText);

2. Package Library の作成

次にpre-requestのスクリプト画面の右側にある<をクリックします。
image.png
image.png

Open package libraryをクリックします。
image.png
Create Packageをクリックし、pre-questと名前を付けます。その後pre-requestのソースをコピーします。
image.png
(ソースは前画面から引き継いで自動でコピーされないので注意してください)
作成ボタンをクリックするとパッケージが作成されます。
image.png
同様の手順でpost-responseも作成可能です。ここで一つ注意点ですが、一つのPackageに挿入可能なスクリプトは1つだけです。 したがってpost-responseは別のPackageとして作成する必要があります。
image.png

3. Packageの再利用

テスト用に再利用を行うAPIコールをコレクションの中で作成します。
image.png
スクリプトタブのpre-requestで、Package Libraryからpre-requestを選択します。
image.png
以下のスクリプトが挿入されます。

pre-request
const preRequest = pm.require('@kameman-6657/pre-request');

先ほどのスクリプトがコピーされるのはなく、Packageを呼び出すスクリプトになっています。実行してみると以下の通りpre-requestのスクリプトが正しく実行されていることがわかります。

POST / HTTP/1.1
Host: reusepackage.requestcatcher.com
Accept: */*
Accept-Encoding: gzip, deflate, br
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 89
Content-Type: application/json
Postman-Token: 6c208d56-6934-467f-9817-a6483eb39010
User-Agent: PostmanRuntime/7.43.0

{"name":"John Doe","email":"john.doe@example.com","timestamp":"2025-01-09T06:17:30.484Z"}

今回のサンプルのように、パッケージに JavaScript コードまたはpmオブジェクト インスタンスのみが含まれ、呼び出し可能な関数やオブジェクトが含まれていない場合はよりシンプルに以下の記載のみでも呼び出し可能です。

pm.require('@kameman-6657/pre-request');

一方関数等を呼び出したい場合は以下のような記載になります。

const preRequest = pm.require('@kameman-6657/pre-request');
prerequest.functionName();

この場合Packageに含めるスクリプトでは以下のように関数をexportしておく必要があります。

// 1. 任意のヘッダーを設定する関数
function setHeader(key, value) {
    pm.request.headers.add({ key: key, value: value });
}

// 2. 現在時刻を取得する関数
function getCurrentTimestamp() {
    return new Date().toISOString();
}

// 3. リクエストボディを設定する関数
function setRequestBody(name, email) {
    const currentDate = getCurrentTimestamp();  // 現在時刻を取得
    const requestBody = {
        name: name,
        email: email,
        timestamp: currentDate  // 現在時刻を追加
    };

    pm.request.body.update({
        mode: 'raw',
        raw: JSON.stringify(requestBody)
    });

    return requestBody; // リクエストボディを返す
}

// メイン処理
function main() {
    // 任意のヘッダー設定(Content-Type)
    setHeader('Content-Type', 'application/json');

    // リクエストボディの設定
    const requestBody = setRequestBody("John Doe", "john.doe@example.com");

    // ログで確認
    console.log("Pre-request Script executed, sending data:", requestBody);
}

function main2() {
    // 任意のヘッダー設定(Content-Type)
    setHeader('Content-Type', 'application/json');

    // リクエストボディの設定
    const requestBody = setRequestBody("kameman", "kameman@example.com");

    // ログで確認
    console.log("Pre-request Script executed, sending data:", requestBody);
}

module.exports = {
    main,main2
}

Discussion