...
Postman 스크립트
포스트맨은 Node.js 기반의 런타임을 포함하고 있어, Request와 Collection에 동적으로 동작을 추가할 수 있다.
이를 통해 동적 매개변수를 사용하거나 요청 간에 데이터를 전달하는 것이 가능하다.
이런 동적 작업을 수행하는 다음 2가지 이벤트 흐름에 대해 자바스크립트 코드를 작성할 수 있다.
- Pre-request Script : Request 헤더에 key를 추가시키거나, URL 매개변수에 문자열을 추가하고자 할 때 사용 (요청이 서버로 가기 전에 실행)
- Test Script : .test 함수를 사용하고, .response, .expect 객체 등에 접근이 가능함 (요청이 서버로 간 이후 응답이 반환된 후에 실행)
Pre-request script와 Tests script는 collection, folder 그리고 collection 내의 request 각각에 대해 작성이 가능하며, 그러므로 아래와 같이 실행 순서가 존재한다.
Pre-request Script
Pre-request Script 는 요청이 전송되기 전에 실행되는 스크립트로, Request 헤더에 헤더값를 포함시키거나, URL 매개변수에 임의의 영숫자 문자열을 추가하고자 할 때 사용할 수 있다.
예를 들어 Request 헤더에 환경변수 값을 포함시켜서 요청하고자 한다면, 아래와 같이 작성할 수 있다.
먼저 request 메뉴에서 Pre-request Script 섹션에 들어산다. 그리고 우측의 Snippets 리스트에서 클릭하면 pm.스크립트가 자동완성된다.
pm.sendRequest("https://jsonplaceholder.typicode.com/posts", function (err, response) {
const data = response.json();
pm.environment.set("variable_key", data[0].title);
console.log(data[0].title);
});
포스트맨 환경변수 설정은 다음 글 을 참고 하길 바란다.
요청 헤더를 보기위해 Send 버튼을 바로 누르지 말고 다음과 같이 전체 컬렉션 Run을 실행한다.
위와 같이 request header에 variable_key 라는 환경변수 값이 잘 들어가 있음을 확인할 수 있다.
그리고 코드에 있는 console.log 를 보려면 포스트맨 콘솔창을 띄우면 볼수 있다.
Test Script
test scripts는 요청에 대한 응답을 받은 후에 실행되는 코드로, pre-request script와 달리 pm.response 객체에 대한 액세스가 허용된다.
따라서 응답에 대한 테스트 스크립트를 작성하여 해당 요청에 대한 결과가 의도한 대로 왔는지 검증할 수 있다.
예를들어 상태 코드가 올바르게 왔는지, 응답의 내용이 제대로 왔는지, 원하는 변수가 사용 중인지 등 테스트하고자 하는 만큼 테스트 코드를 추가할 수 있다.
pm.test("response is ok", function () {
pm.response.to.have.status(200);
});
pm.test("response body has json with form data", function () {
var jsonData = pm.response.json();
pm.expect(jsonData[0].userId).to.eql(1);
});
테스트 스크립트를 작성하고 Send 버튼을 누르면 테스트 결과가 나온다.
각 리퀘스트별로 test script가 아닌 컬렉션이나 폴더 자체에도 테스트 스크립트를 작성할 수 있으며, 이 경우 테스트 스크립트는 모든 요청 각 각에 대해서 응답이 돌아온 후 실행되게 된다.
포스트맨 스크립트 샘플
포스트맨 공식 스크립트 문서는 다음 링크에 들어가면 된다.
그중에, 자주 사용하는 쓸모있는 몇몇 postman test script들을 공유해 본다.
// Postman 전체에서 사용 가능한 파라미터 값 얻음
pm.environment.get('variable_key');
// 전역 파라미터 값 얻기
pm.globals.get('variable_key');
// Collection 안에서 사용 가능한 파라미터 값 얻기
pm.variables.get('variable_key');
// Postman 전체에서 사용 가능한 파라미터 값 설정
pm.environment.set('variable_key', 'variable_value');
// 전역 파라미터 값 설정
pm.globals.set('variable_key', 'variable_value');
// Postman 전체에서 사용 가능한 파라미터 삭제
pm.environment.unset('variable_key');
// 전역 파라미터 삭제
pm.globals.unset('variable_key');
// API 호출
pm.sendRequest('https://postman-echo.com/get', function (err, response) {
console.log(response.json());
});
// Http 코드가 200인지 확인
pm.test('Status code is 200', function () {
pm.response.to.have.status(200);
});
// 응답 결과 중 원하는 단어 포함 여부 확인
pm.test('Body matches string', function () {
pm.expect(pm.response.text()).to.include('string_you_want_to_search');
});
// 응답 결과가 원하는 결과인지 확인
pm.test('Body is correct', function () {
pm.response.to.have.body('response_body_string');
});
// 응답 header 중 원하는 타입이 있는지 확인함.
pm.test('Content-Type is present', function () {
pm.response.to.have.header('Content-Type');
});
// 응답 시간이 200ms이하인지 확인
pm.test('Response time is less than 200ms', function () {
pm.expect(pm.response.responseTime).to.be.below(200);
});
// http 코드가 201, 202 중 하나인지 확인
pm.test('Successful POST request', function () {
pm.expect(pm.response.code).to.be.oneOf([201, 202]);
});
// 응답 코드에 원하는 단어 포함 여부 확인
pm.test('Status code name has string', function () {
pm.response.to.have.status('Created');
});
// XML을 JSON으로 변환
var jsonObject = xml2Json(responseBody);
// 응답 값인 JSON 데이터데 원하는 Schema 여부 확인
var schema = {
items: {
type: 'boolean',
},
};
var data1 = [true, false];
var data2 = [true, 123];
pm.test('Schema is valid', function () {
pm.expect(tv4.validate(data1, schema)).to.be.true;
pm.expect(tv4.validate(data2, schema)).to.be.true;
});
// base64로 인코딩된 데이터 디코드
var intermediate,
base64Content, //인코딩 데이터가 있다고 가정
rawContent = base64Content.slice('data:application/octet-stream;base64,'.length);
intermediate = CryptoJS.enc.Base64.parse(base64content);
pm.test('Contents are valid', function(){
pm.expect(CryptoJS.enc.Utf8.stringify(intermediate)).to.be.true;
});
// request 값을 변수로 저장하기
pm.test("Save custom chart name", function () {
var jsonData = JSON.parse(request.data);
postman.setEnvironmentVariable("customChartId",jsonData.id)
});
// response 값을 변수로 저장하기
pm.test("Have chatbot id", function () {
var jsonData = pm.response.json();
console.log(jsonData);
pm.expect(jsonData.result).to.have.property('id');
});
pm.test("Save chatbot id", function () {
var jsonData = pm.response.json();
postman.setEnvironmentVariable("customChartId",jsonData.result.id);
});
// 환경변수와 response 값 비교하기
pm.test("Is equal chatbot id", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.result.id).to.eql(pm.environment.get("projectId"));
});
// 데이터 타입 확인
const responseJson = pm.response.json();
pm.test("Test data type of the response", () => {
pm.expect(responseJson).to.be.an("array");
pm.expect(responseJson[0].id).to.be.a("number");
pm.expect(responseJson[0].address).to.be.an("object");
pm.expect(responseJson[0].name).to.be.a("string");
});
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.