DEV Community

Cover image for Apidog에서 API 테스트 시나리오에 If/Else 조건 분기 및 흐름 제어 추가하기
Rihpig
Rihpig

Posted on • Originally published at apidog.com

Apidog에서 API 테스트 시나리오에 If/Else 조건 분기 및 흐름 제어 추가하기

대부분의 API 테스트는 로그인 → 결제 → 영수증 조회처럼 직선으로 실행됩니다. 하지만 로그인 호출이 401을 반환했다면 결제 요청을 계속 실행할 이유가 없습니다. 후속 요청의 실패가 실제 원인인 로그인 실패를 가리면 디버깅도 어려워집니다. 필요한 것은 이전 응답을 확인하고, 결과에 따라 다음 단계를 결정하며, 실패 지점을 정확히 보고하는 테스트 시나리오입니다.

지금 Apidog를 사용해 보세요

이 글에서는 Apidog의 테스트 시나리오에서 조건부 분기(if/else)를 구성하는 방법을 다룹니다. 로그인 응답의 상태 코드를 확인한 뒤, 로그인에 성공했을 때만 결제 요청을 실행하는 흐름을 만들어 보겠습니다. Apidog 시나리오가 처음이라면 먼저 Apidog로 테스트 시나리오를 작성하는 방법을 확인하세요. 조건문 자체의 개념은 MDN 조건문 가이드도 참고할 수 있습니다.

흐름 제어란 무엇인가

Apidog의 자동화 테스트는 테스트 모듈에서 구성합니다. 작업 단위는 테스트 시나리오이며, Postman의 컬렉션과 유사합니다.

시나리오에는 다음과 같은 테스트 단계를 추가할 수 있습니다.

Apidog 흐름 제어 화면

흐름 제어를 사용하면 요청을 단순히 순서대로 실행하는 대신, 이전 단계의 결과에 따라 다음 실행 경로를 바꿀 수 있습니다. Apidog 흐름 제어 및 조건부 분기 문서에서 각 요소의 설정 항목을 확인할 수 있습니다.

이 글에서 사용할 조건부 분기(Conditional Branching) 는 Apidog의 if/else 기능입니다.

조건이 참이면  → If 블록 실행
조건이 거짓이면 → Else 블록 실행
Enter fullscreen mode Exit fullscreen mode

조건부 분기와 루프는 목적이 다릅니다.

기능 용도
조건부 분기 단계 블록을 실행할지 한 번 결정
루프 같은 블록을 여러 번 반복 실행

예를 들어 주문 ID 배열을 순회해야 한다면 분기 대신 ForEach 루프를 사용해야 합니다. 자세한 내용은 ForEach 루프 튜토리얼을 참고하세요.


로그인 응답에 따라 분기하는 시나리오 만들기

이 글에서 만들 흐름은 다음과 같습니다.

로그인 요청
  ├─ 상태 코드가 200이면 → 결제 요청 실행
  └─ 상태 코드가 200이 아니면 → 실패 기록 후 중지
Enter fullscreen mode Exit fullscreen mode

1단계: 테스트 시나리오 생성

  1. Apidog에서 테스트 모듈로 이동합니다.
  2. 검색창 옆의 + 버튼을 클릭합니다.
  3. 새 테스트 시나리오를 생성할 디렉터리를 선택합니다.
  4. 우선순위를 설정하고 시나리오를 생성합니다.

이제 요청과 흐름 제어 단계를 추가할 수 있는 빈 시나리오가 준비됩니다.

2단계: 로그인 요청 추가

첫 번째 테스트 단계로 로그인 요청을 추가합니다.

Apidog에서는 다음 방식으로 요청을 추가할 수 있습니다.

  • 기존 엔드포인트 정의에서 가져오기
  • 저장된 엔드포인트 케이스에서 가져오기
  • 사용자 정의 요청 추가
  • cURL 명령에서 가져오기

빠르게 시작하려면 사용자 정의 요청을 추가하고 다음과 같이 설정합니다.

POST https://api.your-store.com/v1/login
Content-Type: application/json

{
  "email": "dana@example.com",
  "password": "correct-horse-battery-staple"
}
Enter fullscreen mode Exit fullscreen mode

먼저 로그인 단계만 실행해 예상한 응답이 반환되는지 확인합니다. 성공한 로그인 응답은 일반적으로 상태 코드 200과 토큰을 포함합니다.

{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "userId": "usr_10482"
}
Enter fullscreen mode Exit fullscreen mode

3단계: 오케스트레이션 모드 열기

시나리오의 아무 단계나 클릭해 오케스트레이션 모드로 이동합니다.

  • 왼쪽 패널: 전체 시나리오 흐름
  • 오른쪽 패널: 선택한 단계의 설정

