iOS 테스팅⚒️: 엣지 케이스 명시 vs 무작위
iOS 네트워크 테스트 코드 작성시 마주할 수 있는 상황에서 어떤 선택을 할 수 있는지를 살펴보려고 합니다😀 ✅ 첫 번째 테스트 케이스 ``` func test_load_deliversErrorOnNon200HTTPResponse() { let (sut, client) = makeSUT() let samples = [199, 201, 300, 400, 500] samples.enumerated().forEach { index, code in .... 검증 .... } } ``` ✅ 두 번째 테스트 케이스 ``` func test_load_deliversErrorOnNon200HTTPResponse() { let (sut, client) = makeSUT() let json = makeItemsJSON([]) expect(sut, toCompleteWith: failure(.invalidData), when: { client.complete(withStatusCode: Int.random(in: 1...199), data: json, at: 0) }) expect(sut, toCompleteWith: failure(.invalidData), when: { client.complete(withStatusCode: Int.random(in: 201...999), data: json, at: 1) }) } ``` 두 가지 테스트 케이스는 API Requeste HTTP 응답이 200이 아닐 때 에러를 올바르게 처리하고 있는지 검증합니다. 다른 점은 첫 번째는 ‘에지 케이스’를 명시적으로 다루고 있고 두 번째는 무작위 값을 사용하고 있습니다. 무작위 값을 사용하는 것이 단위 테스트의 견고성을 보장하는 좋은 방법이라고 말하는 엔지니어들이 있습니다. 그 이유는 무작위 값을 사용하면 테스트 커버리지를 개선할 수 있기 때문입니다. 하지만 무작위 값을 사용한다고 에지 케이스를 모두 커버한다고 보장할 수 없습니다. 또한, 무작위 값을 사용할 때 주어진 범위 내 모든 케이스를 확인하기 위해 테스트를 여러 번 실행하고 그 결과로 테스트 스위트의 속도가 느려질 수 있다는 점에 유의해야 합니다. 이런 문제를 해결하기 위해 테스트 샘플을 안정적으로 무작위화하기 위한 라이브러리와 프레임워크가 존재합니다. 예를 들어, 속성 기반 테스트입니다. 💡 iOS 프로그래밍에서 테스트 케이스를 작성할 때 에지 케이스는 명시적으로 다루는 것이 좋습니다. 백엔드 개발자와의 계약에 따라 Status Code 200만 허영되는지 확인하고 싶다면, - Status Code 200 - Status Code 200 미만(199) - Status Code 200 이상(201) - 프로덕션 코드가 Statud Code를 확인하기 위해 하드코딩된 값을 사용하지 않는지 확인하기 위한 몇 가지 추가 케이스 등 이 정도 수준의 명시적인 엣지 케이스를 만들어 테스트한다면 보다 가치있는 테스트 코드를 작성할 수 있다고 생각합니다👍👍👍