Apidog에서 자동화된 테스트 워크플로우를 설계할 때, API 요청, 데이터베이스 쿼리, For 루프, ForEach 루프, 스크립트 등 다양한 유형의 테스트 단계를 사용하게 됩니다.

종종 한 단계에서 생성된 데이터는 다음 단계에서 사용되어야 합니다. 이는 데이터가 프로세스를 주도하고 단계들이 서로 연결되는 논리적인 흐름을 만듭니다.
예를 들어 다음과 같이 할 수 있습니다.
- 이전 단계에서 사용자 토큰을 검색하거나, 데이터베이스 쿼리를 실행하여 특정 레코드를 가져옵니다.
- 그런 다음 다음 단계의 엔드포인트 요청에서 해당 결과를 사용합니다.
이는 중요한 질문을 제기합니다.
이전(업스트림) 단계의 데이터를 다음(다운스트림) 단계에서 어떻게 올바르게 참조할 수 있을까요?
Apidog에서 데이터 전달을 위한 두 가지 메커니즘
Apidog의 자동화된 테스트에는 여러 테스트 단계 간에 데이터를 전달하는 두 가지 주요 방법이 있습니다.
1. "동적 값"을 통한 이전 단계 데이터 검색
"동적 값(Dynamic Value)" 기능을 사용하여 이전(업스트림) 단계의 출력을 다음(다운스트림) 단계에서 직접 참조할 수 있습니다. 이를 통해 데이터를 저장하지 않고도 즉석에서 데이터를 가져올 수 있습니다.

2. 변수 저장 및 재사용
업스트림 단계에서 중요한 데이터를 추출하여 변수로 저장할 수 있습니다. 이 변수들은 이후의 모든 단계에서 재사용될 수 있습니다.

이 두 가지 데이터 전달 방법을 숙달하는 것은 Apidog에서 효율적이고 데이터 중심적인 자동화된 워크플로우를 구축하는 데 중요합니다.
이 글은 다양한 유형의 테스트 단계에서 데이터를 처리하는 방법을 두 가지 관점에서 설명합니다: 데이터를 추출하는 방법과 데이터를 사용하는 방법. 이 둘을 이해함으로써 더 유연하고 잘 연결된 테스트 워크플로우를 구축할 수 있을 것입니다.
엔드포인트 응답 데이터 추출 및 사용
엔드포인트 응답 데이터 이해
자동화된 테스트에서 API 요청은 일반적으로 구조화된 JSON 응답을 반환하며, 이는 종종 이후 테스트 단계의 입력으로 사용됩니다.

다른 단계 유형과 달리 엔드포인트 응답은 중첩된 객체와 배열을 자주 포함하여 더 복잡한 경향이 있습니다.
엔드포인트 응답에서 데이터 추출 방법
테스트 단계 간에 엔드포인트 응답 데이터를 추출하고 전달하는 두 가지 주요 방법이 있습니다.
방법 1: 동적 값 참조
"동적 값"을 사용하여 이전 단계의 데이터를 직접 참조합니다.
- 다운스트림 단계의 모든 입력 필드에서 마법 지팡이 아이콘을 클릭합니다.
- "이전 단계 데이터 검색"을 선택합니다.
- Apidog가 올바른 표현식을 자동으로 삽입하므로 수동으로 작성할 필요가 없습니다.

방법 2: 데이터를 변수로 추출
엔드포인트 후처리기의 "변수 추출" 기능을 사용하여 응답에서 특정 필드를 변수로 추출할 수도 있습니다.
예를 들어, 응답에서 제품의 id를 추출하려면:
- 변수 이름을
products_id로 설정합니다. - JSONPath:
$.products[0].id를 사용합니다.

이후 단계에서는 {{products_id}}를 사용하여 간단히 참조합니다.
엔드포인트 응답에서 추출된 데이터 사용 방법
API 응답에서 "동적 값" 또는 "추출된 변수"를 사용하여 데이터를 추출한 후, 해당 데이터를 다운스트림 단계에서 여러 가지 방법으로 사용할 수 있습니다.
1. 엔드포인트 요청에서 데이터 사용
- 동적 값을 통해: 이전과 마찬가지로 입력 필드에서 마법 지팡이 아이콘을 클릭하고 "이전 단계 데이터 검색"을 선택하면 Apidog가 올바른 표현식을 자동으로 삽입합니다.
- 추출된 변수를 통해: 이전에 값을 변수로 저장했다면(예:
products_id), API 요청에서{{products_id}}를 매개변수로 사용하기만 하면 됩니다.

