[Swift] Xcode로 단위 테스트 따라해보기 - 3

민경준·2023년 3월 6일
0

🌟 XCTest란?

XCTest는 Xcode 프로젝트에서 활용할 수 있는 테스트 환경을 제공하는 프레임워크이다.
단위 테스트(Unit Test), 사용자 인터페이스 테스트(UI Test), 성능 테스트(Performance Test) 등을 수행할 수 있다.
Xcode 프로젝트에서 테스트 코드를 사용하기 위해서는 이 XCTest 프레임워크를 반드시 import 해야한다.

XCTest | Apple Developer Documentation

🌟 XCTestCase

import XCTest

class StrangeCalculatorTests: XCTestCase {
    ...
}

SampleTest.swift 파일을 열어보면 테스트를 위한 클래스가 만들어져있는 것을 확인할 수 있다. 테스트 클래스가 상속하고 있는 XCTestCase는 무엇일까?

XCTestCase는 추상 클래스인 XCTest의 하위 클래스로, 테스트를 작성하기 위해 상속해야 하는 가장 기본적인 클래스입니다. XCTest는 테스트를 위한 프레임워크의 이름이기도 하고, 테스트에서 가장 기본이 되는 추상 클래스의 이름이기도 하다. (프레임워크와 클래스의 이름이 같다.)

XCTestCase를 상속받은 클래스에서는 test에서 사용되는 다양한 프로퍼티와 메서드를 사용할 수 있습니다.

setUp()

override class func setUp() {
    // This is the setUp() class method.
    // XCTest calls it before calling the first test method.
    // Set up any overall initial state here.
}

setUp() 클래스 메서드는 첫 번째 테스트 메서드가 호출되기 전에 테스트 케이스에 대해 정확히 한 번 호출된다. 테스트 케이스의 모든 테스트에 대한 초기 상태를 지정하려면 override하여 구현한다.

setUpWithError()

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

setUpWithError()는 각각의 test case가 실행되기 전마다 호출되어 각 테스트가 모두 같은 상태와 조건에서 실행될 수 있도록 만들어 줄 수 있는 메서드다.

예를 들어 몇몇 테스트가 A라는 값에 대해서 이루어지고 있는데, 먼저 작성된 case에 의해서 A의 값이 변경된다면 다음 테스트는 정상적으로 이루어지지 않을 위험이 있다.

정상적으로 테스트를 하기 위해서는 setUpWithError와 같은 메서드를 통해 test case가 이루어질 때마다 테스트의 상태를 reset시켜주어야 합니다.

tearDownWithError()

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

tearDownWithError()는 각각의 test 실행이 끝난 후마다 호출되는 메서드이다. 보통 setUpWithError()에서 설정한 값들을 해제하거나 모든 상태를 clean up 할 때 사용한다.

tearDown()

override class func tearDown() {
    // This is the tearDown() class method.
    // XCTest calls it after the last test method completes.
    // Perform any overall cleanup here.
}

tearDown() 클래스 메서드는 마지막 테스트 메서드가 완료된 후 테스트 케이스에 대해 정확히 한 번 호출된다. 모든 테스트 메서드가 종료된 후 clean up 하려면 이 메서드를 override하여 구현한다.

위의 함수들의 호출 순서는 아래의 그림과 같다.

🤔 setUp()tearDown()라는 인스턴스 메서드도 있던데 무슨 차이일까?

setUp()tearDown() 메서드와 setUpWithError(), tearDownWithError()의 차이는 에러를 throw 할 수 있느냐에 대한 차이다.

테스트 메서드를 throw 메서드로 만들어주면, 내부에서 따로 에러 핸들링을 해주는 작업없이 테스트를 작성할 수 있다는 이점이 있다.

원래는 setUp()tearDown() 메서드가 기본 메서드로 제공이 되었는데 Xcode 11.4 버전 이후로 기본으로 setUpWithError(), tearDownWithError()를 제공하고 있다.

이에 대한 내용이 좀 더 내용이 궁금하다면 Understanding Setup and Teardown for Test Methods 문서를 참고해보면 좋을 것 같다.

profile
iOS Developer 💻

0개의 댓글