Unit Test는 Unit(소프트웨어의 개별 구성 요소)이 예상대로 작동하는지 검증하는 테스트 방법이다. Swift에서는 XCTest 프레임워크를 사용하여 유닛 테스트를 작성할 수 있다.
테스트는 빨라야 한다.
각각의 테스트가 서로 독립적으로 실행되어야 한다.
테스트는 반복적으로 실행될 수 있고, 항상 같은 결과를 내야 한다.
테스트는 자동으로 결과를 검증할 수 있어야 한다.
특정 상태를 수동으로 미리 만들어야하는 테스트는 만들지 않는다.
코드 수정 후 바로 테스트를 실행해 수정이 다른 기능에 영향을 미치지 않았는지 확인해야한다.
💡 테스트 주도 개발(Test-Driven Development, TDD)에 적합한 원칙이지만, 미처 적용하지 못하는 경우도 있다고 한다.
프로젝트 생성시 Inclide Test
프로젝트 > Editor > Add Target > Unit Testing Bundle
Test Navigator로 생성
테스트 파일 이름은 보통 `~Tests`로 생성한다.
setUp()
: 테스트 메소드 실행 전에 호출되어 초기 설정 수행 (테스트에 필요한 객체 생성, DB 초기화, 네트워크 연결 등)
setUpWithError()
: 테스트 메소드 실행 전에 호출되어 오류가 발생할 수 있는 초기 설정 작업 수행, 초기 설정 중 오류 발생시 알릴 수 있다.
tearDown()
: 테스트 메소드 실행 후에 호출되어 테스트로 인해 변경된 상태를 정리하거나, 사용한 자원을 해제
tearDownWithError()
: 테스트 메소드 실행 후에 호출되어 오류가 발생할 수 있는 작업 수행, 정리 작업 중 오류 발생시 알릴 수 있다.
XCTAssertTrue(_:)
: 주어진 조건이 true인지 검사, false면 실패
XCTAssertFalse(_:)
: 주어진 조건이 false인지 검사, true면 실패
XCTAssertEqual(_:_: )
: 두 값이 같은지 검사, 다르면 실패
XCTAssertNotEqual(_:_: )
: 두 값이 다른지 검사, 같으면 실패
XCTAssertNil(_:)
: 주어진 값이 nil인지 검사, nil이 아니면 실패
XCTAssertNotNil(_:)
: 주어진 값이 nil이 아닌지 검사, nil이면 실패
XCTAssertThrowsError(_:)
: 주어진 코드 블록이 오류를 발생시키는지 검사, 오류 미발생시 실패
XCTAssertNoThrow(_:)
: 주어진 코드 블록이 오류를 발생시키지 않는지 검사, 오류 발생시 실패
테스트 코드를 작성할 때 Given, When, Then 패턴을 사용하면 테스트의 목적과 과정이 명확해지고, 테스트 코드의 가독성을 높일 수 있다.
import XCTest
final class MyFeatureTests: XCTestCase {
override func setUp() {
super.setUp()
// 데이터베이스 초기화, 필요한 객체 생성 등 테스트를 위한 초기 설정
}
override func tearDown() {
// 데이터베이스 정리, 메모리 해제 등 테스트 후 정리 작업
super.tearDown()
}
func testExample() {
// Given 초기 상태 설정
let value = 2
// When 동작 수행
let result = value * 2
// Then 결과 검증
XCTAssertEqual(result, 4, "결과는 4여야 합니다.")
}
}
테스트를 실행하기 전에 설정해야 할 데이터나 환경 등 조건을 정의한다.
Given 단계에서 준비한 조건을 바탕으로 기능을 실행한다.
When 단계에서 수행한 행동의 결과를 검증해서 성공 여부를 판단한다.