2. 데이터베이스 작업에서 데이터 사용
API 응답을 데이터베이스 쿼리의 입력으로 사용할 수 있습니다. 두 가지 방법 모두 작동합니다.
- 동적 값 방법
SELECT * FROM products WHERE id = '{{$.1.response.body.products[0].id}}'
SQL 쿼리에서 API 응답 데이터를 직접 참조하려면 동적 값을 사용합니다.

- 추출된 변수 방법: 제품 ID를
products_id라는 변수로 추출했다면 다음을 사용합니다.
SELECT * FROM products WHERE id = '{{products_id}}'3. For 루프에서 데이터 사용
API 응답에서 배열의 길이를 기반으로 단계를 반복하려면:
- 예를 들어 동적 값을 사용하여 배열 길이를 가져옵니다.
{{$.1.response.body.products.length}}이렇게 하면 루프 반복 횟수가 설정됩니다.

4. ForEach 루프에서 데이터 사용
엔드포인트에서 반환된 배열의 각 항목을 반복하려면:
- 동적 값 방법: 예를 들어
{{$.1.response.body.products}}와 같이 전체 배열을 직접 추출합니다.

- 변수 추출 방법: 전체 배열이
products변수로 추출되었다고 가정하면, 루프에{{products}}를 직접 삽입합니다.

5. 스크립트에서 데이터 사용
스크립트 내에서 이전 단계의 데이터를 사용하려면 pm.variables.get() 메서드를 사용합니다. 방법은 다음과 같습니다.
- 동적 값 방법: 이전 단계에서 직접 데이터를 읽어옵니다.
const products = pm.variables.get("$.1.response.body.products")
- 변수 추출 방법: 배열 또는 값을 변수로 저장했다면 다음 스크립트를 사용하여 데이터를 가져옵니다.
임시 변수의 값을 가져옵니다.
const products = pm.variables.get("products") 환경 변수의 값을 가져옵니다.
const products = pm.environment.get("products")
전역 변수의 값을 가져옵니다.
const products = pm.globals.get("products"){{products}}와 같은 보간 구문을 직접 사용할 수 없습니다. 대신, 위에서 언급된 적절한 메서드를 사용하여 변수 값을 검색해야 합니다.데이터베이스 쿼리 결과 추출 및 사용
데이터베이스 데이터 이해
데이터베이스 쿼리 단계가 실행되면, 객체 배열 형태의 구조화된 데이터를 반환합니다. 단 하나의 레코드만 반환되더라도 배열로 래핑됩니다. 예를 들어:

엔드포인트 응답과 달리, 데이터베이스 단계의 데이터는 동적 변수를 사용하여 직접 접근할 수 없습니다. 먼저 값을 변수로 추출해야 합니다.
데이터베이스에서 데이터 추출 방법
데이터베이스 단계에서 SQL 쿼리를 실행하면 Apidog는 응답을 다음과 같이 구조화된 데이터로 자동 구문 분석합니다.
[
{
"id": "1000",
"title": "Title 1",
"description": "Description for Title 1"
}
]
그런 다음 JSONPath를 사용하여 특정 필드를 추출하고 변수로 저장할 수 있습니다.
예를 들어:
- 변수 이름:
products_id - JSONPath:
$[0].id(첫 번째 항목의 ID를 추출). 전체 결과 집합을 추출하려면$를 사용합니다. - 다운스트림 단계에서는
{{ }}를 통해 변수를 참조합니다. 예를 들어:{{products_id}}

데이터베이스에서 추출된 데이터 사용 방법
1. 엔드포인트 요청에서 데이터 사용
데이터베이스 쿼리가 ID를 반환하고 이를 변수(products_id)로 저장했다면, 다운스트림 엔드포인트 요청에서 직접 사용할 수 있습니다.

2. ForEach 루프에서 데이터 사용
쿼리가 레코드 목록을 반환하고 각 레코드를 개별적으로 처리하려면 전체 배열을 ForEach 루프의 소스로 사용할 수 있습니다.

전제는 데이터베이스 작업에서 변수를 추출할 때 전체 배열을 저장하는 것입니다. 예를 들어:
- 변수 이름:
products - JSONPath:
$

