WWDC가 열리는 컨벤션 센터 주변에 무엇이 있는지 알려주는 앱을 만들었다. 이 앱에 대한 테스트를 예시로 들겠다.
애플이 제시하는 4가지의 테스트 팁들을 알아보자!
들어가기 전에 WWDC17 세션 Engineering for Testability 에서 발표했던 테스트 피라미드에 관해서 언급하고 넘어가겠다.
앱에 네트워크를 설계 했을 때 나온 도식화 된 그림이다.
URLRequest
를 준비하고task
가 서버와 통신을 하고코드로 보면 다음과 같다.
URLSessionDataTask
을 조금이라도 사용해봤다면 쉽게 볼 수 있는 코드이다.
위치좌표를 매개변수로 받아와서 네트워크 요청을 만들고 실제로 요청하고 테이블 뷰에 뿌려주는 코드이다.
각 초록색 네모 하나를 한개의 유닛테스트로 만들어려고 한다.
그러기 위해서는 loadData
함수를 유닛테스트가 용이하게 나눠야 한다.
URLRequest생성과 파싱 부터 해보자
URLResquest
를 생성주는 함수 를 하나의 구조체로 만들어 주었다.
URLResquest
를 만들고 안에 있는 url이 잘 만들었는지를 테스트하고 있다.
파싱하는 함수도 마찬가지로 테스트할 수 있다.
이제 URLSession
을 테스트 해보자!
URLSession
을 가지고 있어서 서버와 통신을 하는 클래스도 뷰컨에 분리해주었다. (APIRequestLoader
)dataTask
를 사용해서 네트워크 요청을 하고 데이터를 파싱하는 기능을 수행하는 함수를 만들었습니다.
URLSession
이 원하는 데이터를 잘 가지고 오는지 테스트 할 수 있지만 여기서는 URLRequest
를 만들고 파싱까지 해주는 일련의 과정을 테스트 하려고 한다(Integration
테스트)
URLSession
은 네트워크 통신을 할 수 있는 high level API를 제공한다.URLProtocol
이라는 low level API도 제공한다. 네트워크 연결을 열고, request를 쓰고, response를 주는 역활을 할 수 있다.URLProtocol
은 단독으로 쓰이지 않고 상속을 받도록 설계되어져 있다. URL 로딩 시스템을 확장할 수 있게 한다.URLProtocol
을 사용해서 Mock 객체를 만들고 Mock response를 만들어서 테스트를 진행할 수 있다.MockURLProtocol
을 만들어 준다.requestHandler
라는 클로져를 제공한다. URLSessionDataTask
가 제공하는 클로져 타입으로 두면 된다.startLoading()
함수에 실제 클로져가 동작을 하도록 작성한다.setup
에서 위에서 만든 MockUrlProtocol
을 configuration
에 넣어주면 개발자가 임의로 작성한 코드가 URLSession 내부에서 실행될 것이다.
requestHandler
안에서 요청한 url이 잘 들어왔는지 테스트를 한다.dataTask
의 resume
메소드 호출을 빼먹은 것을 테스트를 통해서 알았다고 한다.