0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PostmanとNewmanを用いたAPIレスポンスの保存方法 メモ

Posted at
  • PostmanとNewmanを用いて、複数のAPIリクエストを行い、それらのリクエストに対応付けてレスポンス内容を保存する方法をメモする。

    • 次のようなリクエストとレスポンスから連結データのようなファイルを作りたかった。

      • リクエスト

        POST /user/ HTTP/1.1
        Host: localhost:5000
        Content-Type: application/json
        Content-Length: 75
        
        {
          "email_address": "XYZ@example.com",
          "password": "P@ssw0rd1"
        }
        
      • レスポンス

        {
            "id": "4652d622f8264f628ac9c7c8122b153e"
        }
        
      • 連結データ

        email_address,password,id
        XYZ@example.com,P@ssw0rd1,d71aa50e7ae74f039efe607a9eec634c
        ABCXYZ@example.com,P@ssw0rd2,b770407dd85045c79a365f692ad65356
        

Newman

  • APIリクエスト用ツールPostmanのAPIリクエストjsonファイルをCLIで実行するためのツール

準備

テスト用APIをFastAPIで作成・起動する

  • テスト用APImain.py

    メールアドレス/パスワードを受け取り、IDを返却する。

    from fastapi import FastAPI
    from pydantic import BaseModel
    from typing import List
    import uuid
    app = FastAPI()
    
    class User(BaseModel):
        email_address: str
        password: str
    
    @app.post("/user/")
    def create_user(user: User):
        return {"id": str(uuid.uuid4()).replace("-","")}
    
  • 起動

    uvicorn main:app --reload --port 5000
    
  • リクエスト

    POST /user/ HTTP/1.1
    Host: localhost:5000
    Content-Type: application/json
    Content-Length: 75
    
    {
      "email_address": "XYZ@example.com",
      "password": "P@ssw0rd1"
    }
    
  • レスポンス

    {
        "id": "4652d622f8264f628ac9c7c8122b153e"
    }
    

Postmanでリクエストファイルを作成する

postman.png

  • リクエスト用JSONtest_app.postman_collection.json

GUIで作成したものをエクスポートして取得する。

{
	"info": {
		"_postman_id": "a5eae803-359e-41ed-b3ac-72b896b859b0",
		"name": "test_app",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
	},
	"item": [
		{
			"name": "POST_users",
			"event": [
				{
					"listen": "test",
					"script": {
						"exec": [
							""
						],
						"type": "text/javascript"
					}
				}
			],
			"request": {
				"method": "POST",
				"header": [],
				"body": {
					"mode": "raw",
					"raw": "{\r\n  \"email_address\": \"{{email_address}}\",\r\n  \"password\": \"{{password}}\"\r\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "http://localhost:5000/user/",
					"protocol": "http",
					"host": [
						"localhost"
					],
					"port": "5000",
					"path": [
						"user",
						""
					]
				}
			},
			"response": []
		}
	]
}

テスト用データtest_data.csvを用意する

  • 複数リクエストを行うため、以下のようなテストデータを用意する。
email_address,password
XYZ@example.com,P@ssw0rd1
ABCXYZ@example.com,P@ssw0rd2

Newman実行コードtest.jsを用意する

  • Postmanリクエストファイルtest_app.postman_collection.jsonとテストデータファイルtest_data.csvを読み込み、テスト用APIに対してリクエストを行う。

  • テストデータとAPIレスポンス(id)を連結したCSVファイルを生成する。

    const fs = require('fs');
    const Papa = require('papaparse');
    const newman = require('newman');
    
    newman.run({
        // テスト用リクエストファイル
        collection: require('./test_app.postman_collection.json'),
        reporters: 'cli',
        // テストデータファイル
        iterationData: './test_data.csv'
    }, (error) => {
    	if (error) { 
            throw error; 
        }
        console.log('Collection Run Complete.');
    }).on('beforeDone', (error, data) => {
        if (error) {
            throw error;
        }
        // APIレスポンスに含まれる`id`を取得
        const idList = data.summary.run.executions.reduce((a, c) => {
            a[c.cursor.iteration] = JSON.parse(c.response.stream.toString()).id
            return a;
        }, []);  
        // テストデータにAPI実行結果`id`を連結したファイルを作成
        updateCsvFile(idList);
    });
    
    function updateCsvFile(idList) {
        fs.readFile('./test_data.csv', 'utf8', (error, data) => {
            if (error) {
                throw error;
            }
    
            const jsonData = Papa.parse(data, { header: true });
            jsonData.data.map((item, index) => item.id = idList[index]);
    
            const updatedCsv = Papa.unparse(jsonData.data);
            console.log(updatedCsv);
    
            fs.writeFile('./test_data_updated.csv', updatedCsv, (error) => {
                if (error) {
                    throw error;
                }
                console.log('CSV File Updated');
            });
    
        });
    }
    

動作確認

  • test.js実行

    $ node test.js 
    newman
    
    test_app
    
    Iteration 1/2
    
    → POST_users
      POST http://localhost:5000/user/ [200 OK, 166B, 97ms]
    
    Iteration 2/2
    
    → POST_users
      POST http://localhost:5000/user/ [200 OK, 166B, 18ms]
    
    ┌─────────────────────────┬───────────────────┬──────────────────┐
    │                         │          executed │           failed │
    ├─────────────────────────┼───────────────────┼──────────────────┤
    │              iterations │                 2 │                0 │
    ├─────────────────────────┼───────────────────┼──────────────────┤
    │                requests │                 2 │                0 │
    ├─────────────────────────┼───────────────────┼──────────────────┤
    │            test-scripts │                 2 │                0 │
    ├─────────────────────────┼───────────────────┼──────────────────┤
    │      prerequest-scripts │                 0 │                0 │
    ├─────────────────────────┼───────────────────┼──────────────────┤
    │              assertions │                 0 │                0 │
    ├─────────────────────────┴───────────────────┴──────────────────┤
    │ total run duration: 223ms                                      │
    ├────────────────────────────────────────────────────────────────┤
    │ total data received: 82B (approx)                              │
    ├────────────────────────────────────────────────────────────────┤
    │ average response time: 57ms [min: 18ms, max: 97ms, s.d.: 39ms] │
    └────────────────────────────────────────────────────────────────┘
    Collection Run Complete.
    email_address,password,id
    XYZ@example.com,P@ssw0rd1,17f7604dff124376a8341aff71edbdb2
    ABCXYZ@example.com,P@ssw0rd2,c89cb5d7535547d7ad3f2923431c1760
    CSV File Updated
    
  • 実行結果ファイルtest_data_updated.csv

    email_address,password,id
    XYZ@example.com,P@ssw0rd1,17f7604dff124376a8341aff71edbdb2
    ABCXYZ@example.com,P@ssw0rd2,c89cb5d7535547d7ad3f2923431c1760
    

参考情報

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?