[Postman] REST API 호출 컬렉션을 CLI(Command Line Interface)로 실행하는 방법.

2024. 3. 15. 11:41Tool/postman

728x90
728x90

Newman ?

  • Postman으로 생성한 API 호출 컬렉션을 CLI(Command Line Interface)에서 실행할 수 있는 Node.js 도구.

Newman 기능 설명.

  • Postman 컬렉션 실행: Postman에서 작성한 컬렉션을 커맨드 라인에서 실행할 수 있음.
  • 테스트 결과 보고: 컬렉션 실행 후 테스트 결과를 요약하여 보고서 형식으로 출력할 수 있음.
  • 환경 변수 및 데이터 파일 지원: 환경 변수 및 데이터 파일을 지원하여, 테스트 데이터를 동적으로 변경하고 다양한 환경에서 테스트를 실행할 수 있음.
  • CI/CD 적용: CI/CD 도구(Jenkins, Travis CI, CircleCI, GitLab ...)와 통합하여 테스트를 자동으로 실행하고 결과를 보고할 수 있음.

Postman에서 API 호출 컬렉션을 생성 및 호출하는 방법은 링크를 참고.

 

[Postman] REST API 호출을 그룹화/자동화하는 방법.

Postman ?API를 개발 및 테스트하기 위한 협업 플랫폼.Postman 기능.API 요청/응답 테스트 : 다양한 전문 유형의 API 요청을 보내고 응답을 확인할 수 있음.콜렉션 : API 요청을 그룹/콜렉션으로 구성하여

gomu92.tistory.com


Export Collection.

