핵심요약
iOS 애플리케이션에서 광고 트래킹과 같은 특정 이벤트에 대한 URL 요청이 실제로 전송되었는지 검증하기 위한 자동화된 UI 테스트 프레임워크 구축 방안을 다룹니다. 이를 위해 URLProtocol을 이용한 요청 가로채기, 교차 프로세스 데이터 공유를 위한 파일 시스템 활용, 그리고 테스트 데이터 관리를 위한 의존성 주입 및 환경 변수 활용 기법을 설명합니다.
iOS 광고 트래킹 URL 요청 검증 자동화 가이드
광고 트래킹 이벤트 검증 필요성 및 문제 정의
- 광고 트래킹은 서비스 수익과 직결되는 핵심 기능으로, 정확한 데이터 전송이 필수적입니다.
- 일반적인 QA 및 유닛 테스트로는 실제 **
URLRequest**가 네트워크로 전송되었는지 확인하기 어렵습니다. Fake객체는 메서드 호출 여부만 검증하며, 실제 네트워크 요청 여부를 보장하지 못하는 한계가 있습니다.
URL 요청 가로채기 및 데이터 저장 기법
- iOS에서는
URLProtocol서브클래싱을 통해 네트워크 요청을 가로챌 수 있습니다. - **
CustomURLProtocol**을 정의하고startLoading()메서드를 오버라이드하여URLRequest를 인터셉트합니다. - 인터셉트된
request.url정보를AdTrackingURLStore.writeDataToSharedFolder()함수를 통해 공유 저장소에 기록합니다. - **
URLSessionConfiguration.protocolClasses**에CustomURLProtocol.self를 설정하여 **특정URLSession**의 요청을 프록시합니다.
교차 프로세스 데이터 공유 및 UITest 활용
- 앱 타겟과 UI 테스트 타겟은 별도의 프로세스로 실행되므로, 인메모리 싱글톤 객체로는 데이터 공유가 불가능합니다.
SIMULATOR_SHARED_RESOURCES_DIRECTORY환경 변수를 활용하여 시뮬레이터의 공유 파일 시스템에 접근합니다.- **
AdTrackingURLStore**는 공유 디렉토리 내storedUrls.txt파일에 URL을 기록하고, **numberOfTextInSharedFolder()**를 통해 기록된 URL의 개수를 검증하여 중복 적재 등의 오류를 방지합니다. - **
XCUIApplication**의launchEnvironment프로퍼티를 사용하여 UITest 실행 시 가짜(Fake) JSON 데이터 파일 이름을 앱에 전달합니다. - **
accessibilityIdentifier**를 사용하여 UI 요소를 식별하고 **XCUIElement**의tap(),swipeLeft()등의 메서드로 사용자 액션을 시뮬레이션하여 광고 이벤트를 트리거합니다.
테스트 데이터 관리 및 의존성 주입
- 네트워크를 통한 동적 데이터 로딩은 테스트의 느린 실행, 불안정성, 결과의 비일관성을 초래합니다.
- **
Protocol**과 의존성 주입(Dependency Injection) 패턴을 활용하여SearchResultRepository와 같은 데이터 소스를 추상화합니다. - 실제 네트워크 호출 구현체(
SearchResultRepositoryImp)와 로컬 JSON 파일을 로딩하는 가짜 구현체(FakeSearchResultRepository)를 분리합니다. - UITest 환경에서는 **
XCUIApplication.launchEnvironment**를 통해 특정 JSON 파일(ModuleA.json)을 지정하여, 앱 내부에서ProcessInfo.processInfo.environment를 이용해 동적으로 테스트 데이터를 로딩하게 합니다.