3. 스크립트에서 데이터 사용
스크립트에서 추출된 데이터베이스 변수를 사용하려면 다른 변수와 동일한 방법을 사용합니다.
임시 변수의 값을 가져옵니다.
const products = pm.variables.get("products")환경 변수의 값을 가져옵니다.
const products = pm.environment.get("products")전역 변수의 값을 가져옵니다.
const products = pm.globals.get("products")
For 루프에서 데이터 추출 및 사용
For 루프 작동 방식
For 루프는 특정 일련의 작업을 여러 번 반복하는 데 사용됩니다. 이는 정의된 반복 횟수를 기반으로 실행됩니다.
고정된 루프 횟수를 설정하거나, 이전 단계에서 반환된 배열의 길이(.length)와 같은 동적 값을 사용할 수 있습니다. 예를 들어: {{$.1.response.body.products.length}}:

참고: 데이터를 출력하는 다른 단계와 달리, For 루프 자체는 데이터를 직접 반환하지 않습니다. 루프가 몇 번 실행되었는지 보여주는 인덱스 값(0부터 시작)만 제공합니다.
For 루프에서 데이터 추출 방법
실행 과정에서 동적 변수 구문인 {{$.9.index}}를 사용하여 현재 루프 인덱스에 접근할 수 있습니다.

- 숫자
9는For 루프단계의 ID를 나타냅니다. - 각 단계에는 고유한 ID가 있습니다.
- 인덱스는 첫 번째 루프의 경우 0, 두 번째 루프의 경우 1 등으로 시작합니다.
For 루프에서 추출된 데이터 사용 방법
1. 스크립트에서 데이터 사용
테스트 스크립트에서 루프 관련 정보를 사용하려면 pm.variables.get()을 사용하여 현재 인덱스를 가져올 수 있습니다.
// 현재 루프 인덱스 가져오기
const index = pm.variables.get("$.7.index");
2. 다른 데이터 소스와 함께 데이터 사용
For 루프의 일반적인 사용 사례는 배열을 반복하고 각 항목을 처리하는 것처럼 이전 단계의 데이터를 처리하는 것입니다.
// 이전 단계에서 배열 가져오기
const products = pm.variables.get("$.1.response.body.products");
// 현재 루프 인덱스 가져오기
const index = pm.variables.get("$.7.index");
// 인덱스를 사용하여 배열의 현재 항목에 접근
console.log(products[index]);
이를 통해 각 루프 반복 동안 배열의 각 항목에 대해 일괄 작업을 수행할 수 있습니다.
ForEach 루프에서 데이터 추출 및 사용
ForEach 루프 작동 방식
ForEach 루프는 배열 데이터를 위해 특별히 설계되었습니다. 배열의 각 요소를 자동으로 반복하고 동일한 일련의 작업을 수행합니다.
ForEach 루프와 For 루프의 주요 차이점은 ForEach 루프가 각 반복에서 현재 배열 요소의 전체 데이터를 자동으로 추출하여 자식 단계에서 직접 접근할 수 있도록 한다는 것입니다.
ForEach 루프에서 데이터 접근
ForEach 루프 내에서 시스템은 자동으로 두 가지 특수 변수를 생성합니다.
- 현재 루프 요소: 현재 처리 중인 배열 요소의 전체 데이터를 포함합니다. 예를 들어:
{{$.4.element}}. 배열에 객체가 포함된 경우{{$.4.element.id}},{{$.4.element.title}}등과 같이 해당 속성에 직접 접근할 수 있습니다.

- 현재 루프 인덱스: 현재 반복 횟수를 나타냅니다(0부터 시작). 예:
{{$.4.index}}.

참고: 숫자 4는 ForEach 루프 단계의 ID를 나타냅니다. 실제 워크플로우에서는 이를 프로세스에서 올바른 단계 ID로 대체하십시오.
ForEach 루프 데이터의 일반적인 사용 사례
1. 엔드포인트 요청에서 데이터 사용
ForEach 루프는 배치 데이터 작업을 처리하는 데 완벽합니다. 예를 들어, 항목 배열이 있는 경우 배열의 각 항목에 대해 엔드포인트 요청을 자동으로 보낼 수 있습니다. 각 루프 동안 동일한 요청 템플릿이 재사용되지만, {{$.4.element.id}}와 같은 다른 데이터로 채워집니다.

2. 데이터베이스 작업에서 데이터 사용
현재 루프 항목의 데이터를 사용하여 데이터베이스 쿼리를 실행하거나 여러 행을 삽입할 수 있습니다.
예시: 현재 항목의 필드를 사용하여 데이터베이스 쿼리
SELECT * FROM products WHERE id = '{{$.4.element.id}}'
{{$.4.element.id}} 표현식은 동적 값 기능을 사용하여 접근할 수 있습니다.

