UI 자동테스트에 mitmproxy 통합: QA 엔지니어를 위한 트래픽 제어
네트워크 트래픽 프록시 처리는 UI 자동테스트 효율성을 획기적으로 높이는 게임 체인저입니다. Charles Proxy나 Fiddler 같은 수동 테스트 도구와 달리, 자동화에는 프로그래머블 솔루션이 필요합니다. Python API와 헤드리스 모드를 가진 mitmproxy는 테스트 인프라에 제어 가능한 네트워크 계층을 직접 내장할 수 있게 해줍니다.
자동화 테스트에서 프록시의 중요성
UI 자동테스트는 종종 "네트워크 맹점"에 시달립니다—API, WebSocket, 백엔드 서비스 문제를 파악하지 못합니다. 이로 인해 테스트가 불안정해지고, 거짓 실패가 발생하며 디버깅이 어려워집니다. 프록시를 추가하면 테스트에 완전한 네트워크 가시성을 제공합니다. 주요 사용 사례:
- 앱 동작 검증을 위해 HTTP 요청/응답을 가로채고 분석.
- 클라이언트 측 오류 처리 테스트를 위해 상태 코드 조작 (예: 200 → 404).
- 개발 환경 없이 테스트 시나리오 시뮬레이션을 위한 JSON/XML 응답 데이터 교체.
- 트래픽 로깅 및 요청 순서 추적.
- WebSocket 메시지 처리, 실시간 주입 및 수정 포함.
mitmproxy가 최고의 선택인 이유
Charles, Proxyman, Fiddler 같은 도구들은 외부 제어 API가 없어 자동화에 부적합합니다. 오픈소스 mitmproxy는 다음으로 빛납니다:
- Python API로 트래픽 가로채기 및 수정 스크립팅.
- GUI 없이 CI/CD 파이프라인에 적합한 헤드리스 모드.
- 현대 웹/모바일 앱에 필수적인 WebSocket 지원.
- 크로스플랫폼 (Windows, Linux, macOS).
Mitmproxy는 세 가지 모드로 실행됩니다: mitmproxy (인터랙티브 CLI), mitmweb (웹 UI), mitmdump (비인터랙티브 덤프). 자동테스트에는 mitmdump나 mitmweb에 커스텀 스크립트를 사용하는 것이 좋습니다.
테스트 프레임워크와의 통합 아키텍처
Mitmproxy를 테스트 프레임워크와 독립적인 별도 프로세스로 실행하세요. 설정 파일 (예: config.json)과 Python 모듈 (proxy_handler.py)을 통해 통신합니다. 기본 워크플로:
- mitmproxy 설치 (예:
brew install mitmproxy). - HTTPS 가로채기를 위한 테스트 기기에 인증서 설정.
mitmweb -s proxy_handler.py로 실행.- 테스트에서 config.json을 업데이트해 프록시 동작 동적 제어.
상태 코드 모킹: 실습 예제
특정 API에 HTTP 상태 코드를 모킹해 보겠습니다. config.json에 정의:
{
"status": {"api/v1/user": 404, "api/v2/settings": 500}
}
일회성 모킹에는 숫자, 지속적 모킹에는 리스트 (예: [404])를 사용하세요. proxy_handler.py 모듈에서 처리:
import re
import mitmproxy.ctx as ctx
from mitmproxy import http
from file_worker import FileWorker
file_worker = FileWorker()
def response(flow: http.HTTPFlow) -> None:
url = flow.request.url
if not flow.response.content:
return
cfg = file_worker.get_proxy_params()
cfg_status = cfg.get("status")
for api, sc in list(cfg_status.items()):
if bool(re.compile(api).search(url)):
flow.response.status_code = int(sc[0] if isinstance(sc, list) else sc)
ctx.log.info(f"Status code was mocked '{api}' -> {sc}")
if not isinstance(sc, list):
del cfg_status[api]
file_worker.set_proxy_param("status", cfg_status)
cfg["status"] = cfg_status
break
주요 구현 포인트:
- 유연한 URI 매칭을 위한 정규식 (re 모듈).
- 일회성 및 지속적 모킹 지원.
- 쉬운 디버깅을 위한 로깅.
- 깔끔한 코드 관리를 위한 전용 FileWorker 클래스 내 파일 작업.
기능 확장: 데이터 모킹과 로깅
응답 본문을 모킹하는 것도 비슷합니다. config.json에 "mock" 섹션 추가:
{
"mock": {"api/v1/data": {"field": "new_value"}}
}
proxy_handler.py에서:
cfg_mock: dict = cfg.get("mock")
if cfg_mock:
for mock_api, params in list(cfg_mock.items()):
if bool(re.compile(mock_api).search(url)):
data = flow.response.content.decode()
modified = file_worker.mock(params[0] if isinstance(params, list) else params, data)
if modified:
flow.response.content = modified.encode()
ctx.log.info(f"Param {params} were mocked for '{mock_api}'")
if not isinstance(params, list):
del cfg_mock[mock_api]
file_worker.set_proxy_param("mock", cfg_mock)
cfg["mock"] = cfg_mock
break
서버 응답을 파일로 저장 (분석에 유용)하려면 config.json에 "get_response" 섹션을 사용하세요. 완벽한 용도:
- 자동 검사에서 데이터 구조 검증.
- 회귀 테스트를 위한 골든 응답 구축.
- 복잡한 백엔드 상호작용 디버깅.
주요 요점
- 네트워크 가시성: 프록시는 자동테스트의 네트워크 문제 맹점을 해결해 진단과 안정성을 높입니다.
- mitmproxy 유연성: Python API와 WebSocket 지원으로 GUI 없이 복잡한 트래픽 시나리오 가능.
- 설정 기반 제어: JSON 설정으로 테스트 프레임워크에서 동적 프록시 조정 원활.
- 성능: 핸들러 최적화로 프록시나 테스트 속도 저하 방지.
- 확장성: 모듈러 설계 (proxy_handler.py, FileWorker)로 스로틀링이나 WebSocket 분석 등 기능 추가 용이.
결론
UI 자동테스트에 mitmproxy를 통합하면 프록시가 수동 도구에서 자동화 파워하우스로 변신합니다. 특히 백엔드 시뮬레이션과 심층 네트워크 모니터링에서 클라이언트 측 테스트를 강화합니다. 성공을 위해 설정 유연성과 핸들러 성능의 균형을 맞추세요.
— Editorial Team
아직 댓글이 없습니다.