단계를 재정렬해야 한다면 단계의 아이콘을 드래그합니다.

4단계: 조건부 분기 추가

  1. 단계 추가를 클릭합니다.
  2. 메뉴에서 조건부 분기를 선택합니다.
  3. 생성된 If 블록에 조건을 설정합니다.

이 예제에서는 로그인 응답 상태 코드가 200인지 검사합니다.

로그인 응답 상태 코드 == 200
Enter fullscreen mode Exit fullscreen mode

Apidog 조건 빌더에서 사용할 수 있는 대표 연산자는 다음과 같습니다.

  • 같음 / 같지 않음
  • 존재함 / 존재하지 않음
  • 작음 / 작거나 같음
  • 큼 / 크거나 같음
  • 정규식과 일치함
  • 포함함 / 포함하지 않음
  • 비어 있음 / 비어 있지 않음
  • 목록에 있음 / 목록에 없음

5단계: 이전 로그인 응답 참조하기

조건에서 이전 단계의 값을 읽는 방법은 두 가지입니다.

방법 1: 이전 단계 데이터 검색 사용

조건 값 필드를 클릭한 뒤 마법봉 아이콘을 선택하고 이전 단계 데이터 검색을 클릭합니다. 로그인 단계를 지정한 후 상태 코드 또는 응답 본문의 값을 선택합니다.

Apidog는 내부적으로 다음과 같은 이전 단계 참조 문법을 사용합니다.

{{$.<단계 ID>.response.body.<필드 경로>}}
Enter fullscreen mode Exit fullscreen mode

예를 들어 로그인 단계 ID가 1이고 토큰을 참조하려면 다음과 같이 작성합니다.

{{$.1.response.body.token}}
Enter fullscreen mode Exit fullscreen mode

이전 단계 데이터 검색 화면

이전 단계 데이터 검색을 사용할 때는 다음을 확인하세요.

  • 이 기능은 API 모듈이 아니라 테스트 모듈에서만 동작합니다.
  • 개별 단계 실행이 아니라 전체 시나리오 실행 시에만 이전 단계 값이 해석됩니다.

단일 로그인 단계만 실행했을 때 참조값이 비어 있어도 정상입니다. 전체 시나리오를 실행해야 이전 응답이 채워집니다.

방법 2: 변수 추출 사용

로그인 요청의 후처리기에 변수 추출 액션을 추가할 수도 있습니다.

예를 들어 응답 토큰을 JSONPath로 추출합니다.

JSONPath: $.token
변수 이름: token
Enter fullscreen mode Exit fullscreen mode

이후 시나리오의 다른 단계에서는 다음처럼 사용할 수 있습니다.

{{token}}
Enter fullscreen mode Exit fullscreen mode

이 방식은 여러 분기 또는 여러 모듈에서 같은 값을 재사용할 때 유용합니다. 자세한 방법은 테스트 단계 간 데이터 전달 방법을 참고하세요.

상태 코드만 확인하는 현재 시나리오에서는 이전 단계 데이터 검색이 가장 간단한 방법입니다.

6단계: Else 분기 추가

If 블록 위에 마우스를 올리고 + Else를 클릭합니다.

이제 다음 두 경로를 구성합니다.

If 블록: 결제 요청 실행

로그인 상태 코드가 200일 때만 실행될 결제 요청을 추가합니다.

결제 API가 로그인 토큰을 요구한다면 Authorization 헤더에서 추출한 변수를 사용합니다.

POST https://api.your-store.com/v1/payments
Authorization: Bearer {{token}}
Content-Type: application/json

{
  "amount": 2500,
  "currency": "KRW"
}
Enter fullscreen mode Exit fullscreen mode

또는 이전 단계 참조를 직접 사용할 수 있습니다.

Authorization: Bearer {{$.1.response.body.token}}
Enter fullscreen mode Exit fullscreen mode

이는 Stripe API 문서의 인증 요청과 같은 베어러 토큰 패턴입니다.

Else 블록: 실패를 명확하게 기록

로그인이 실패했을 때는 결제 요청을 실행하지 않아야 합니다. Else 블록에는 다음 중 하나를 추가합니다.

  • 로그 수집 또는 알림 엔드포인트 호출
  • 항상 실패하는 어설션을 포함한 사용자 정의 요청
  • 실패 원인을 표시하는 검증 단계

핵심은 시나리오 결과에서 로그인 실패가 원인이라는 점이 분명하게 드러나도록 만드는 것입니다.

완성된 논리는 다음과 같습니다.

if 로그인 상태 코드 == 200:
    결제 요청 실행
else:
    실패 기록 후 중지
Enter fullscreen mode Exit fullscreen mode

7단계: 저장 및 실행

모두 저장을 클릭해 변경 사항을 저장합니다.

저장되지 않은 변경 사항은 점 표시기로 나타납니다. 점이 남아 있다면 아직 저장할 내용이 있다는 뜻입니다.

전체 시나리오를 실행해 두 경로를 모두 확인하세요.

  • 올바른 자격 증명 사용 → If 블록에서 결제 요청 실행
  • 잘못된 자격 증명 사용 → Else 블록 실행

변형 및 고급 흐름 제어

기본 분기를 구성했다면 같은 방식으로 더 다양한 조건을 처리할 수 있습니다.

응답 본문 필드로 분기

상태 코드뿐 아니라 응답 본문의 모든 참조 가능한 값으로 분기할 수 있습니다.

예를 들어 로그인 API가 잠긴 계정에도 200을 반환하고, 실제 계정 상태를 status 필드에 제공한다고 가정해 보겠습니다.

{
  "status": "active",
  "token": "..."
}
Enter fullscreen mode Exit fullscreen mode

조건에서 다음 값을 참조합니다.

{{$.1.response.body.status}}
Enter fullscreen mode Exit fullscreen mode

그리고 다음 조건을 구성합니다.

{{$.1.response.body.status}} == "active"
Enter fullscreen mode Exit fullscreen mode

다른 예시도 가능합니다.

잔액 > 0
역할이 ["admin", "operator"] 목록에 있음
오류 메시지에 "locked" 포함
Enter fullscreen mode Exit fullscreen mode

분기와 ForEach 루프 결합

분기와 루프를 함께 사용할 수 있습니다.

예를 들어 상품 ID 배열을 순회하면서 재고가 없는 상품만 건너뛰려면 다음과 같은 구조를 사용할 수 있습니다.

ForEach 상품:
  if 재고 수량 > 0:
    주문 처리
  else:
    건너뛰기 또는 로그 기록
Enter fullscreen mode Exit fullscreen mode

ForEach 루프에서 사용할 수 있는 참조는 다음과 같습니다.

루프 인덱스: {{$.<루프 단계 ID>.index}}
현재 요소:   {{$.<루프 단계 ID>.element.<필드 경로>}}
Enter fullscreen mode Exit fullscreen mode

인덱스는 0부터 시작합니다. 자세한 구성 방법은 ForEach 루프 튜토리얼을 확인하세요.

분기와 루프 예시

Break If로 루프 조기 종료

반복 중 특정 조건이 충족되면 더 이상 요청을 실행하지 않도록 Break If 조건을 사용할 수 있습니다.

예를 들면 다음과 같습니다.

ForEach 주문:
  주문 상태 조회
  if 상태 == "cancelled":
    Break If
Enter fullscreen mode Exit fullscreen mode

Break If 조건은 루프 안에 여러 번 추가할 수 있으며, 드래그로 위치를 변경할 수 있습니다.

On Error로 루프 오류 처리

루프 시작 부분에는 이동할 수 없는 On Error 요소가 있습니다. 루프 내부 요청이 실패했을 때의 동작을 설정합니다.

옵션 동작
무시 다음 요청을 계속 실행
계속 현재 반복의 나머지 요청을 건너뛰고 다음 반복으로 이동
실행 중단 루프를 중단하고 이후 단계로 진행
실행 종료 전체 시나리오 종료

요청 사이에 대기 추가

쓰기 요청 직후 읽기 요청을 보내면 다운스트림 시스템이 아직 변경 사항을 반영하지 못했을 수 있습니다.

이 경우 대기 요소를 추가해 밀리초 단위 지연을 설정합니다.

생성 요청
→ 1000ms 대기
→ 생성 결과 조회
Enter fullscreen mode Exit fullscreen mode

스크립트에서 이전 단계 값 사용

조건 빌더만으로 처리하기 어려운 로직은 전처리기 또는 후처리기 스크립트에서 계산할 수 있습니다.

스크립트 안에서는 {{변수}} 문법을 직접 사용할 수 없습니다. 대신 pm.variables.get()을 사용합니다.

const token = pm.variables.get("$.2.response.body.token");
Enter fullscreen mode Exit fullscreen mode

단계 ID와 필드 경로가 실제 시나리오와 일치해야 합니다. 더 복잡한 요청 연결 패턴은 요청 연결API 테스트 오케스트레이션 및 데이터 전달 가이드에서 확인할 수 있습니다.

시나리오는 자기 자신을 참조할 수 없습니다. 이는 중첩된 시나리오에서 의도하지 않은 무한 루프를 방지하기 위한 보호 장치입니다.


Apidog CLI로 CI에서 실행하기

앱에서 만든 시나리오는 CI 환경에서도 실행할 수 있습니다. Apidog CLI를 설치하고 액세스 토큰으로 로그인합니다.

npm install -g apidog-cli
apidog login --with-token <YOUR_ACCESS_TOKEN>
Enter fullscreen mode Exit fullscreen mode

그런 다음 테스트 시나리오 ID와 환경 ID를 지정해 실행합니다.

apidog run --access-token $APIDOG_ACCESS_TOKEN -t <scenario_id> -e <env_id> -r cli
Enter fullscreen mode Exit fullscreen mode

옵션의 의미는 다음과 같습니다.

옵션 설명
-t 테스트 시나리오 ID
-e 환경 ID
-r 리포터

리포터는 목적에 따라 선택합니다.

# 콘솔 출력
-r cli

# HTML 및 JUnit 리포트 동시 생성
-r html,junit

# HTML 리포트와 콘솔 출력 동시 사용
-r html,cli
Enter fullscreen mode Exit fullscreen mode

CLI에서도 앱과 동일하게 분기가 처리됩니다.

  1. 로그인 응답을 읽습니다.
  2. 조건이 참이면 If 경로를 실행합니다.
  3. 조건이 거짓이면 Else 경로를 실행합니다.
  4. 종료 코드는 시나리오 결과를 반영합니다.

즉, 로그인 실패가 시나리오 실패로 처리되도록 구성했다면 CI 빌드도 실패합니다.

설치는 Apidog CLI 설치 가이드, GitHub Actions 연결은 Apidog CLI GitHub Actions 가이드에서 확인할 수 있습니다. 정기 실행이 필요하다면 Apidog에서 API 테스트를 예약하는 방법을 참고하세요.


자주 묻는 질문

조건부 분기와 루프의 차이는 무엇인가요?

조건부 분기는 조건에 따라 단계 블록을 한 번 실행할지 결정합니다. 루프는 블록을 반복 실행합니다.

로그인이 성공했을 때만 결제를 실행하는 경우에는 분기를 사용합니다. 배열의 모든 주문 또는 상품에 대해 같은 요청을 반복해야 한다면 For 또는 ForEach 루프를 사용합니다. 반복 처리 예시는 ForEach 루프 튜토리얼에서 확인할 수 있습니다.

이전 단계 데이터 검색 참조가 비어 있는 이유는 무엇인가요?

다음 두 가지를 확인하세요.

  1. 이전 단계 데이터 검색은 API 모듈이 아니라 테스트 모듈에서 동작합니다.
  2. 단일 단계 실행이 아니라 전체 테스트 시나리오를 실행해야 이전 단계 값이 해석됩니다.

상태 코드 외에 응답 본문 필드로도 분기할 수 있나요?

가능합니다. 이전 단계 표현식으로 응답 필드를 참조하거나, 값을 변수로 추출해 조건에서 사용합니다.

{{$.1.response.body.status}} == "active"
Enter fullscreen mode Exit fullscreen mode

같음, 포함, 목록에 있음 등의 연산자를 적용할 수 있습니다. 데이터 전달 방법은 테스트 단계 간 데이터 전달 방법에서 확인하세요.

스크립트에서 변수를 참조하려면 어떻게 하나요?

전처리기 또는 후처리기 스크립트에서는 {{변수}}를 직접 사용할 수 없습니다. 대신 다음처럼 pm.variables.get()을 사용합니다.

const token = pm.variables.get("$.2.response.body.token");
Enter fullscreen mode Exit fullscreen mode

조건부 분기에 별도 요금제나 자체 호스팅 환경이 필요한가요?

Apidog 문서에서는 흐름 제어, 조건부 분기, 루프, 단계 간 데이터 전달에 대한 별도 요금제 제한이나 클라우드와 자체 호스팅 간 차이를 명시하지 않습니다. 테스트 시나리오를 만들 수 있다면 분기 단계도 추가할 수 있습니다.


마무리

선형 테스트는 실패했다는 사실만 알려줄 수 있습니다. 반면 조건부 분기를 적용하면 어느 단계에서 실패했는지 명확히 확인하고, 성공할 수 없는 후속 요청의 실행도 막을 수 있습니다.

구성 순서는 간단합니다.

  1. 조건부 분기 단계를 추가합니다.
  2. 이전 단계 데이터 검색 또는 추출 변수를 사용해 이전 응답을 전달합니다.
  3. If 블록에 성공 경로를 추가합니다.
  4. + Else 블록에 실패 처리 경로를 추가합니다.
  5. Apidog CLI로 같은 시나리오를 CI에서 실행합니다.

Apidog를 무료로 사용해 보고, 단순한 선형 테스트를 실제 API 흐름에 맞는 의사결정 시나리오로 확장해 보세요.

Top comments (0)