이미지 로딩 중...
CodeDeck AI
2025. 11. 8. · 1 Views
SwiftUI 테스트 전략 완벽 가이드
SwiftUI 앱의 품질을 보장하기 위한 테스트 전략을 초급자도 이해할 수 있게 설명합니다. 단위 테스트부터 UI 테스트까지 실전 예제와 함께 학습할 수 있습니다.
들어가며
이 글에서는 SwiftUI 테스트 전략 완벽 가이드에 대해 상세히 알아보겠습니다. 총 10가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
- 기본_단위_테스트_설정
- ViewModel_테스트하기
- Mock_데이터_사용하기
- 비동기_코드_테스트
- UI_테스트_기본
- View_존재_여부_테스트
- Navigation_테스트
- 입력_검증_테스트
- 상태_변화_테스트
- 에러_처리_테스트
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 속성으로 정확한 텍스트를 검증합니다.
7. Navigation_테스트
개요
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