이미지 로딩 중...

SwiftUI 테스트 전략 완벽 가이드 - 슬라이드 1/11
C

CodeDeck AI

2025. 11. 8. · 1 Views

SwiftUI 테스트 전략 완벽 가이드

SwiftUI 앱의 품질을 보장하기 위한 테스트 전략을 초급자도 이해할 수 있게 설명합니다. 단위 테스트부터 UI 테스트까지 실전 예제와 함께 학습할 수 있습니다.


카테고리:Flutter
언어:Dart
난이도:intermediate
메인 태그:#SwiftUI
서브 태그:
#UnitTest#UITest#ViewModelTest#MockData

들어가며

이 글에서는 SwiftUI 테스트 전략 완벽 가이드에 대해 상세히 알아보겠습니다. 총 10가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. 기본_단위_테스트_설정
  2. ViewModel_테스트하기
  3. Mock_데이터_사용하기
  4. 비동기_코드_테스트
  5. UI_테스트_기본
  6. View_존재_여부_테스트
  7. Navigation_테스트
  8. 입력_검증_테스트
  9. 상태_변화_테스트
  10. 에러_처리_테스트

1. 기본_단위_테스트_설정

개요

SwiftUI 프로젝트에서 XCTest를 사용한 기본 단위 테스트 설정 방법입니다. 테스트 케이스 클래스를 생성하고 간단한 함수를 테스트합니다.

코드 예제

import XCTest
@testable import MyApp

final class CalculatorTests: XCTestCase {
    func testAddition() {
        let result = Calculator.add(2, 3)
        XCTAssertEqual(result, 5)
    }
}

설명

XCTestCase를 상속받아 테스트 클래스를 만들고, XCTAssertEqual로 예상값과 실제값을 비교하여 테스트합니다.


2. ViewModel_테스트하기

개요

MVVM 패턴에서 ViewModel의 비즈니스 로직을 테스트하는 방법입니다. 상태 변화와 데이터 처리를 검증합니다.

코드 예제

final class UserViewModelTests: XCTestCase {
    func testUserLogin() {
        let viewModel = UserViewModel()
        viewModel.login(email: "test@test.com", password: "123")

        XCTAssertTrue(viewModel.isLoggedIn)
        XCTAssertEqual(viewModel.userName, "Test User")
    }
}

설명

ViewModel의 login 메서드를 호출한 후, 상태(isLoggedIn)와 데이터(userName)가 올바르게 변경되었는지 검증합니다.


3. Mock_데이터_사용하기

개요

실제 네트워크 요청 대신 Mock 데이터를 사용하여 안정적이고 빠른 테스트를 수행합니다.

코드 예제

class MockAPIService: APIServiceProtocol {
    func fetchUsers() async -> [User] {
        return [
            User(id: 1, name: "John"),
            User(id: 2, name: "Jane")
        ]
    }
}

설명

프로토콜을 준수하는 Mock 클래스를 만들어 실제 API 대신 가짜 데이터를 반환하여 테스트의 독립성을 보장합니다.


4. 비동기_코드_테스트

개요

async/await를 사용하는 비동기 함수를 테스트하는 방법입니다. Swift 5.5 이상에서 사용 가능합니다.

코드 예제

func testFetchData() async throws {
    let service = DataService()
    let data = try await service.fetchData()

    XCTAssertNotNil(data)
    XCTAssertGreaterThan(data.count, 0)
}

설명

async throws를 사용하여 비동기 함수를 테스트하고, await로 결과를 기다린 후 데이터의 유효성을 검증합니다.


5. UI_테스트_기본

개요

XCUITest를 사용하여 실제 사용자 인터랙션을 시뮬레이션하고 UI 요소를 테스트합니다.

코드 예제

final class LoginUITests: XCTestCase {
    func testLoginFlow() {
        let app = XCUIApplication()
        app.launch()

        app.textFields["Email"].tap()
        app.textFields["Email"].typeText("test@test.com")
        app.buttons["Login"].tap()
    }
}

설명

XCUIApplication으로 앱을 실행하고, 텍스트 필드와 버튼을 찾아 실제 사용자처럼 탭하고 텍스트를 입력합니다.


6. View_존재_여부_테스트

개요

특정 조건에서 SwiftUI View가 올바르게 표시되는지 테스트합니다.

코드 예제

func testWelcomeMessageAppears() {
    let app = XCUIApplication()
    app.launch()

    let welcomeText = app.staticTexts["Welcome!"]
    XCTAssertTrue(welcomeText.exists)
    XCTAssertEqual(welcomeText.label, "Welcome!")
}

설명

staticTexts로 텍스트 요소를 찾고, exists로 존재 여부를 확인하며, label 속성으로 정확한 텍스트를 검증합니다.


개요

SwiftUI의 NavigationStack을 사용한 화면 전환이 올바르게 작동하는지 테스트합니다.

코드 예제

func testNavigationToDetail() {
    let app = XCUIApplication()
    app.launch()

    app.buttons["Show Detail"].tap()

    XCTAssertTrue(app.navigationBars["Detail"].exists)
}

설명

버튼을 탭하여 화면 전환을 실행하고, navigationBars로 새로운 화면의 네비게이션 바가 나타났는지 확인합니다.


8. 입력_검증_테스트

개요

사용자 입력값에 대한 유효성 검사 로직을 테스트합니다.

코드 예제

final class ValidationTests: XCTestCase {
    func testEmailValidation() {
        XCTAssertTrue(Validator.isValidEmail("test@test.com"))
        XCTAssertFalse(Validator.isValidEmail("invalid-email"))
        XCTAssertFalse(Validator.isValidEmail(""))
    }
}

설명

다양한 이메일 형식을 테스트하여 유효성 검사 함수가 올바른 결과를 반환하는지 확인합니다.


9. 상태_변화_테스트

개요

SwiftUI의 @Published 속성이나 @State 변화를 Observable 패턴으로 테스트합니다.

코드 예제

func testStateChange() {
    let viewModel = CounterViewModel()

    viewModel.increment()
    XCTAssertEqual(viewModel.count, 1)

    viewModel.decrement()
    XCTAssertEqual(viewModel.count, 0)
}

설명

ViewModel의 메서드를 호출하여 상태가 예상대로 변경되는지 단계별로 검증합니다.


10. 에러_처리_테스트

개요

네트워크 오류나 예외 상황에서 앱이 올바르게 에러를 처리하는지 테스트합니다.

코드 예제

func testErrorHandling() async throws {
    let service = FailingAPIService()

    do {
        _ = try await service.fetchData()
        XCTFail("Should throw error")
    } catch {
        XCTAssertTrue(error is NetworkError)
    }
}

설명

의도적으로 실패하는 서비스를 사용하여 에러가 발생하는지, 올바른 타입의 에러인지 검증합니다.


마치며

이번 글에서는 SwiftUI 테스트 전략 완벽 가이드에 대해 알아보았습니다. 총 10가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.

관련 태그

#SwiftUI #UnitTest #UITest #ViewModelTest #MockData

#SwiftUI#UnitTest#UITest#ViewModelTest#MockData#Flutter

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.