[WWDC18] Testing Tips & Tricks(1) - Testing network requests

seunkim·2021년 9월 8일
0

WWDC

목록 보기
1/1
post-thumbnail

WWDC가 열리는 컨벤션 센터 주변에 무엇이 있는지 알려주는 앱을 만들었다. 이 앱에 대한 테스트를 예시로 들겠다.

애플이 제시하는 4가지의 테스트 팁들을 알아보자!

Testing network requests

테스트 피라미드

들어가기 전에 WWDC17 세션 Engineering for Testability 에서 발표했던 테스트 피라미드에 관해서 언급하고 넘어가겠다.

Unit Test

  • 한개의 메소드나 클래스를 테스트하는 가장 작은 단위이다.
  • 메소드의 성공, 실패등을 테스트 한다.
  • 1분당 수백, 수천개의 테스트를 진행할 수 있다.

Integration

  • 한 개의 기능이 잘 작동하는 지를 테스트 하는 것이다.
  • 여러 계층으로 연결된 클래스나 메소드가 잘 동작하는지 확인한다.

End-to-end

  • 하나의 프로그램이나 앱이 잘 동작하는지를 테스트 하는 것이다
  • 사용자가 기기에서 수행하는 동작들을 테스트 한다.
  • 주로 UI Test로 진행한다.
  • 앱 내부 뿐만 아니라 OS나 외부 리소스와도 잘 상호작용을 하는지 확인을 한다.

앱에 네트워크를 설계 했을 때 나온 도식화 된 그림이다.

  • 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 에서 위에서 만든 MockUrlProtocolconfiguration에 넣어주면 개발자가 임의로 작성한 코드가 URLSession 내부에서 실행될 것이다.

  • requestHandler 안에서 요청한 url이 잘 들어왔는지 테스트를 한다.
  • 가짜 response와 Jsondata를 return 한다
  • 네트워크 요청을 함수를 호출하고 결과값인 모델이 같은지 테스트를 한다. -> 이렇게 함으로써 request생성, 네크워트 요청, 파싱까지의 과정을 테스트 했다.
  • 발표자는 dataTaskresume 메소드 호출을 빼먹은 것을 테스트를 통해서 알았다고 한다.

  • 뷰까지 업데이트를 함으로써 End to End 테스트를 할 수 있다.
  • 이때 UI Test까지 해야 함으로 WWDC15 UI Test 세션을 참고해서 진행해보자.

  • End to End 테스트는 코드의 양이 방대하기 때문에 어디서부터 봐야할지를 잘 모른다.
  • 실제 서버는 매번 요청에 다른 결과를 줄 수 있음으로 Mock Server를 사용해서 외부 요인의 방해를 받지 않도록 해보자.

요약

느낀점

  • URLProtocol을 잘 알면 쓰일 곳이 많을 것 같다.
  • 13분 내용 정리하는데.. 6시간이 걸리다니..
profile
기록과 정리

0개의 댓글