본문 바로가기
iOS

[iOS/Xcode] XCTest 활용하여 UnitTest 하기 🍀

by 개발하는 감자입니다 2024. 7. 24.
728x90

XCTest 프레임워크를 활용하는 방안을 구체적으로 설명하겠습니다. XCTest는 Apple의 표준 테스트 프레임워크로, 단위 테스트 및 성능 테스트를 작성하고 실행할 수 있게 해줍니다. 이 프레임워크는 Xcode와 통합되어 있어 iOS, macOS, watchOS, tvOS 애플리케이션을 개발할 때 사용됩니다.

1. XCTest 설정 및 기본 사용법

1-1. 테스트 타겟 추가

프로젝트에 테스트 타겟을 추가하려면 다음 단계를 따릅니다:

  1. Xcode에서 프로젝트 선택: 프로젝트 탐색기에서 프로젝트를 선택합니다.
  2. 테스트 타겟 추가:
    • 상단 메뉴에서 File > New > Target을 선택합니다.
    • 플랫폼을 선택하고 Unit Testing Bundle을 선택한 후 Next를 클릭합니다.
    • 테스트 타겟의 이름을 입력하고 Finish를 클릭합니다.

1-2. 테스트 파일 생성

테스트 파일을 생성하려면 다음 단계를 따릅니다:

  1. 테스트 폴더 선택: 프로젝트 탐색기에서 생성된 테스트 타겟의 폴더를 선택합니다.
  2. 새 파일 생성: 상단 메뉴에서 File > New > File을 선택합니다.
  3. Swift 파일 선택: Swift File을 선택한 후 Next를 클릭합니다.
  4. 파일 이름 입력: 파일 이름을 입력하고 Create를 클릭합니다.

1-3. XCTestCase 서브클래스 작성

테스트 파일에서 XCTestCase를 상속받아 테스트 클래스를 작성합니다. 예를 들어, MyAppTests.swift 파일에 다음과 같이 작성할 수 있습니다:

import XCTest
@testable import MyApp

class MyAppTests: XCTestCase {

    override func setUpWithError() throws {
        // 각 테스트 메서드 호출 전에 실행됩니다.
    }

    override func tearDownWithError() throws {
        // 각 테스트 메서드 호출 후에 실행됩니다.
    }

    func testExample() throws {
        // 테스트 코드 작성
        XCTAssertEqual(1 + 1, 2)
    }
}

2. 구체적인 테스트 작성 방법

2-1. 단위 테스트(Unit Test)

단위 테스트는 개별 함수나 메서드가 예상대로 작동하는지 확인합니다. 예를 들어, PointManager 클래스의 calculatePoint 메서드를 테스트하는 코드를 작성할 수 있습니다:

class PointManager {
    func calculatePoint(for products: [Product]) -> Double {
        let points = Double(products.count) * 0.05
        return min(points, 0.2)
    }
}

class PointManagerTests: XCTestCase {
    func testCalculatePoint() throws {
        let productA = Product(name: "Book", price: 3000)
        let productB = Product(name: "Pencil", price: 1000)
        let sut = PointManager()
        let points = sut.calculatePoint(for: [productA, productB])
        XCTAssertEqual(points, 0.1)
    }
}

2-2. 성능 테스트(Performance Test)

성능 테스트는 특정 코드 블록이 주어진 시간 내에 실행되는지 확인합니다. measure 메서드를 사용하여 성능 테스트를 작성할 수 있습니다:

class PerformanceTests: XCTestCase {
    func testPerformanceExample() throws {
        self.measure {
            // 성능을 측정할 코드 블록
            _ = (0..<1000).map { $0 * $0 }
        }
    }
}

2-3. 비동기 코드 테스트

비동기 코드를 테스트하려면 expectation을 사용하여 비동기 작업이 완료될 때까지 기다릴 수 있습니다:

class AsyncTests: XCTestCase {
    func testAsyncExample() throws {
        let expectation = self.expectation(description: "Async Task")
        someAsyncFunction {
            // 비동기 작업 완료
            expectation.fulfill()
        }
        waitForExpectations(timeout: 5, handler: nil)
    }
}

3. XCTest 활용 팁

  1. 테스트의 이름 짓기: 테스트 메서드의 이름은 해당 테스트가 무엇을 검증하는지 명확히 나타내야 합니다. 예를 들어, testCalculatePoint 대신 testCalculatePointForTwoProducts와 같이 더 구체적으로 작성합니다.
  2. 테스트의 독립성 유지: 각 테스트는 독립적으로 실행되어야 합니다. 테스트 간의 상호 의존성을 피하고, setUp 및 tearDown 메서드를 사용하여 초기화 및 정리 작업을 수행합니다.
  3. 자주 실행: 코드를 변경할 때마다 테스트를 자주 실행하여 변경 사항이 기존 기능에 영향을 미치지 않도록 합니다.
  4. 커버리지 확인: Xcode에서 테스트 커버리지를 확인하여 코드의 어느 부분이 테스트되지 않았는지 파악할 수 있습니다.

4. XCTest 결과 확인 및 디버깅

테스트를 실행한 후, Xcode는 테스트 결과를 보여줍니다. 실패한 테스트는 빨간색으로 표시되며, 성공한 테스트는 녹색으로 표시됩니다. 실패한 테스트를 클릭하면 실패한 위치로 이동하여 디버깅할 수 있습니다.

XCTest를 활용하면 코드의 신뢰성을 높이고, 유지보수를 용이하게 할 수 있습니다. 다양한 테스트 기법을 활용하여 모든 중요한 시나리오를 검증하는 것이 중요합니다.

🍎 참고. 애플 공식 문서

 

XCTest | Apple Developer Documentation

Create and run unit tests, performance tests, and UI tests for your Xcode project.

developer.apple.com

 

728x90
반응형