간단한 30줄 코드로 HTTP 테스트 프레임워크 구현하기

이 프레임워크는 도메인 특화 언어와 템플릿 해석을 기반으로 동작합니다. 먼저, 수행할 작업을 명확히 정의하는 형식을 제정하고, 이를 통해 사용자 정의 문법을 실제 코드로 변환하여 실행합니다. 예를 들어, 다음 YAML 파일은 여러 단계의 요청과 변수 연관성을 정의합니다.

apis.yaml:

- name: 백도스 토큰 획득
  request:
    url: https://aip.baidubce.com/oauth/2.0/token
    method: get
    params:
      grant_type: client_credentials
      client_id: kPoFYw85FXsnojsy5bB9hu6x
      client_secret: l7SuGBkDQHkjiTPU3m6NaNddD6SCvDMC
  extract:
    access_token: RESPONSE.json()['access_token']

- name: 백도스 OCR 인식
  request:
    url: https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=${access_token}
    method: post
    data:
      url: //upload-images.jianshu.io/upload_images/7575721-40c847532432e852.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
  verify:
    - RESPONSE.json()['words_result_num'] == 6

여기서 name은 각 요청의 설명입니다. request 블록은 requests.request()에 전달될 파라미터들을 포함하며, 필수 항목은 urlmethod입니다. params, headers, data, json, files, timeout 등의 옵션은 적절한 형식으로 지정됩니다. extract는 응답에서 특정 값을 추출하는 역할이며, 예시에서는 access_token 변수에 응답 본문의 access_token 값을 저장합니다. 두 번째 요청에서 ${access_token}처럼 변수 참조가 가능해져, 이전 단계에서 추출한 값이 재사용됩니다. verify는 리스트 형식의 검증 조건을 포함하며, 표현식의 평가 결과가 True인지 여부로 성공 여부를 판단합니다.

이제 위에서 정의한 규칙을 해석하고 실행하도록 구현합니다. 전체 과정은 다음과 같습니다:

  1. yaml.safe_load()apis.yaml 파일을 파싱하여 딕셔너리 리스트로 변환
  2. 각 항목(요청)을 순회하며 처리
  3. 요청 파라미터 내 $ 변수를 처리:
  • 딕셔너리를 문자열로 변환 후 string.Template으로 변수 치환
  • locals()에 존재하는 변수 이름과 매칭되어 치환됨
  • 다시 딕셔너리로 파싱
  1. 치환된 요청 데이터를 requests.request(**request)로 전송
  2. extract 항목이 있으면 eval()을 사용해 표현식을 평가하고 결과를 로컬 변수로 저장
  3. verify 항목이 있으면 각 표현식을 평가하고 결과 출력

구현 코드 (필요 라이브러리: pyyaml 설치 필요 → pip install pyyaml):

test_runner.py:

import yaml
import requests
from string import Template

with open('apis.yaml', encoding='utf-8') as file:
    test_cases = yaml.safe_load(file)

for case in test_cases:
    print(f"실행 중: {case['name']}")

    config = case.get('request', {})
    req_str = yaml.dump(config)

    if '${' in req_str:
        req_str = Template(req_str).safe_substitute(locals())
        config = yaml.safe_load(req_str)

    response = requests.request(**config)

    extractor = case.get('extract')
    if extractor:
        for var_name, expr in extractor.items():
            value = eval(expr, {}, {'RESPONSE': response})
            locals()[var_name] = value
            print(f"변수 추출: {var_name} = {value}")

    verifier = case.get('verify')
    if verifier:
        for assertion in verifier:
            result = eval(assertion, {}, {'RESPONSE': response})
            status = "통과" if result else "실패"
            print(f"검증: {assertion} → {status}")

실행 결과 예시:

실행 중: 백도스 토큰 획득
변수 추출: access_token = 24.abc123def456...
실행 중: 백도스 OCR 인식
검증: RESPONSE.json()['words_result_num'] == 6 → 통과

이 방식은 간결하면서도 확장성 있는 테스트 자동화 프레임워크를 제공하며, 다양한 외부 서비스와의 연동이 용이합니다.

태그: YAML requests python API Testing template substitution

7월 20일 18:05에 게시됨