본문 바로가기

IOS

[IOS] Unit Test

사내에서 Unit Test와 UI Test 고도화를 위해 새로운 TF가 신설되었고
해당 팀의 구성원으로 들어갈 수 있는 기회를 얻었다.
지금까지 테스트 코드를 작성하면서 작업을 진행해오지 않았던 터라 
어디서부터 시작을 해야 될지 감이 오지 않고 있는 상태이다.
물론 맛보기로 간단한 테스트 코드 작성과 테스트 진행 플로우를 익혀보고자 
경험 삼아 진행해 본 적은 있었지만
오래전의 일이라 기억이 가물가물한 상태이다.

 

그래서 이번 기회에 처음부터 다시 Unit Test를 배워본다는 느낌으로 
감을 살려보고자 글을 작성해 보려 한다.

 

먼저 Unit Test Bundle을 만드는 방법에 대해 소개하고자 한다.

프로젝트 생성하기 전 시점이라면 프로젝트 생성 시 아래 이미지와 같이 Include Tests를 체크하면 자동으로 Test Bundle이 생성된다.

 

이미 프로젝트가 생성된 상태라면 Project General 탭 하단에 버튼을 눌러 Unit Testing Bundle을 생성해 주면 된다.

 

이렇게 Test Bundle을 생성하게 되면 swift 파일 하나가 만들어지게 되는데
해당 파일에서 Test 코드를 작성하여 테스트를 진행하면 된다.

 

 

생성된 파일 내부 코드를 보면 4가지 메소드가 작성되어 있는걸 볼 수 있다. 

    override func setUpWithError() throws {
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }

    override func tearDownWithError() throws {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
    }

    func testExample() throws {
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
        // Any test you write for XCTest can be annotated as throws and async.
        // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error.
        // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards.
    }

    func testPerformanceExample() throws {
        // This is an example of a performance test case.
        measure {
            // Put the code you want to measure the time of here.
        }
    }

각 메소드의 역할은 살펴보자면 아래와 같다.

setUpWithError

- 테스트를 진행하게 되면 제일 먼저 실행 될 메소드이다.

테스트를 진행하기에 앞서 초기화가 필요한 데이터들을 set up 시키는 곳이라고 보면 될 것이다.

 

tearDownWithError

- 테스트 진행 과정중 제일 마지막에 실행되는 메소드이다. 

테스트에 필요했었던, 사용했었던 데이터를 해제시키는 작업을 해주는 곳이다.

 

testExample

- testExample 이라는 이름으로 메소드를 하나 제공해 주는데
단순 샘플 코드이므로 제거 후 직접 작성하여 진행해도 무방하며
해당 메소드를 이용해서 테스트를 진행해도 된다.
(메소드의 네이밍은 test를 시작으로 작성한다.)

 

testPerformanceExample

- 성능이나 코드의 실행 속도 테스트를 원할 시 이곳에서 진행한다.

 

 

Practice

예제로 간단한 테스트를 진행해보겠다.

아래 테스트 코드는 String 타입의 값을 ","로 split 진행하여 Array로 return 받은 뒤 
해당 Array의 count를 테스트 하는 케이스이다.

여기서 sut는 테스트 대상(target)을 뜻하며 테스트 관련 용어중 하나이다.

테스트 메소드 내부에서는 XCTAssertEqual을 사용한 걸 볼 수 있다.

인자로 받는 값이 서로 동일한지에 대한 결과를 테스트하고자 할때 사용하면 된다. 

또한 테스트 관련 메소드는 여러가지라서 XCTAssertEqual 뿐만 아니라 다양한 메소드로도 진행 가능하다.

아래 테스트를 진행하면 [1, 2]의 count가 2개인지 체크하게 되기 때문에 
테스트 결과는 성공으로 마무리 될 것이다.

class SplitTests: XCTestCase {
    
    var sut: String = ""

    override func setUpWithError() throws {
        sut = "1, 2"
    }

    override func tearDownWithError() throws {
        sut = ""
    }

    func test_split_result_is_two_element() throws {
        let splitResult = sut.split(separator: ",")
        XCTAssertEqual(splitResult.count, 2)
    }
}

 

여기서 2를 3으로 변경 후 다시 테스트 돌린다면 테스트는 실패하게 된다.

func test_split_result_is_two_element() throws {
        let splitResult = sut.split(separator: ",")
        XCTAssertEqual(splitResult.count, 2)
    }

 

오늘은 이렇게 간단하게 Unit Test를 진행하기 위해 번들을 추가하는 방법, 테스트 코드를 작성하고 실행하는 방법에 대해 알아봤다.

'IOS' 카테고리의 다른 글

[IOS] UI Test  (0) 2022.07.26
[IOS] Submodule 설정  (0) 2022.02.05
[IOS] Fastlane  (0) 2021.10.10
[IOS] TableView (with xib)  (0) 2021.02.21
[IOS] TableView (with Storyboard)  (0) 2021.02.21