

단위 테스트(Unit Testing)는 소프트웨어 개발에서 가장 기본적이고 중요한 테스트 방법 중 하나
XCTest를 이용한 단위테스트
import XCTest
class Calculator {
func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
}
class CalculatorTests: XCTestCase {
var calculator: Calculator!
override func setUp() {
super.setUp()
calculator = Calculator()
}
func testAdd() {
// Given
let a = 5
let b = 3
// When
let result = calculator.add(a, b)
// Then
XCTAssertEqual(result, 8)
}
}
ViewModel 테스트
class WeatherViewModel: ObservableObject {
@Published var temperature: Double = 0.0
func convertToFahrenheit(_ celsius: Double) -> Double {
return (celsius * 9/5) + 32
}
}
class WeatherViewModelTests: XCTestCase {
var viewModel: WeatherViewModel!
override func setUp() {
super.setUp()
viewModel = WeatherViewModel()
}
func testTemperatureConversion() {
// Given
let celsius = 20.0
// When
let fahrenheit = viewModel.convertToFahrenheit(celsius)
// Then
XCTAssertEqual(fahrenheit, 68.0)
}
}
Preview Provider를 활용한 UI 테스트:
struct ContentView: View {
@StateObject var viewModel = WeatherViewModel()
var body: some View {
Text("\(viewModel.temperature)°C")
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
SwiftUI 테스트 시 주요 고려사항
비즈니스 로직 분리
의존성 주입
struct ContentView: View {
@StateObject var viewModel: WeatherViewModel // 테스트를 위해 주입 가능
init(viewModel: WeatherViewModel = WeatherViewModel()) {
_viewModel = StateObject(wrappedValue: viewModel)
}
}
비동기 테스트
func testAsyncOperation() async throws {
// Given
let expectation = XCTestExpectation(description: "Async operation")
// When
await viewModel.fetchWeatherData()
// Then
XCTAssertNotNil(viewModel.temperature)
expectation.fulfill()
}
환경값(Environment) 테스트
struct ContentView: View {
@Environment(\.colorScheme) var colorScheme
var body: some View {
Text("Hello")
.foregroundColor(colorScheme == .dark ? .white : .black)
}
}
// 테스트
func testColorScheme() {
let view = ContentView()
.environment(\.colorScheme, .dark)
// 테스트 로직
}
테스트 작성 시 기억할 점
Given-When-Then 패턴
func testExample() {
// Given (준비)
// 테스트에 필요한 초기 조건과 데이터를 설정
let calculator = Calculator()
let input = 5
// When (실행)
// 테스트하려는 동작을 실행
let result = calculator.square(input)
// Then (검증)
// 결과를 검증
XCTAssertEqual(result, 25)
}
각 부분의 역할: