테스트 시나리오에 흐름 제어 조건(루프, 조건, 대기, 그룹화 등)을 추가할 수 있습니다. 이를 통해 더 복잡한 테스트 시나리오/프로세스 구성을 더욱 효과적으로 활용할 수 있으며, 궁극적으로 자동화된 테스트 기능을 통해 복잡한 시나리오의 테스트 과제를 해결할 수 있습니다.For 루프#
하나의 요청을 연속으로 여러 번 보내야 하는 경우, for 루프를 사용하는 것이 효율적인 방법입니다. Apidog 테스트 시나리오에서 for 루프를 효과적으로 사용하는 방법은 다음과 같습니다.반복 횟수 설정: 루프가 몇 번 실행되어야 하는지 결정합니다. 고정된 숫자 또는 {{variable}}일 수 있습니다.
요청 추가: for 루프 내에는 하나 이상의 요청뿐만 아니라 다른 루프 또는 조건 분기도 포함할 수 있습니다. 이러한 유연성을 통해 여러 작업을 순차적으로 테스트해야 하는 복잡한 테스트 시나리오를 구성할 수 있습니다.
Break If 조건: for 루프에 Break if 조건을 추가할 수 있습니다. 조건이 충족되면 루프가 즉시 종료됩니다. Break if의 위치를 드래그하여 조정하거나, 여러 Break if 조건을 추가하여 다양한 시나리오를 처리할 수도 있습니다.
On Error 처리: 루프에 On Error 조건을 추가하여 오류를 관리합니다. 오류가 발생하면 지정된 작업이 트리거됩니다.Ignore: 루프가 다음 요청으로 계속 진행됩니다.
Continue: 현재 주기의 나머지 요청을 건너뛰고 다음 반복으로 이동합니다.
Break execution: 루프를 중지하고 루프 외부의 후속 요청을 진행합니다.
End execution: 전체 테스트 시나리오를 완전히 중단합니다.
On Error 조건은 루프 시작 위치에 고정되어 있으며 이동할 수 없습니다.
요청에서 루프 인덱스 사용#
루프의 현재 인덱스를 요청 내 로컬 변수로 사용하여 매개변수 또는 요청 본문을 동적으로 조정할 수 있습니다. 이를 사용하려면 다음과 같이 하십시오.1
for 루프를 추가하고 루프 내에 요청을 포함합니다.
2
요청 매개변수에서 마술봉 아이콘
🪄을 클릭하고 "Retrieve pre-step data"를 선택합니다.
"Retrieve pre-step data" 기능은 "Tests" 모듈에서만 사용할 수 있으며, "APIs" 모듈에서는 사용할 수 없습니다.
"Retrieve pre-step data"를 사용할 때 값은 전체 테스트 시나리오를 함께 실행할 때만 가져올 수 있으며, 개별 단계를 실행할 때는 접근할 수 없습니다.
3
일반적으로 "Loop n times"로 표시되는 루프 옵션을 선택합니다.
4
"Current loop index"를 선택합니다.
5
{{$.5.index}}와 같은 동적 변수를 얻게 됩니다. "Insert"를 클릭하면 런타임에 현재 루프의 인덱스(예:
0 또는
5)로 대체됩니다.
ForEach 루프#
여러 요소를 포함하는 배열(특정 콘텐츠 목록 또는 이전 단계에서 얻은 목록)이 있고, 목록의 각 항목에 대해 동일한 작업을 수행해야 하는 경우(예: 먼저 제품 목록을 얻은 다음 목록의 각 제품을 장바구니에 추가하는 경우) ForEach 루프를 사용해야 합니다.ForEach 루프에서는 루프 내부의 작업이 배열의 각 요소에 대해 실행됩니다.For 루프와의 차이점은 반복 횟수를 신경 쓸 필요가 없으며, 루프 배열의 내용에만 집중하면 된다는 점입니다.루프 배열 설정: ForEach 루프에서는 배열을 루프 객체로 설정해야 합니다. 변수를 사용하거나 ["a","b","c"]와 같은 배열을 수동으로 입력할 수 있습니다.
요청 추가: ForEach 루프 내에는 하나 이상의 요청을 추가하거나, 다른 루프 또는 조건 분기 등을 추가할 수 있습니다.
Break If 조건 및 On Error 처리: 위에서 설명한 for 루프와 동일하게 ForEach 루프에 Break if 및 On error를 추가할 수 있습니다.
ForEach 루프의 고급 설정에서는 Break If 및 On Error에 대한 예외 처리 옵션도 사용자 지정할 수 있습니다. 자세한 내용은 판단 규칙을 참조하십시오.
ForEach 사용 예시#
두 개의 엔드포인트를 고려해 보겠습니다. 하나는 반려동물 정보 목록을 가져오는 엔드포인트이고, 다른 하나는 단일 반려동물의 세부 정보를 가져오는 엔드포인트입니다. 목록에 최근 추가된 반려동물의 세부 정보를 가져와야 하는 경우, 자동화된 테스트에서 ForEach 루프를 사용하여 이 시나리오를 설정할 수 있습니다.1.
ForEach 루프 외부의 첫 번째 단계에서는 실제 목록 데이터를 가져오기 위해 반려동물 정보 목록 엔드포인트를 요청합니다. 일반적으로 이 인터페이스의 응답에는 반려동물 ID 및 이름과 같은 여러 반려동물의 기본 정보가 포함된 배열이 들어 있습니다.
2.
이전 단계의 응답에서 가져온 반려동물 배열의 하위 집합을 소스 배열로 사용하여 ForEach 루프를 설정합니다.
3.
루프 내에서 "Get Pet Information" 엔드포인트에 대한 요청을 설정하고, ForEach 루프의 요소 값을 사용하여 이 요청의 ID 매개변수를 채웁니다.
요청에서 루프 요소 사용#
루프의 현재 요소/인덱스를 요청 내 로컬 변수로 사용하여 매개변수 또는 요청 본문을 동적으로 조정할 수 있습니다. 이를 사용하려면 다음과 같이 하십시오.1
ForEach 루프를 추가하고 루프 내에 요청을 포함합니다.
2
요청 매개변수에서
마술봉 아이콘을 클릭하고 "Retrieve pre-step data"를 선택합니다.
3
일반적으로 "Loop each element in
{{array}}"로 표시되는 루프 옵션을 선택합니다.
4
"Current loop element"를 선택합니다. JSONPath를 사용하여 요소의 속성을 추출할 수 있습니다.
5
{{$.17.element}}와 같은 동적 변수를 얻게 됩니다. "Insert"를 클릭하면 런타임에 현재 루프의 요소, 즉 루프 배열의 한 요소로 대체됩니다.
현재 루프 요소: 시스템은 ForEach 루프에 지정된 배열에서 요소를 자동으로 추출하여 지정된 변수에 저장합니다. 각 반복이 시작될 때 이 변수는 배열의 현재 요소 값으로 업데이트됩니다. 요소가 객체인 경우 JSONPath를 사용하여 {{$.1.element.data.name}}과 같은 특정 하위 필드를 추출할 수 있습니다.현재 루프 인덱스: 현재 루프의 인덱스가 이 변수에 저장됩니다. 0에서 시작하며 이후 각 반복이 시작될 때마다 1씩 증가하여 현재 인덱스를 나타냅니다.
서로 다른 시나리오에 따라 서로 다른 요청을 보내야 하는 경우, If 문을 사용하여 조건 분기를 추가할 수 있습니다. 지정된 조건이 충족되면 해당 단계가 실행되며, 그렇지 않으면 건너뜁니다. 더 구체적인 자세한 내용은 판단 규칙을 참조하십시오.If 문 설정: If 문은 같음, 같지 않음, 포함, 포함하지 않음 등 다양한 조건을 지원합니다. 조건의 양쪽에는 상수와 변수를 모두 사용할 수 있습니다.
요청 추가: 조건 분기 내에는 여러 요청뿐만 아니라 다른 루프 또는 조건 분기도 추가할 수 있습니다.
조건 분기 실행: 구성에 설정된 조건이 충족되면 테스트 단계가 실행되고, 그렇지 않으면 건너뜁니다.
Else 문: If 조건이 충족되지 않는 시나리오를 처리하기 위해 조건 분기 내에 Else 문을 추가할 수 있습니다.
If 사용 예시#
반려동물 가게 주인은 전날 반려동물의 판매 상태를 기준으로, 판매된 경우 반려동물의 판매 상태를 "Sold"로 변경해야 합니다. 그렇지 않은 경우(else)에는 아직 판매 중인 반려동물 목록을 확인해야 합니다.1.
하단의 "Add Step" 버튼을 클릭하고 "Conditional Branching"을 선택합니다.
2.
API 요청 응답에서 얻은 변수 saleStatus를 "If" 뒤의 입력 상자에 입력하고 조건 "equals"를 선택합니다. 마지막으로 비교 값으로 true를 입력합니다.
3.
조건 분기 작업 위에 마우스를 올리면 " + Else" 옵션이 표시됩니다. 이를 클릭하여 "List of Pets for Sale" 단계를 추가합니다(조건이 충족되지 않은 경우, 즉 아직 판매 중인 반려동물 목록을 조회하는 경우).
판단 규칙#
테스트 시나리오에서 If 문을 사용할 때 조건 규칙을 정의하여 테스트 실행을 제어할 수 있습니다. 조건이 충족되면 해당 단계가 실행되며, 그렇지 않으면 건너뜁니다. 마찬가지로 ForEach 및 For 루프의 Break If 설정에서도 판단 규칙을 설정하여 실행 흐름을 더 유연하게 제어할 수 있습니다.| 규칙 | 설명 |
|---|
| Equals | 두 값이 같은지 확인합니다. |
| Does not equal | 두 값이 같지 않은지 확인합니다. |
| Exists | 필드 또는 변수가 존재하는지 확인합니다. |
| Does not exist | 필드 또는 변수가 존재하지 않는지 확인합니다. |
| Less than | 한 값이 다른 값보다 작은지 확인합니다. |
| Less than or equal | 한 값이 다른 값보다 작거나 같은지 확인합니다. |
| Greater than | 한 값이 다른 값보다 큰지 확인합니다. |
| Greater than or equal | 한 값이 다른 값보다 크거나 같은지 확인합니다. |
| Matches with Regex | 문자열이 지정된 정규 표현식과 일치하는지 확인합니다. |
| Contains | 문자열 또는 배열이 지정된 값을 포함하는지 확인합니다. |
| Does not contain | 문자열 또는 배열이 지정된 값을 포함하지 않는지 확인합니다. |
| Is empty | 필드, 배열 또는 변수가 비어 있는지 확인합니다. |
| Is not Empty | 필드, 배열 또는 변수가 비어 있지 않은지 확인합니다. |
| In List | 값이 지정된 목록에 속하는지 확인합니다. |
| Not in List | 값이 지정된 목록에 속하지 않는지 확인합니다. |
조건 확인(예: 보다 큼, 크거나 같음, 같음 또는 같지 않음)을 수행할 때 비교되는 값이 정수 또는 문자열인 경우, 시스템은 정확한 비교를 위해 문자열을 숫자로 자동 변환합니다. 예를 들어 문자열 "18"을 숫자 18과 비교하면, 시스템은 비교 전에 문자열 "18"을 숫자 18로 변환합니다.Equals#
두 값이 같은지 확인합니다. 같으면 조건이 충족되어 테스트 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추 출한 사용자 나이가 18과 같은지 확인합니다.
조건 예시: {{$.5.response.body.data.age}} Equals 18
실제 실행 효과: 이전 단계에서 추출한 나이 값이 18이면(문자열은 자동으로 숫자로 변환됨), 특정 정보를 표시하거나 특정 작업을 수행하는 등의 단계가 실행됩니다.
Does not equal#
두 값이 같지 않은지 확인합니다. 같지 않으면 조건이 충족되어 테스트 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 주문 상태가 "Paid"와 같지 않은지 확인합니다.
조건 예시: {{$.4.response.body.data.status}} Does not equal Paid
실제 실행 효과: 이전 단계에서 추출한 주문 상태가 다른 값(예: "Pending" 또는 "Shipped")이면 단계가 실행됩니다.
Exists#
특정 필드 또는 변수가 존재하는지 확인합니다. 존재하면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 사용자 데이터에 email 필드가 존재하는지 확인합니다.
조건 예시: {{$.3.response.body.data.email}} Exists
실제 실행 효과: 이전 단계에서 추출한 사용자 데이터에 email 필드가 있으면 단계가 실행됩니다.
Does not exist#
특정 필드 또는 변수가 존재하지 않는지 확인합니다. 존재하지 않으면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 사용자 데이터에 phone 필드가 존재하지 않는지 확인합니다.
조건 예시: {{$.2.response.body.data.phone}} Does not exist
실제 실행 효과: 이전 단계에서 추출한 사용자 데이터에 phone 필드가 없으면 단계가 실행됩니다.
Less Than#
한 값이 다른 값보다 작은지 확인합니다. 작으면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 제품 재고가 10보다 작은지 확인합니다.
조건 예시: {{$.1.response.body.data.stock}} Less Than 10
실제 실행 효과: 이전 단계에서 추출한 재고 값이 8이면 조건이 충족되어 단계가 실행됩니다.
Less than or equal#
한 값이 다른 값보다 작거나 같은지 확인합니다. 작거나 같으면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 나이가 12보다 작거나 같은지 확인합니다.
조건 예시: {{$.2.response.body.data.age}} Less than or equal 12
실제 실행 효과: 이전 단계에서 추출한 나이 값이 10이면 조건이 충족되어 단계가 실행됩니다.
Greater than#
한 값이 다른 값보다 큰지 확인합니다. 크면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 주문 금액이 1000보다 큰지 확인합니다.
조건 예시: {{$.1.response.body.data.amount}} Greater than 1000
실제 실행 효과: 이전 단계에서 추출한 주문 금액 값이 1105이면 조건이 충족되어 단계가 실행됩니다.
Greater than or equal#
한 값이 다른 값보다 크거나 같은지 확인합니다. 크거나 같으면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 사용자 포인트가 500보다 크거나 같은지 확인합니다.
조건 예시: {{$.3.response.body.data.points}} Greater than or equal 500
실제 실행 효과: 이전 단계에서 추출한 포인트 값이 600이면 조건이 충족되어 단계가 실행됩니다.
Matches with Regex#
문자열이 지정된 정규 표현식과 일치하는지 확인합니다. 일치하면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 이메일 형식이 올바른지 확인합니다.
조건 예시: {{$.2.response.body.data.email}} Matches with Regex /^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$/i
실제 실행 효과: 이전 단계에서 추출한 이메일 형식이 정규 표현식과 일치하면(예: test@gmail.com) 단계가 실행됩니다.
정규 표현식은 패턴을 /로 감싸고 끝에 선택적 수정자(예: 전역 매칭을 위한 g, 대소문자 구분 없음을 위한 i)를 붙이는 "리터럴" 구문을 사용하여 작성해야 합니다. 정규 표현식 작성에 대한 자세한 내용은 MDN 문서를 참조할 수 있습니다. Contains#
문자열 또는 배열이 지정된 값을 포함하는지 확인합니다. 포함하면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 사용자 역할 목록에 "admin" 역할이 포함되어 있는지 확인합니다.
조건 예시: {{$.3.response.body.data.roles}} Contains admin
실제 실행 효과: 이전 단계에서 추출한 역할 목록에 "admin"이 포함되어 있으면 단계가 실행됩니다.
Does not contain#
문자열 또는 배열이 지정된 값을 포함하지 않는지 확인합니다. 포함하지 않으면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 사용자의 장바구니에 특정 제품이 포함되어 있지 않은지 확인합니다.
조건 예시: {{$.4.response.body.data.cartItems}} Does not contain productId123
실제 실행 효과: 이전 단계에서 추출한 장바구니 배열에 제품 productId123이 포함되어 있지 않으면 단계가 실행됩니다.
Is empty#
필드, 배열 또는 변수가 비어 있는지 확인합니다. 비어 있으면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 비고 필드가 비어 있는지 확인합니다.
조건 예시: {{$.2.response.body.data.remarks}} Is empty
실제 실행 효과: 이전 단계에서 추출한 비고 필드가 비어 있으면 단계가 실행됩니다.
Is not Empty#
필드, 배열 또는 변수가 비어 있지 않은지 확인합니다. 비어 있지 않으면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 주문 비고가 작성되어 있는지 확인합니다.
조건 예시: {{$.1.response.body.data.orderRemarks}} Is not Empty
실제 실행 효과: 이전 단계에서 추출한 주문 비고가 비어 있지 않으면 단계가 실행됩니다.
In List#
값이 지정된 목록에 속하는지 확인합니다. 속하면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 사용자가 선택한 제품이 추천 제품 목록에 있는지 확인합니다.
조건 예시: {{$.3.response.body.data.productId}} In List ["prod123", "prod456", "prod789"]
실제 실행 효과: 이전 단계에서 추출한 제품 ID가 "prod456"이면 단계가 실행됩니다.
Apidog에서 목록을 입력할 때 각 요소는 별도로 입력하고 Enter 키를 눌러 구분해야 합니다.
Not in List#
값이 지정된 목록에 속하지 않는지 확인합니다. 속하지 않으면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.시나리오: 이전 단계에서 추출한 사용자가 입력한 프로모션 코드가 사용된 프로모션 코드 목록에 없는지 확인합니다.
조건 예시: {{$.4.response.body.data.promoCode}} Not in List ["usedCode1", "usedCode2"]
실제 실행 효과: 이전 단계에서 추출한 프로모션 코드가 "newPromo"이면 조건이 충족되어 단계가 실행되며, 그렇지 않으면 건너뜁니다.
그룹화#
테스트 프로세스의 여러 단계가 서로 관련되어 있는 경우, 분류를 위해 함께 그룹화할 수 있습니다. 테스트 단계를 그룹화하면 테스트 시나리오의 가독성과 조작성이 향상됩니다.테스트 프로세스의 특정 단계가 실행되기 전에 일정 시간 동안 대기해야 하는 경우, 이를 해결하기 위해 대기 조건을 추가할 수 있습니다.대기 사용 예시#
사용자가 반려동물 세부 정보를 조회하고 1000ms 동안 탐색한 후 반려동물 정보의 탐색 상태를 업데이트하는 상황을 시뮬레이션합니다.1.
하단의 "Add Step" 버튼을 클릭하고 "Wait"를 선택합니다.
2.
대기할 시간 1000(밀리초 단위)을 입력합니다.
테스트 흐름 제어를 사용할 때 테스트 보고서에는 If, for 등과 같은 단계가 표시되지 않으며, 실제로 실행된 요청만 실행 순서대로 선형으로 나열됩니다.