[iOS] Networking Test

학습내용


네트워크 테스트란 무엇인가?

잘못된 네트워크 테스트

import XCTest
@testable import OpenMarket
final class OpenMarketNetworkTests: XCTestCase {
    var sut_networkManager: NetworkManager!
    var sut_apiNode: APINode!
    
    override func setUpWithError() throws {
        try super.setUpWithError()
        sut_networkManager = NetworkManager()
        sut_apiNode = APINode()
        
    }

    override func tearDownWithError() throws {
        try super.tearDownWithError()
        sut_networkManager = nil
        sut_apiNode = nil
    }
    
    func test_getItemList_title() {
        let expectation = XCTestExpectation()

        sut_networkManager.getItemList(node: sut_apiNode, page: 1) { result in
            // given
            expectation.fulfill()
            switch result {
            // when
            case .success(let itemList):
                // then
                XCTAssertEqual(itemList.items[0].title, "MacBook Pro" )
            case .failure(let error):
                XCTFail("\(error)")
            }
        }
        wait(for: [expectation], timeout: 2)
    }

}

해당 테스트가 잘못된 이유는 이 테스트는 절대적으로 네트워크에 의존하고 있기 때문입니다. 그렇기 때문에 인터넷연결이 끊어지면 테스트에 실패하게 될 것입니다. 테스트가 외부변수에 의해 영향을 받고 있기 때문에 잘못된 테스트인 것입니다.

이를 개선하기 위해서는 실제 production 네트워크 매니저와 테스트에서 사용할 네트워크 매니저를 분리 시켜야 합니다. 즉 실제 앱에서는 실제 URLSession을 제공하는 네트워크 매니저를 사용할 것이지만 테스트환경에서는 이 URLSession을 흉내 내는 Mock Object를 사용해야 합니다.

[참고]:

Let's TDD - 전수열

iOS Networking and Testing - 조원 (우아한형제들 기술블로그)

좋은 웹페이지 즐겨찾기