XCTest with Objective-C 개요

SeungHeon Kim·2022년 4월 29일
0

본 내용은 Apple 공식 Documentation에 기반해 작성되었다.
Apple_Documentation_for_XCTest with Objective-C

개요

기본적으로 Xcode 프로젝트에 테스트 메소드를 추가해서 XCTest 기능을 사용할 수 있는데, 각 테스트 케이스는 .XCTestCase 의 subclass 다. 다음은 설명을 돕는 예시 코드다.

이 예제에서는 테스트 메소드 하나로 테스트 케이스를 정의한다. 이 테스트 메소드는 Table이라는 클래스의 새 인스턴스 table을 만들고 초기화 후 table의 행과 열이 모두 0인지 확인한다.

@interface TableValidationTests: XCTestCase									// 1
@end
@implementation TableValidationTests
/// Tests that a new table instance has zero rows and columns.
- (void)testEmptyTableRowAndColumnCount {									// 2
    Table *table = [[Table alloc] init];
    XCTAssertEqual(table.rowCount, 0, "Row count was not zero.");			// 3
    XCTAssertEqual(table.columnCount, 0, "Column count was not zero.");
}
@end

- 위의 코드처럼 프로젝트에 테스트를 추가하려면:

  1. XCTestCase의 하위 클래스(테스트 케이스)를 만든다.
  2. 테스트 케이스에 하나 이상의 테스트 메소드를 추가한다.
  3. 각 테스트 메소드에 하나 이상의 XCTest Assertion을 추가한다.

여기에서 테스트 메소드는 매개변수, 리턴값이 없고 이름이 'test' 로 시작해야 한다.


상태 설정 및 해제

추가적인 내용은 애플 공식 문서 링크에서 확인하길 바란다.

테스트를 실행하기 전에 초기 상태를 준비하고 테스트가 완료된 후 리소스를 정리해야 한다. 어떤 경우에는 테스트 케이스의 모든 테스트 메소드의 상태를 설정해야 할 때도 있다. 또한 테스트가 완료된 후 임시 파일이나 스크린샷과 같이 필요하지 않는 파일을 삭제하고, 실패 진단을 돕기 위해 테스트 후 최종 상태를 캡처할 수도 있다.

테스트 클래스에서 언제 상태를 설정하고 해제할지 결정

테스트 케이스를 실행할 때, XCTest는 먼저 XCTestCase setUp() 메소드를 호출한다. 이 메소드로 테스트 케이스의 모든 테스트 메소드에 공통적인 상태를 설정한다. 다음은 각 메소드의 호출 순서다.

  1. class func setUp()
  2. func setUpWithError()
  3. func setUp()
  4. testMethod() and addTestdownBlock(_:)
  5. func testDown()
  6. func tearDownWithError()
  7. class func tearDown()

1. class func setUp()

타입 메소드로 테스트 시작 전 딱 한 번만 호출된다. 그래서 보통 모든 테스트 메소드에서 실행 전에 정의하거나 초기화할 작업을 오버라이드하여 구현한다.

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

2. func setUpWithError()

각 테스트 메서드가 실행되기 전에 실행됩니다. 각각의 테스트 메서드 실행 전에 정의하거나 초기화할 작업을 오버라이드하여 구현합니다.

- (BOOL)setUpWithError:(NSError *__autoreleasing  _Nullable *)error {
    // This is the setUpWithError instance method.
    // XCTest calls it before each test method.
    // Set up any synchronous per-test state that might throw errors here.
    return YES;
}

3. func setUp()

setUpWithError() 메서드와 동일하게 각 테스트 메서드가 실행되기 전에 실행됩니다. 두 메서드의 차이점은 setUpWithError() 메서드는 실행 도중 발생한 에러를 처리할 수 있다는 점입니다.

4. testMethod() and addTestdownBlock(_:)

실질적인 테스트를 수행하는 메서드입니다. 꼭 테스트 메서드의 이름을 testMethod로 지을 필요없이 자유롭게 설정할 수 있습니다. addTestdownBlock(:) 메서드는 testMethod()가 종료될 때 실행되는 코드 블록입니다. addTestdownBlock(:) 메서드 블록은 먼저 선언된 블럭이 나중에 실행되는 LIFO 구조의 방식으로 호출됩니다.

5. func testDown()

각 테스트 메서드가 종료되고 나서 실행됩니다. 각각의 테스트 메서드를 수행하고 정리하는 작업을 오버라이드하여 구현합니다.

6. func tearDownWithError()

tearDown() 메서드와 마찬가지로 각 테스트 메서드가 종료되고 나서 실행됩니다. 두 메서드의 차이점은 setUpWithError() 메서드는 실행 도중 발생한 에러를 처리할 수 있다는 점입니다.

- (BOOL)tearDownWithError:(NSError *__autoreleasing  _Nullable *)error {
    // This is the tearDownWithError instance method.
    // XCTest calls it after each test method.
    // Perform any synchronous per-test cleanup that might throw errors here.
    return YES;
}

7. class func tearDown()

타입 메서드로 모든 테스트가 종료되고 딱 한 번만 호출됩니다. 그래서 모든 테스트를 마치고 정리해야 할 작업을 오버라이드하여 구현합니다.

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

다음은 애플 공식 문서에 있는 테스트 메소드 호출 순서도다.

0개의 댓글