🤖

본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.

⚠️

본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.

이미지 로딩 중...

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

CodeDeck AI

2025. 11. 8. · 21 Views

SwiftUI 테스트 전략 완벽 가이드

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


카테고리:Flutter
언어:Dart
메인 태그:#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)

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

함께 보면 좋은 카드 뉴스

Riverpod 3.0 쇼핑 앱 종합 프로젝트 완벽 가이드

Flutter와 Riverpod 3.0을 활용한 실무 수준의 쇼핑 앱 개발 과정을 단계별로 학습합니다. 상품 목록, 장바구니, 주문, 인증, 검색 기능까지 모든 핵심 기능을 구현하며 상태 관리의 실전 노하우를 익힙니다.

Riverpod 3.0 Retry 자동 재시도 완벽 가이드

Riverpod 3.0에 새로 추가된 Retry 기능을 활용하여 네트워크 오류나 일시적인 실패 상황에서 자동으로 재시도하는 방법을 배웁니다. 초급 개발자도 쉽게 따라할 수 있도록 실무 예제와 함께 설명합니다.

Riverpod 3.0 requireValue로 Provider 결합하기

Riverpod 3.0에 새로 추가된 requireValue를 활용하여 여러 Provider의 데이터를 효율적으로 결합하는 방법을 배웁니다. 비동기 데이터를 마치 동기 데이터처럼 다루는 실전 패턴을 소개합니다.

Flutter 3.0 Offline 데이터 영속화 완벽 가이드

Flutter 3.0에서 새롭게 추가된 Offline 데이터 영속화 기능을 배웁니다. Storage 인터페이스부터 SharedPreferences 활용, 실전 예제까지 실무에서 바로 사용할 수 있는 패턴을 배워봅시다.

Riverpod 3.0 Mutation으로 폼 제출 완벽 가이드

Riverpod 3.0의 새로운 Mutation 기능으로 로그인과 회원가입 폼을 우아하게 처리하는 방법을 배웁니다. 로딩 상태, 에러 처리, 성공 처리까지 실무에서 바로 쓸 수 있는 패턴을 익혀보세요.