SwiftUI 기본 유닛 테스트 작성: 테스트 주도 개발

작성일 :

SwiftUI 기본 유닛 테스트 작성: 테스트 주도 개발

SwiftUI 애플리케이션을 개발할 때, 안정적이고 유지보수하기 쉬운 코드를 작성하기 위한 방법 중 하나는 유닛 테스트를 도입하는 것입니다. 테스트 주도 개발(Test-Driven Development, TDD)는 기능을 추가하기 전 테스트를 먼저 작성하고, 그 테스트를 통과하도록 코드를 작성하는 방식으로 소프트웨어 개발 과정입니다. 이 글에서는 SwiftUI 애플리케이션에 유닛 테스트를 작성하는 방법과 TDD의 원칙을 설명하겠습니다.

테스트 주도 개발(TDD)란?

테스트 주도 개발(TDD)은 레드-그린-리팩터 사이클을 강조합니다. 이 사이클을 통해 개발자는 코드를 보다 신뢰할 수 있고 유지보수하기 쉽게 만들 수 있습니다.

  1. 레드(Red): 먼저 실패할 테스트를 작성합니다. 이 테스트는 추가하려는 기능의 요구사항을 정의합니다. 테스트가 실패하면 더 이상 기능을 구현하지 않아도 된다는 신호입니다.
  2. 그린(Green): 테스트를 통과하도록 최소한의 코드를 작성합니다. 여기서는 간결함을 유지하고, 작동하는 수준의 코드만 작성하는 것이 중요합니다.
  3. 리팩터(Refactor): 기능이 동작하는 코드를 리팩터링합니다. 코드의 중복을 제거하고, 가독성을 높이며, 최적화합니다. 리팩터링 후에도 테스트는 여전히 통과해야 합니다.

SwiftUI 프로젝트에서 유닛 테스트 설정하기

SwiftUI 프로젝트에서 유닛 테스트를 설정하는 방법에 대해 알아보겠습니다. Xcode에서 새로운 SwiftUI 프로젝트를 생성하면 기본적으로 Test 디렉토리에 유닛 테스트를 작성할 수 있습니다. 다음 예제에서는 간단한 비즈니스 로직을 테스트해보겠습니다.

  1. 새 프로젝트 생성

Xcode를 열고, 새로운 프로젝트를 생성합니다. Single View App 템플릿을 선택하고, 언어는 Swift, 인터페이스는 SwiftUI를 선택합니다.

  1. 테스트 파일 추가

프로젝트 내 Tests 디렉토리 아래에 새 테스트 파일을 추가합니다. 파일 이름은 MyAppTests.swift로 지정합니다.

  1. 간단한 뷰 모델 작성

다음을 예제로 사용할 간단한 뷰 모델을 작성해 보겠습니다. ContentViewModel.swift 파일을 생성하고 아래와 같은 코드를 작성합니다:

swift
import Foundation

class ContentViewModel: ObservableObject {
    @Published var name: String = ""
    
    func updateName(newName: String) {
        name = newName
    }
}

위 코드는 name 문자열을 업데이트하는 간단한 메서드를 포함합니다. 이제 이 메서드가 올바르게 작동하는지 확인하기 위한 테스트를 작성해 보겠습니다.

  1. 유닛 테스트 작성

MyAppTests.swift 파일에서 다음과 같은 테스트 코드를 작성합니다:

swift
import XCTest
@testable import MyApp

class MyAppTests: XCTestCase {

    func testUpdateName() throws {
        // 1. ViewModel 인스턴스 생성
        let viewModel = ContentViewModel()
        
        // 2. 초기 이름 확인
        XCTAssertEqual(viewModel.name, "")
        
        // 3. 이름 업데이트
        let newName = "Swift"
        viewModel.updateName(newName: newName)
        
        // 4. 이름이 올바르게 업데이트 되었는지 확인
        XCTAssertEqual(viewModel.name, newName)
    }
}

위 테스트는 네 가지 단계로 구성됩니다:

  1. ContentViewModel 인스턴스를 생성합니다.

  2. 초기 name 값이 빈 문자열인지 확인합니다.

  3. updateName 메서드를 사용하여 이름을 업데이트합니다.

  4. name 값이 올바르게 업데이트되었는지 확인합니다.

  5. 테스트 실행

이제 Xcode에서 테스트를 실행해보겠습니다. Command + U 키를 눌러 모든 테스트를 실행합니다. 테스트가 통과하면, ContentViewModelupdateName 메서드가 올바르게 작동하는 것을 확인할 수 있습니다.

SwiftUI와 테스트 주도 개발

SwiftUI에서 TDD를 도입하면 다음과 같은 이점이 있습니다:

  1. 버그 감소: 테스트를 사전에 작성함으로써, 코드를 작성하기 전에 요구사항이 명확해집니다. 이는 코드에 잠재적인 버그가 포함될 가능성을 줄입니다.
  2. 리팩터링 용이: 테스트가 있기 때문에, 코드 리팩터링 시 잘못된 동작을 바로잡을 수 있습니다.
  3. 개발 속도 향상: 초기에는 느리게 느껴질 수 있지만, 장기적으로는 테스트 케이스가 작동 확인을 자동으로 수행하여 개발 속도가 향상됩니다.
  4. 코드 품질 향상: TDD는 간결하고 유지보수하기 쉬운 코드를 작성하는데 집중하게 하며, 이는 전체적인 코드 품질을 향상시킵니다.

결론

SwiftUI에서 유닛 테스트와 TDD를 도입하면 코드의 안정성과 유지보수성을 크게 개선할 수 있습니다. 이번 글에서는 간단한 예제를 통해 TDD의 기본 원칙과 SwiftUI 프로젝트에서 유닛 테스트를 설정하는 방법을 알아보았습니다. 기본적인 뷰 모델의 테스트를 통해 테스트 주도 개발 방법론을 적용해보며, 실제 프로젝트에 이러한 접근 방식을 도입해보세요. 결론적으로, 유닛 테스트와 TDD는 SwiftUI 개발자가 신뢰할 수 있는 높은 품질의 소프트웨어를 만들어내는 데 도움을 줄 것입니다.