G마켓이 수익과 직결되는 iOS 광고 트래킹 URL 요청이 배포 후에도 제대로 전송되는지, 일반 QA 로는 잡기 어려운 부분을 UITest 로 자동 검증한 사례를 다룬다. URLProtocol 로 네트워크 요청을 가로채 시뮬레이터 공유 폴더에 기록하고, 별도 프로세스인 UITest 에서 그 URL 을 검증하는 구조다.
핵심 포인트- 광고 트래킹은 수익과 직결되는데 코드 수정 시 깨질 위험이 있고 일반 QA 로는 발견이 어려워, 배포 전 자동 검증이 필요했다.
- 단순 Fake 객체(플래그만 변경)로는 실제 URLRequest 네트워크 요청 여부를 못 잡는 게 핵심 문제였다.
- URLProtocol 서브클래싱으로 요청을 가로채 URL 을 시뮬레이터 공유 폴더에 기록한다.
- UITest 는 별도 프로세스라 메모리 공유가 안 돼, SIMULATOR_SHARED_RESOURCES_DIRECTORY 파일로 IPC 한다.
- Protocol+DI 와 launchEnvironment 로 시나리오별 Fake JSON 을 주입해 네트워크 의존을 제거했다.
상세 정리- 문제: 광고 클릭→이벤트→URL 요청→광고 처리 시스템→비용 청구 흐름을 배포 전 검증해야 하는데, 일반 QA 로는 트래킹 누락을 발견하기 어려웠다.
- Fake 한계: 플래그만 바꾸는 단순 Fake 객체로는 함수 호출 여부만 알 뿐 실제 URLRequest 전송을 확인할 수 없었다.
- 요청 가로채기: CustomURLProtocol 이 URLProtocol 을 상속해 startLoading 에서 요청 URL 을 저장하고 임의 200 응답을 돌려준다.
- 세션 설정: URLSessionConfiguration.ephemeral 에 protocolClasses 로 CustomURLProtocol 을 꽂아 테스트 시에만 가로채게 한다.
- 크로스 프로세스: UITest 와 앱이 별도 프로세스라 메모리 싱글톤 공유가 안 돼, SIMULATOR_SHARED_RESOURCES_DIRECTORY 환경 변수의 storedUrls.txt 에 URL 을 append 한다.
- 검증: numberOfTextInSharedFolder 로 기대 URL 등장 횟수를 세 XCTAssertEqual 로 판정한다.
- UI 트리거: accessibilityIdentifier 컨벤션(타입명·프로퍼티명·enum 분리)으로 요소를 식별하고 tap·waitForExistence 등으로 상호작용한다.
- Fake 데이터: 동적 네트워크는 지연·불안정해, SearchResultRepository 프로토콜을 실제·가짜 구현으로 나누고 launchEnvironment 로 시나리오별 JSON 을 선택한다.
- 트레이드오프: 이 방식은 시뮬레이터 전용이라 실기기 테스트가 안 되고, 정적 JSON 은 안정적이지만 실제 API 변경을 반영하지 못한다.
왜 읽나iOS 에서 광고·분석 트래킹 같은 네트워크 사이드이펙트를 자동 검증하려는 모바일 개발자에게, URLProtocol 가로채기와 시뮬레이터 IPC 기반 UITest 설계 레퍼런스.