API(Application Programming Interface)는 애플리케이션 간의 통신을 가능하게 해주는 중요한 요소이다. QA 엔지니어로서 API 테스트는 시스템의 안정성과 신뢰성을 확인하기 위한 핵심 업무 중 하나이다. Postman은 이러한 API 테스트를 손쉽게 수행할 수 있는 도구로, 다양한 기능을 제공한다. 이번 포스팅에서는 실무에서 Postman을 활용하여 API 테스트를 수행하는 방법과 직접 경험했던 몇 가지 사례를 소개해 보겠다.
요청 생성
GET, POST, PUT, DELETE 등 다양한 HTTP 메서드 요청을 생성 가능
환경 변수 관리
개발, 스테이징, 프로덕션 환경을 쉽게 전환하며 테스트 가능
테스트 스크립트 작성
JavaScript 기반의 테스트 스크립트를 통해 자동화 가능
컬렉션 관리
여러 요청을 그룹화하여 관리 및 공유 가능
성능 테스트
응답 시간 측정 및 부하 테스트 가능
pm 객체
pm
은 Postman Sandbox에서 제공하는 전역 객체로, 요청 및 응답 데이터를 다루고 테스트 스크립트를 실행할 수 있다.
주요 기능
pm.test
: 테스트 케이스 정의
pm.expect
: 테스트 조건 작성
pm.response
: API 응답 데이터 접근
pm.response
pm.response
는 응답 데이터와 관련된 정보를 제공한다.
pm.response.json()
: JSON 형식의 응답 데이터를 반환
pm.response.to.have.status
: 응답 상태 코드를 검증
pm.expect
pm.expect
는 테스트 조건을 작성하는 데 사용된다. Chai.js 라이브러리를 기반으로 동작하며, 다양한 assertion을 제공한다.
pm.expect(pm.response.responseTime).to.be.below(200);
목적
예제)
POST /auth/login
{
"username": "test_user",
"password": "passwd123!"
}
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
pm.test("Response contains token", function () {
const jsonData = pm.response.json();
pm.expect(jsonData).to.have.property('token');
pm.expect(jsonData.token).to.be.a('string');
});
검증 사항
상태 코드가 200인지 확인
응답에 token 필드가 포함되어 있는지 확인
CRUD(Create, Read, Update, Delete) API는 리소스를 관리하기 위한 기본적인 작업
이다.
Postman을 활용하여 각 단계별로 테스트를 진행한다.
리소스 생성 (POST)
요청
POST /api/items { "name": "New Item", "description": "Item description" }
테스트 스크립트
pm.test("Status code is 201", function () { pm.response.to.have.status(201); }); pm.test("Response contains item ID", function () { const jsonData = pm.response.json(); pm.expect(jsonData).to.have.property('id'); });
리소스 조회 (GET)
요청
GET /api/items/1
테스트 스크립트
pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); pm.test("Response contains correct item details", function () { const jsonData = pm.response.json(); pm.expect(jsonData.name).to.eql("New Item"); });
리소스 수정 (PUT)
요청
PUT /api/items/1 { "name": "Updated Item" }
테스트 스크립트
pm.test("Status code is 200", function () { pm.response.to.have.status(200); }); pm.test("Response reflects updated item details", function () { const jsonData = pm.response.json(); pm.expect(jsonData.name).to.eql("Updated Item"); });
리소스 삭제 (DELETE)
요청
DELETE /api/items/1
테스트 스크립트
pm.test("Status code is 204", function () { pm.response.to.have.status(204); });
목적
API가 비정상적인 입력 값에 대해 올바르게 처리하고, 적절한 오류 메시지를 반환하는지 확인
경계값 테스트
요청
POST /api/users { "username": "a-very-long-username-that-exceeds-the-limit" }
테스트 스크립트
pm.test("Response rejects too long input", function () { pm.response.to.have.status(400); const jsonData = pm.response.json(); pm.expect(jsonData.message).to.include("exceeds maximum length"); });
잘못된 요청 테스트
요청POST /api/users { "username": "" }
테스트 스크립트
pm.test("Missing fields return 400", function () { pm.response.to.have.status(400); });
📌 잘못된 요청 테스트의 목적
위의 경우, 빈 문자열이 유효한 값으로 처리되지 않는다는 것을 확인하기 위한 테스트이다.
서버는 사용자 이름이 반드시 존재해야 한다는 요구사항을 충족하지 못했기 때문에 오류 메시지와 함께 400 Bad Request 응답을 반환해야 하는 것이다.
목적
API의 응답 시간이 SLA(Service Level Agreement)를 충족하는지 확인
성능 테스트
테스트 스크립트
pm.test("Response time is less than 200ms", function () { pm.expect(pm.response.responseTime).to.be.below(200); });
부하 테스트
Postman의 Collection Runner 또는 Newman을 사용하여 다수의 요청을 빠르게 실행하고 API의 처리 능력을 검증
Postman은 강력한 API 테스트 도구로, QA 엔지니어가 다양한 테스트를 쉽게 수행할 수 있도록 도와준다. 실무 사례를 구체적으로 들 수는 없지만 오늘 포스팅한 내용들이 주로 실무에서 사용되는 Postman의 기능인 것 같다. API의 신뢰성을 높이고 테스트를 자동화함으로써 더 효율적인 QA 업무를 수행해 보도록 하자 :)
오 저도 안그래도 postman을 사용해서 api 자동화를 이루고 싶었는데 실무에서도 손쉽게 적용 할 수 있을까요?