추출된 *.postman_collection.json 파일을 확인.

  • Collection에서 생성한 내용(request, test script, variable …)이 추출된 것을 확인할 수 있음.
{
	"info": {
		"_postman_id": "8fa003b1-9830-408b-8e18-6873aa288b57",
		"name": "jmapper",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
		"_exporter_id": "14101271"
	},
	"item": [
		{
			"name": "httpPost_stream",
			"request": {
				"method": "POST",
				"header": [],
				"body": {
					"mode": "raw",
					"raw": "N000N001aaatmaxpgwabcdefghij",
					"options": {
						"raw": {
							"language": "text"
						}
					}
				},
				"url": {
					"raw": "http://{{url}}:{{port}}{{path_stream}}",
					"protocol": "http",
					"host": [
						"{{url}}"
					],
					"port": "{{port}}{{path_stream}}"
				}
			},
			"response": []
		},
		{
			"name": "httpPost_json",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "name",
						"value": "parkgunwoo",
						"type": "text"
					},
					{
						"key": "company",
						"value": "tmax",
						"type": "text"
					}
				],
				"body": {
					"mode": "raw",
					"raw": "{\r\n    \"kind_code\":\"N000\",\r\n    \"tx_code\":\"N001\",\r\n    \"date\":\"20210528\",\r\n    \"uid\":\"0123456789\",\r\n    \"body_data\":\"anylink\"\r\n}",
					"options": {
						"raw": {
							"language": "json"
						}
					}
				},
				"url": {
					"raw": "http://{{url}}:{{port}}{{path_json}}",
					"protocol": "http",
					"host": [
						"{{url}}"
					],
					"port": "{{port}}{{path_json}}"
				}
			},
			"response": []
		},
		{
			"name": "httpPost_xml",
			"request": {
				"method": "POST",
				"header": [
					{
						"key": "X-ANYLINK-3.0-APPLCODE",
						"value": "9292",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-ETC",
						"value": "",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-ETC2",
						"value": "",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-FLAG",
						"value": "",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-INSTCODE",
						"value": "G004",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-LOGID",
						"value": "",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-MAGIC",
						"value": "",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-MSGTYPE",
						"value": "101",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-MSGUID",
						"value": "101",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-REQTYPE",
						"value": "11",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-RESVD",
						"value": "",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-SEQNO",
						"value": "",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-KINDCODE",
						"value": "N000",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-TXCODE",
						"value": "N001",
						"type": "text",
						"disabled": true
					},
					{
						"key": "X-ANYLINK-3.0-MAGIC",
						"value": "5555",
						"type": "text",
						"disabled": true
					}
				],
				"body": {
					"mode": "raw",
					"raw": "<Bancassurance>\r\n<HeaderArea>\r\n<HDR_AGT_CODE>12;;;;;</HDR_AGT_CODE>\r\n<HDR_BAK_CLS>0-1</HDR_BAK_CLS>\r\n<HDR_BAK_DOCSEQ>dd</HDR_BAK_DOCSEQ>\r\n<HDR_BAK_EXT>ds</HDR_BAK_EXT>\r\n<HDR_BAK_ID>26</HDR_BAK_ID>\r\n<HDR_BIZ_CODE>N001</HDR_BIZ_CODE>\r\n<HDR_CUR_DOC>asd</HDR_CUR_DOC>\r\n<HDR_DAT_GBN>T</HDR_DAT_GBN>\r\n<HDR_DOC_CODE>N000</HDR_DOC_CODE>\r\n<HDR_DOC_LEN>10</HDR_DOC_LEN>\r\n<HDR_DOC_STATUS>000</HDR_DOC_STATUS>\r\n<HDR_INS_DOCSEQ>ds</HDR_INS_DOCSEQ>\r\n<HDR_INS_EXT>z1</HDR_INS_EXT>\r\n<HDR_INS_ID>1</HDR_INS_ID>\r\n<HDR_RET_CODE>001</HDR_RET_CODE>\r\n<HDR_SND_DATE>20050317</HDR_SND_DATE>\r\n<HDR_SND_TIME>23</HDR_SND_TIME>\r\n<HDR_SYS_ID>11</HDR_SYS_ID>\r\n<HDR_TOT_DOC>23</HDR_TOT_DOC>\r\n<HDR_TRA_FLAG>1</HDR_TRA_FLAG>\r\n<HDR_TRX_ID>123</HDR_TRX_ID>\r\n<HDR_TRX_DATE>123</HDR_TRX_DATE>\r\n</HeaderArea>\r\n<BusinessArea>\r\n<LK_ENTY_NO>123</LK_ENTY_NO>\r\n<LK_PROD_CD>22</LK_PROD_CD>\r\n<LK_INPRD_REAL>22</LK_INPRD_REAL>\r\n<LK_INPRD_TP>test2</LK_INPRD_TP>\r\n<LK_INPRD_TP_VAL>11</LK_INPRD_TP_VAL>\r\n<LK_INSU_GBN>123</LK_INSU_GBN>\r\n<LK_PLCY_BANK>31</LK_PLCY_BANK>\r\n<LK_PROD_CD>76</LK_PROD_CD>\r\n</BusinessArea>\r\n</Bancassurance>",
					"options": {
						"raw": {
							"language": "xml"
						}
					}
				},
				"url": {
					"raw": "http://{{url}}:{{port}}{{path_xml}}",
					"protocol": "http",
					"host": [
						"{{url}}"
					],
					"port": "{{port}}{{path_xml}}"
				}
			},
			"response": []
		},
		{
			"name": "httpPost_name",
			"request": {
				"method": "POST",
				"header": [],
				"body": {
					"mode": "raw",
					"raw": "kind_code=111&tx_code=111&body_data=111",
					"options": {
						"raw": {
							"language": "text"
						}
					}
				},
				"url": {
					"raw": "http://{{url}}:{{port}}{{path_name}}",
					"protocol": "http",
					"host": [
						"{{url}}"
					],
					"port": "{{port}}{{path_name}}"
				}
			},
			"response": []
		},
		{
			"name": "httpPost_del",
			"request": {
				"method": "POST",
				"header": [],
				"body": {
					"mode": "raw",
					"raw": "KINDTD212,A,B,1,a,b,c,C,D,2,a,b,c,d,e,f",
					"options": {
						"raw": {
							"language": "text"
						}
					}
				},
				"url": {
					"raw": "http://{{url}}:{{port}}{{path_del}}",
					"protocol": "http",
					"host": [
						"{{url}}"
					],
					"port": "{{port}}{{path_del}}"
				}
			},
			"response": []
		}
	],
	"event": [
		{
			"listen": "prerequest",
			"script": {
				"type": "text/javascript",
				"exec": [
					""
				]
			}
		},
		{
			"listen": "test",
			"script": {
				"type": "text/javascript",
				"exec": [
					"    // 상태 코드 확인",
					"    pm.test('상태 코드 확인', function () {",
					"        pm.response.to.have.status(200);",
					"    });",
					"",
					"    // 응답 내용 확인",
					"    pm.test('응답 내용 확인', function () {",
					"        pm.expect(pm.response.text()).to.not.be.empty;",
					"    });",
					"",
					"    // 응답 시간 확인",
					"    pm.test('응답 시간 확인', function () {",
					"        pm.expect(pm.response.responseTime).to.be.below(200);",
					"    });"
				]
			}
		}
	]
}

Export Environment.

추출된 *.postman_environment.json 파일을 확인.

