[Postman/Github Actions] Github Actions를 통해 API 테스트 자동화하기
API를 테스트하는 도구로 많은 사람들이 Postman을 사용한다. Postman에서 미리 스크립트를 작성해두면, API에 대한 테스트를 자동화시킬 수 있는데, Github Actions를 이용하면 Github에 배포할 때마다 테스트를 시도하게 할 수 있다.
Postman에서 API 테스트를 자동화하는 방법
API 테스트 예시로 코인 데이터를 수집할 수 있는 Binance API를 사용해보았다. (코인 기본 데이터만 수집할 시 API 키는 필요없다.)
https://github.com/binance/binance-spot-api-docs
GitHub - binance/binance-spot-api-docs: Official Documentation for the Binance Spot APIs and Streams
Official Documentation for the Binance Spot APIs and Streams - GitHub - binance/binance-spot-api-docs: Official Documentation for the Binance Spot APIs and Streams
github.com
Enviroments 설정하기
API는 기본적으로 특정 URL에 요청을 보내는 방식으로 작동하는데, 파라미터가 바뀔 경우마다 요청을 보내는 URL도 계속해서 바뀐다. 이 파라미터들을 환경 변수로 미리 설정해둔다면, 번거로운 작업을 피할 수 있다.
미리 만들어 둔 Collection 페이지로 진입한 뒤, 우측 상단 dropdown 리스트를 펼친 뒤, + 버튼을 클릭하면 새로운 Enviroments를 생성할 수 있다.
Binance API 테스트에 사용할 변수를 미리 만들어 두었다.
- coin_symbols: 테스트할 코인의 심볼 리스트(고정)
- interval: 데이터 수집 주기 (1d(1일), 1m, 1y 등 / 고정)
- coin_symbol, currentIndex, start_timestamp는 테스트 스크립트에서 생성되는 변수로, 뒤에서 설명하겠다.
이후 Collection의 해당 API문서로 돌아와, Params 항목에 환경변수로 지정할 파라미터의 Value를 아래와 같이 바꿔준다.
Test Script 작성하기
이후 Scripts 탭으로 진입해서 테스트 스크립트를 작성한다. 스크립트는 크게 두 가지로 나뉜다.
- Pre-request (요청 전 세팅해야 하는 것)
- Post-response (응답받은 후 실질적인 테스트 코드)
Pre-request
Pre-request 스크립트에서는 주로 API 요청 전 설정해야 할 환경변수들에 대한 코드다. 코드는 javascripts로 작성한다.
let symbols = JSON.parse(pm.environment.get("coin_symbols")); // JSON 문자열 -> 배열로 변환
let index = pm.environment.get("currentIndex") || 0; // 초기값 0으로 설정
let now = new Date();
let yesterday = new Date(now.getTime() - (24 * 60 * 60 * 1000)); // 하루 전 시간 계산
// 어제 날짜를 밀리초 단위 UNIX Timestamp로 변환
let yesterdayTimestamp = yesterday.getTime();
if (index < symbols.length) {
pm.environment.set("coin_symbol", symbols[index]);
pm.environment.set("currentIndex", index + 1);
pm.environment.set("start_timestamp", yesterdayTimestamp);
} else {
pm.environment.set("currentIndex", 0); // 초기화
}
위 코드의 경우에는 조회할 코인의 심볼이 여러 개이기 때문에, indexing(currentIndex)을 통해서 순서대로 coin을 조회하도록 설정했다.(coin_symbol) 또한 1일 전의 날짜를 계산하고, 이를 UNIX Timestamp 형식으로 변환해 start_timestamp 변수에 값을 입력해주었다.
Post-response
Post-response는 응답받은 값을 기준으로 실질적인 테스트가 이루어진다.
// 응답예시
[
[
1739404800000,
"0.79980000",
"0.80390000",
"0.76930000",
"0.78110000",
"50719753.50000000",
1739491199999,
"39749505.64638000",
206845,
"24925356.00000000",
"19531214.66539000",
"0"
]
]
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
pm.test("Response contains valid data", function () {
var jsonData = pm.response.json();
pm.expect(jsonData).to.be.an('array');
pm.expect(jsonData[0]).to.have.lengthOf(12); // Kline 데이터 배열 길이 확인
});
간단하게 2개의 테스트 코드를 작성했다. 첫 번째는 응답코드가 정상(200)인지를 확인하고, 두 번째는 해당 데이터가 array 형태인지와, 데이터 배열의 길이가 12인지를 확인하는 코드다.
데이터 자체에 대해 더 깊게 들어가 테스트해볼 수도 있다. 아래 코드와 같이 데이터의 key를 확인하거나, 타입 확인 또는 값의 크기를 확인해볼 수도 있다.
pm.test("Status code is 200", function () { // 응답 코드 확인 테스트
pm.response.to.have.status(200);
});
pm.test("Response has correct structure and types", function () { // 데이터 구조 및 타입 확인 테스트
let data = pm.response.json();
pm.expect(data).to.be.an('array'); // 응답이 배열인지 확인
pm.expect(data[0]).to.have.keys("Open", "Close", "High", "Low", "Volume", "Date"); // 키 존재 여부 확인
// 데이터 타입 확인
pm.expect(data[0].Open).to.be.a('number');
pm.expect(data[0].Close).to.be.a('number');
pm.expect(data[0].High).to.be.a('number');
pm.expect(data[0].Low).to.be.a('number');
pm.expect(data[0].Volume).to.be.a('string'); // 빈 문자열도 string으로 간주됨
pm.expect(data[0].Date).to.be.a('string');
});
pm.test("Business logic validation", function () { // 데이터 값 확인테스트 (High 기준)
let data = pm.response.json();
// High는 항상 Open, Close, Low보다 크거나 같아야 함
let high = data[0].High;
let open = data[0].Open;
let close = data[0].Close;
let low = data[0].Low;
pm.expect(high).to.be.at.least(open);
pm.expect(high).to.be.at.least(close);
pm.expect(high).to.be.at.least(low);
// Low는 항상 Open, Close보다 작거나 같아야 함
pm.expect(low).to.be.at.most(open);
pm.expect(low).to.be.at.most(close);
});
Test 실행해보기
테스트를 실행해보기 위해서는 해당 Collection의 추가 옵션(...)버튼을 누른 다음 'Run collection'을 클릭한 뒤,
하단의 Run 버튼을 누르면 테스트가 실행된다.
Github Actions으로 Postman CLI 이용한 테스트 자동화하기
위에서 각 Collection 별로 테스트 스크립트 작성을 마치고 실행까지 확인했다면, 이제 Github 배포 시에 자동으로 작동할 수 있도록 설정해보자.
Postman에서는 API를 통해 해당 계정의 Collection에 저장된 테스트 코드들을 실행시킬 수 있다. Github Actions에서 Postman CLI를 사용한다면, collection을 실행시키고 그 결과를 확인할 수 있다.
Postman API Key 발급 & Github Secrets 등록
Postman API를 사용하기 위해서는 API Key를 발급받아야 한다. 링크를 통해 Postman에 접속한 뒤 API KEY를 발급받자.
이후 해당 테스트를 실행시킬 Github Repository에 진입한 후 해당 API KEY를 Secrets에 등록해주어야 한다.
Settings > Secrets and variables > Actions > New repository secrets 경로를 통해 등록해줄 수 있다.
Github Actions로 Postman CLI 실행하기
해당 repository의 Actions 탭으로 이동한다.
New workflow 클릭 (처음 만드는거라면 UI가 다르게 나올 수 있다.)
Github에서 제공하는 여러 확장기능을 사용할 수 있긴하지만, 나는 'set up a workflow yourself'를 통해 직접 코드를 작성했다.
그러면 아래와 같이 .github/workflows 폴더 내 yml 파일을 작성할 수 있는 창이 노출된다.
전체 코드는 아래와 같다.
name: Run Multiple Postman Collections and Save Reports
on:
push:
branches:
- main
jobs:
postman-cli-tests:
runs-on: ubuntu-latest
strategy:
matrix:
config:
- { collection_id: "40443175-0e230280-1eea-45ad-b7e4-2c6316a91b62", environment_id: "40443175-1c302d5e-5930-4579-880f-ce404a2c4b29" }
- { collection_id: "40443175-85560488-42ec-4d0e-b866-fda8ca231b15", environment_id: "40443175-55f8a2ab-0dc1-48a9-8279-59b370c19d78" }
steps:
# 코드 체크아웃
- name: Checkout code
uses: actions/checkout@v2
# Postman CLI 설치
- name: Install Postman CLI
run: |
curl -o- "https://dl-cli.pstmn.io/install/linux64.sh" | sh
# Postman CLI 로그인
- name: Login to Postman CLI
run: |
postman login --with-api-key ${{ secrets.POSTMAN_API_KEY }}
# Postman CLI 실행 및 리포트 생성
- name: Run Collection and Generate Report
run: |
postman collection run ${{ matrix.config.collection_id }} \
--environment ${{ matrix.config.environment_id }}
각 부분을 나눠서 설명하자면, 아래 코드는 workflow와 어떤 상황에 이 workflow를 실행할지를 설정한다.
# 해당 workflow의 이름
name: Run Multiple Postman Collections and Save Reports
# 언제 실행할건지를 설정 - main 브랜치에 push할 때
on:
push:
branches:
- main
아래 코드는 postman CLI에서 test할 항목들을 설정해놓는 파트로, matrix 전략을 통해 해당 작업들을 동시에 실행한다.
여기서 collection_id와 environment_id는 Postman 웹이나 애플리케이션에서 확인할 수 있다.
jobs:
postman-cli-tests:
runs-on: ubuntu-latest
strategy:
matrix:
config:
- { collection_id: "40443175-0e230280-1eea-45ad-b7e4-2c6316a91b62", environment_id: "40443175-1c302d5e-5930-4579-880f-ce404a2c4b29" }
- { collection_id: "40443175-85560488-42ec-4d0e-b866-fda8ca231b15", environment_id: "40443175-55f8a2ab-0dc1-48a9-8279-59b370c19d78" }
아래 코드는 코드를 checkout하고, Postman CLI를 curl 명령을 통해 설치하는 과정이다.
steps:
# 코드 체크아웃
- name: Checkout code
uses: actions/checkout@v2
# Postman CLI 설치
- name: Install Postman CLI
run: |
curl -o- "https://dl-cli.pstmn.io/install/linux64.sh" | sh
아래 코드는 Postman CLI에 위에서 발급받고 secrets에 저장한 API KEY를 이용해 로그인한 후, CLI를 실행하는 부분이다.
# Postman CLI 로그인
- name: Login to Postman CLI
run: |
postman login --with-api-key ${{ secrets.POSTMAN_API_KEY }}
# Postman CLI 실행 및 리포트 생성
- name: Run Collection and Generate Report
run: |
postman collection run ${{ matrix.config.collection_id }} \
--environment ${{ matrix.config.environment_id }}
이렇게 설정한 뒤 Commit Changes를 클릭한다면, main 브랜치에 push되는 것이므로 자동으로 workflow가 실행된다.
그리고 Actions 탭에 진입해 결과를 살펴보면,
위와 같이 테스트가 잘 실행된 것을 확인해볼 수 있다!