Minding's Programming/Knowledge

[Postman/Github Actions] Github Actions를 통해 API 테스트 자동화하기

Minding 2025. 2. 13. 18:48
728x90
반응형

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를 아래와 같이 바꿔준다.

{{ 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 탭에 진입해 결과를 살펴보면,

위와 같이 테스트가 잘 실행된 것을 확인해볼 수 있다!

728x90