본 내용은 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
- XCTestCase의 하위 클래스(테스트 케이스)를 만든다.
- 테스트 케이스에 하나 이상의 테스트 메소드를 추가한다.
- 각 테스트 메소드에 하나 이상의 XCTest Assertion을 추가한다.
여기에서 테스트 메소드는 매개변수, 리턴값이 없고 이름이 'test' 로 시작해야 한다.
추가적인 내용은 애플 공식 문서 링크에서 확인하길 바란다.
테스트를 실행하기 전에 초기 상태를 준비하고 테스트가 완료된 후 리소스를 정리해야 한다. 어떤 경우에는 테스트 케이스의 모든 테스트 메소드의 상태를 설정해야 할 때도 있다. 또한 테스트가 완료된 후 임시 파일이나 스크린샷과 같이 필요하지 않는 파일을 삭제하고, 실패 진단을 돕기 위해 테스트 후 최종 상태를 캡처할 수도 있다.
테스트 케이스를 실행할 때, XCTest는 먼저 XCTestCase setUp() 메소드를 호출한다. 이 메소드로 테스트 케이스의 모든 테스트 메소드에 공통적인 상태를 설정한다. 다음은 각 메소드의 호출 순서다.
- class func setUp()
- func setUpWithError()
- func setUp()
- testMethod() and addTestdownBlock(_:)
- func testDown()
- func tearDownWithError()
- class func tearDown()
타입 메소드로 테스트 시작 전 딱 한 번만 호출된다. 그래서 보통 모든 테스트 메소드에서 실행 전에 정의하거나 초기화할 작업을 오버라이드하여 구현한다.
+ (void)setUp { // This is the setUp class method. // XCTest calls it before calling the first test method. // Set up any overall initial state here. }
각 테스트 메서드가 실행되기 전에 실행됩니다. 각각의 테스트 메서드 실행 전에 정의하거나 초기화할 작업을 오버라이드하여 구현합니다.
- (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; }
setUpWithError() 메서드와 동일하게 각 테스트 메서드가 실행되기 전에 실행됩니다. 두 메서드의 차이점은 setUpWithError() 메서드는 실행 도중 발생한 에러를 처리할 수 있다는 점입니다.
실질적인 테스트를 수행하는 메서드입니다. 꼭 테스트 메서드의 이름을 testMethod로 지을 필요없이 자유롭게 설정할 수 있습니다. addTestdownBlock(:) 메서드는 testMethod()가 종료될 때 실행되는 코드 블록입니다. addTestdownBlock(:) 메서드 블록은 먼저 선언된 블럭이 나중에 실행되는 LIFO 구조의 방식으로 호출됩니다.
각 테스트 메서드가 종료되고 나서 실행됩니다. 각각의 테스트 메서드를 수행하고 정리하는 작업을 오버라이드하여 구현합니다.
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; }
타입 메서드로 모든 테스트가 종료되고 딱 한 번만 호출됩니다. 그래서 모든 테스트를 마치고 정리해야 할 작업을 오버라이드하여 구현합니다.
+ (void)tearDown { // This is the tearDown class method. // XCTest calls it after the last test method completes. // Perform any overall cleanup here. }
다음은 애플 공식 문서에 있는 테스트 메소드 호출 순서도다.