EEYatHo 앱 깎는 이야기

Swift ) XCTest UnitTest - EEYatHo iOS 본문

iOS, Swift/Testing

Swift ) XCTest UnitTest - EEYatHo iOS

EEYatHo 2022. 11. 12. 00:50
반응형

 

Test 파일 만들기


  • New File > Unit Test Case Class > 파일명 입력
  • 파일명은 일반적으로 XXXTests 로 짓는다
  • 예시로 User 의 모델이나 API 를 테스트하기 위한 UserTests 를 만들었다.

 

 

 

제공된 함수 설명


UintTest 파일을 만들면 4가지 함수가 있다.

  • setUpWithError : 테스트 시작 직후, 가장 먼저 실행되는 코드. 테스트를 위한 모델이나 시스템을 정의하는 역할.

  • tearDownWithError : 테스트 끝나기 직전, 가장 마지막에 실행되는 코드. release, deinit, dispose 등의 역할.

  • testExample : 테스트 함수 예시.
    testXXX 로 명명된 함수들이 UnitTest 시 모두 실행된다.
    setUpWithError 실행 > 각종 testXXX 함수들 실행 > tearDownWithError 순으로 진행된다.

  • testPerformanceExample : 퍼포먼스를 테스트 하는 함수의 예시.
    measure 함수에 넣어주는 클로저의 실행시간을 측정해준다.
    10번 실행하고, 평균값을 Average 에 넣는 듯 하다.

 

  • 예시 ) setUpWithError 를 활용하여 로그인 한 상태로 테스트 시작하기
@testable import MyApp // 개발한 Target 의 코드를 사용하기 위한 import
override func setUpWithError() throws {
        
    // 로그인 상태로 시작하기
    if !User.info.account.isLogin() {

        let email = "테스트 계정 email"
        let password = "테스트 계정 password"
        let expectation = XCTestExpectation()

        User.info.login(email: email, password: password) { statusCode, _ in
            if statusCode == HttpStatus.success.rawValue {
                expectation.fulfill()
            } else {
                XCTAssertTrue(false)
            }
        }

        wait(for: [expectation], timeout: 5)
    }

}

 

 

 

Test 함수


Test 함수 명명법

  • 여러 명명법이 있는데, test_Given_When_Then 이 가장 합리적인 것 같다.
    • Given : 주어진 상태 ( ex. 유저가 로그인 된 상태에 장바구니에서 : inCartWithLoggedIn )
    • When : 행할 행동 ( ex. 매진된 상품의 +버튼을 누른다 : tabPlusButtonToSoldOutProduct )
    • Then : 기대값 ( ex. 매진된 상품이라는 Alert 가 뜬다 : showSoldOutAlert )
func test_inCartWithLoggedIn_tabPlusButtonToSoldOutProduct_showSoldOutAlert() {...}

 

Test 함수 구성

  • 마찬가지로 Given, When, Then 순서로 작성한다.

예시 )

func test_toNumberArray_filterByOddNumber_getOnlyOddNumbers() {
    // Given
    let arr = [1, 2, 3, 4, 5]
    let expection = [1, 3, 5]

    // When
    let result = arr.filter { $0 % 2 == 1 }
    
    // Then
    XCTAssertEqual(result, expection)
}

 

 

 

 

 

비동기 Test


  • XCTest 에서는 비동기 Test 를 위해, expectation 이라는 기능을 제공하고 있다.
  • expection 을 생성하고, 특정 조건을 만족할 때 까지 wait 할 수 있다.
    애플 문서 링크

 

  • 예시 ) 유저의 AccessToken을 가져오는 API를 테스트하기
// UserId 를 사용하여 AccessToken 을 받아오는 API 테스트
func test_nil_requestAccessTokenWithValidUserId_succesGetAccessToken() {
    
    // Given
    var accessToken: String = ""
    
    // When
    let userId: String = "validUserIdForTest"
    let expectation = XCTestExpectation()
    AccountAPI.requestAccessToken(userId: userId) { _accessToken in
        accessToken = _accessToken
        expectation.fulfill() // 작업 완료 알림
    }
    wait(for: [expectation], timeout: 5.0) // 이 위치에서 작업이 완료될 때 까지 최대 5초 동안 대기.
    
    // Then
    /// accessToken 이 비어있다면 테스트 결과 실패. 비어있지 않다면 통과.
    XCTAssertTrue(!accessToken.isEmpty)
}

 

 

 

Test Flow


  • Class가 다르면 독립적으로 실행
    ( 테스트 파일 3개 만들고 전체 테스트 실행시, 시뮬레이터가 3개 실행된다 )

  • 한 Class 안에서 test함수는 직렬 실행
    ( testAAA 가 끝나야 testBBB 실행 )

  • test함수 실행 순서는, test함수명 오름차순
    ( testAAA, testBBB 중에 testAAA 먼저 실행 )

 

 

 

기타


  • 테스트 실행 단축키 : Command + U
Comments