{
	"id": "03d4bf26-427f-4aa8-a28d-2f87880125f6",
	"name": "jmapper",
	"values": [
		{
			"key": "url",
			"value": "192.168.115.30",
			"type": "default",
			"enabled": true
		},
		{
			"key": "port",
			"value": "9299",
			"type": "default",
			"enabled": true
		},
		{
			"key": "path_xml",
			"value": "/servlet/xml",
			"type": "default",
			"enabled": true
		},
		{
			"key": "path_json",
			"value": "/servlet/json",
			"type": "default",
			"enabled": true
		},
		{
			"key": "path_stream",
			"value": "/servlet/stream",
			"type": "default",
			"enabled": true
		},
		{
			"key": "path_name",
			"value": "/servlet/name",
			"type": "default",
			"enabled": true
		},
		{
			"key": "path_del",
			"value": "/servlet/del",
			"type": "default",
			"enabled": true
		}
	],
	"_postman_variable_scope": "environment",
	"_postman_exported_at": "2024-03-25T07:22:10.299Z",
	"_postman_exported_using": "Postman/10.24.7"
}

Newman을 설치하는 필자의 서버 정보.

$ hostnamectl
...
  Operating System: CentOS Linux 7 (Core)
            Kernel: Linux 3.10.0-1160.6.1.el7.x86_64
...

Node.js 설치.

$ curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash -
$ sudo yum install -y nodejs

Newman 설치.

$ sudo npm install -g newman
$ newman --version
6.1.2

Postman으로 생성한 API 호출 컬렉션을 커맨드 라인(Command Line Interface)에서 실행.(Newman 실행.)

$ newman run {dir}/{*_collection.json} -e {*_environment.json}
$ newman run ./jmapper.postman_collection.json -e jmapper.postman_environment.json

API 호출 컬렉션을 CLI(Command Line Interface) 실행한 결과.

  • 반복 횟수, 요청 수, 테스트 스크립트 수, 실행 시간, 데이터 수신량, 평균 응답 시간 ... 을 확인할 수 있음.


--reporters …와 --reporter-junit-export … 옵션을 추가하여, Newman 실행.

$ newman run ./jmapper.postman_collection.json -e jmapper.postman_environment.json --reporters cli,junit --reporter-junit-export report.xml

생성된 junit(xml) 형식의 테스트 수행 결과서(report.xml)를 확인.

$ cat report.xml 
<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="jmapper" tests="5" time="0.536">
  <testsuite name="httpPost_stream" id="202d703b-e01c-46ba-b350-db12cac61d20" timestamp="2024-03-27T10:49:43.161Z" tests="3" failures="0" errors="0" time="0.125">
    <testcase name="상태 코드 확인" time="0.125" classname="Jmapper"/>
    <testcase name="응답 내용 확인" time="0.125" classname="Jmapper"/>
    <testcase name="응답 시간 확인" time="0.125" classname="Jmapper"/>
  </testsuite>
  <testsuite name="httpPost_json" id="82e437fe-2497-4105-a994-46a732f38042" timestamp="2024-03-27T10:49:43.161Z" tests="3" failures="0" errors="0" time="0.086">
    <testcase name="상태 코드 확인" time="0.086" classname="Jmapper"/>
    <testcase name="응답 내용 확인" time="0.086" classname="Jmapper"/>
    <testcase name="응답 시간 확인" time="0.086" classname="Jmapper"/>
  </testsuite>
  <testsuite name="httpPost_xml" id="e7219a34-bbda-4b5e-b03e-e929e4f59011" timestamp="2024-03-27T10:49:43.161Z" tests="3" failures="0" errors="0" time="0.174">
    <testcase name="상태 코드 확인" time="0.174" classname="Jmapper"/>
    <testcase name="응답 내용 확인" time="0.174" classname="Jmapper"/>
    <testcase name="응답 시간 확인" time="0.174" classname="Jmapper"/>
  </testsuite>
  <testsuite name="httpPost_name" id="717e38a9-13dc-4b83-a301-fd4fe199167b" timestamp="2024-03-27T10:49:43.161Z" tests="3" failures="0" errors="0" time="0.063">
    <testcase name="상태 코드 확인" time="0.063" classname="Jmapper"/>
    <testcase name="응답 내용 확인" time="0.063" classname="Jmapper"/>
    <testcase name="응답 시간 확인" time="0.063" classname="Jmapper"/>
  </testsuite>
  <testsuite name="httpPost_del" id="0528d457-7bf4-42b0-b7a3-dcc27d6d424e" timestamp="2024-03-27T10:49:43.161Z" tests="3" failures="0" errors="0" time="0.088">
    <testcase name="상태 코드 확인" time="0.088" classname="Jmapper"/>
    <testcase name="응답 내용 확인" time="0.088" classname="Jmapper"/>
    <testcase name="응답 시간 확인" time="0.088" classname="Jmapper"/>
  </testsuite>
</testsuites>
728x90
728x90

'Tool > postman' 카테고리의 다른 글

[Postman] REST API 호출을 그룹화/자동화하는 방법.  (0) 2024.03.12