현재 항목의 여러 필드를 테이블에 삽입:
INSERT INTO products (id, title) VALUES ('{{$.4.element.id}}', '{{$.4.element.title}}')
3. 스크립트에서 데이터 사용
사용자 정의 스크립트에서 루프의 데이터를 추가로 처리해야 하는 경우, pm.variables.get() 메서드를 사용하여 값을 검색할 수 있습니다.
// 현재 요소 가져오기
const item = pm.variables.get("$.4.element");
// 현재 인덱스 가져오기
const index = pm.variables.get("$.4.index");스크립트에서 데이터 추출 및 사용
스크립트 데이터 작동 방식
워크플로우의 다른 단계와 달리, 스크립트는 다음 단계에서 직접 사용할 수 있는 출력을 자동으로 생성하지 않습니다. 스크립트에서 데이터를 이후 단계로 전달하려면 수동으로 변수에 저장해야 합니다.
스크립트에서 데이터 추출 방법
다음과 같이 다양한 유형의 변수에 값을 저장할 수 있습니다.
// JSON 응답 데이터 가져오기
// 1. 현재 엔드포인트 응답에서
// const currentData = pm.response.json();
// 2. 또는 동적 값을 사용하여 이전 단계에서 가져오기
const preData = pm.variables.get("$.1.response.body");
// 환경 변수에 저장
pm.environment.set('products', preData.products);
pm.environment.set('products_id', preData.products[0].id);
// 전역 변수에 저장
pm.globals.set('products', preData.products);
// 임시 변수에 저장 (현재 실행 중에만 유효)
pm.variables.set('products', preData.products);변수가 추출되고 설정되면 {{variableName}} 구문을 사용하여 이후 단계에서 참조할 수 있습니다.
스크립트에서 추출된 데이터 사용 방법
1. 엔드포인트 요청에서 데이터 사용
스크립트에서 설정된 변수는 다운스트림 엔드포인트 요청의 매개변수로 직접 사용될 수 있습니다. 예를 들어, 스크립트에 products_id를 저장했다면, 이후 요청에서 {{products_id}}와 같이 참조할 수 있습니다.

2. 데이터베이스 작업에서 데이터 사용
스크립트 변수는 동적 SQL 문을 구축하는 데도 사용될 수 있습니다. 예를 들어:
SELECT * FROM products WHERE id = '{{products_id}}'3. For 루프에서 데이터 사용
스크립트를 사용하여 루프 횟수 또는 기타 중간 값을 생성하고, 이를 "임시 변수"로 저장한 다음 For 루프 단계로 전달할 수 있습니다.
pm.variables.set("loopCount", 5); 그런 다음 루프 설정에서 {{loopCount}}를 반복 횟수로 사용합니다.
4. ForEach 루프에서 데이터 사용
전체 배열을 변수에 저장하고 ForEach 루프의 데이터 소스로 사용할 수 있습니다.
예시:
// 선택적으로 동적 값을 사용하여 이전 단계에서 배열 검색
// const preData = pm.variables.get("$.1.response.body.products")
const preData = [{id: 1}, {id: 2}, {id: 3}];
// 환경 변수에 저장
pm.environment.set('products', preData);
그런 다음 ForEach 루프에서 데이터 소스를 {{products}}로 설정합니다.
결론
효율적인 자동화된 테스트 워크플로우를 구축하려면 다양한 유형의 단계에서 데이터를 추출하고 사용하는 방법을 이해하는 것이 필수적입니다.
- 엔드포인트 및 데이터베이스 단계는 비즈니스 관련 데이터를 생성합니다.
- 루프 단계는 논리 흐름을 제어합니다.
- 스크립트 단계는 데이터를 처리하고 변환하는 데 사용됩니다.
동적 값 참조와 변수 추출을 결합하여 유연하고 강력한 데이터 중심 테스트 프로세스를 설계할 수 있습니다.
데이터 전달을 위한 모범 사례:
- 한 번만 또는 가끔 사용되는 간단한 데이터에는 동적 값 참조를 사용합니다.
- 여러 단계에서 재사용되거나 스크립트에서 처리되어야 하는 데이터에는 변수 추출을 사용합니다.
데이터 복잡성과 사용 빈도에 따라 올바른 방법을 선택하면 워크플로우를 더 유지보수하기 쉽고 효율적으로 만들 수 있습니다.
