

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 메소드 호출을 빼먹은 것을 테스트를 통해서 알았다고 한다.

