본문 바로가기
👨‍💻 프로그래밍/🍎 iOS 개발

🍎 XCTest로 Swift에서 Unit Test 하기

by 개발자 진개미 2024. 7. 28.
반응형

단위 테스트 (Unit Test)가 뭐임?

코딩에서 개발 그 자체만큼 중요한게 테스트입니다. 버그를 1개도 만들지 않으면서 코딩할 수 있는 개발자는 없기 때문에 테스트를 하지 않으면 버그가 많은 질 낮은 소프트웨어를 만들어내는 뱃 개발자 입니다. 💦

보통은 가장 기초적인 테스트는 내가 작성한 소프트웨어를 실행해 보면서 요구사항이 맞는지 확인하는 겁니다. 하지만 이 방법에는 치명적인 단점이 있습니다. 노가다라는 겁니다...

  • 요구사항이 엄청 많아지면? 100개가 된다면 수정할 때 마다 이 100개의 요구사항이 모두 맞는지 확인해야 합니다.
  • 위의 이유로 테스트를 자주할 수 없습니다.
  • 재현이 어려운 경우는 테스트 하기가 힘듭니다.

여기서 단위 테스트가 나옵니다. 단위 테스트는 소프트웨어를 테스트할 수 있는 가장 작은 단위로 나누고 그걸 여러개 테스트하는 겁니다. 이와 반대로 처음부터 끝까지 동작을 확인해 보는 걸 통합 테스트 (Integration Test)라고 합니다.


Unit Test 그거 꼭 짜야 함?

솔직히 말하면 저는 테스트를 많이 안 짜는 편입니다. 테스트 커버리지만을 높이기 위해 기괴한 방법으로 테스트를 우겨 넣거나, 테스트에 과도한 시간을 쓰는 거 자체가 낭비라고 생각하는 편입니다.

하지만! 요구사항이 조금이라도 복잡하거나 중요한 로직이라면 반드시 테스트를 짜야 합니다. 길게 보면 그게 오히려 시간을 아끼는 길입니다. 테스트를 안 짜면 아래와 같은 매우 큰 단점들이 있습니다.

  • 리팩토링 (Refactoring) 할 때 자신감을 가질 수 없어 중요 로직이 레거시 (Legacy)로 방치 됨
  • 중요 로직이 요구시항에 맞는지 자신감을 가질 수 없음
  • 테스트 할 때 마다 앱을 구동해서 테스트 하고자 하는 동작을 노가다로 해야 함

Swift에서 Unit Test 짜는 법

1. 상단바에서 File -> New -> Target을 선택합니다.

2. Test를 검색한 뒤 Unit Testing Bundle를 선택합니다.

3. 정보를 입력한 뒤 만들어 줍니다.

4. 일반적인 Swift File과 똑같이 New에서 Unit Test Case Class를 선택해 줍니다.

5. 이제 XCTest를 사용해서 Unit Test를 작성하면 됩니다!

import XCTest

final class ExampleTest: XCTestCase {}

XCTest 문법

테스트는 3단계로 나뉩니다.

  • Given
  • When
  • Then

 

예를 들어 D-Day를 계산하는 로직을 테스트 한다고 해 보겠습니다. 이 테스트는 어떻게 3단계로 나눌 수 있을까요?

  • Given: 두 날짜가 있을 때 (2024년 1월 1일, 2024년 1월 2일)
  • When: D-Day를 계산하면 
  • Then: 1일이 나와야 한다

 

이걸 코드로 작성하면

import XCTest

final class DDayTest: XCTestCase {
	func test() {
    	// Given
        let date1 = Date.of(year: 2024, month: 1, day: 1)
        let date2 = Date.of(year: 2024, month: 1, day: 2)
        
        // When
        let result = Date.dday(from: date1, to: date2)
        
        // Then
        XCTAssertEqual(result, 1)
    }
}

 

여기서 주목해야 할 것은 XCTAssertEqual 입니다. 이 함수는 2개 값이 일치하는지를 확인하고, 일치하면 테스트 성공, 일치하지 않으면 테스트가 실패하게 해 주는 함수입니다. XCTest에는 이런 종류의 함수는 매우 많이 있는데 주로 쓰는건 그리 많지 않습니다. 간단히 소개해 드리겠습니다! 😃

XCTAssertEqual 두 값이 같은지 확인한다
XCTAssertNoThrow 코드 실행 과정에서 예외가 안 나는지 확인한다
XCTAssertTrue 값이 true 인지 확인한다
XCTAssertFalse 값이 false 인지 확인한다
XCTAssertNil 값이 nil인지 확인한다
XCTAssertNotNil 값이 nil이 아닌지 확인한다

 

여기서 사실 XCTAssertNoThrow를 제외하고는 모두 XCTAssertEqual로 할 수 있긴 합니다.


주의해야 할 점, 팁

  • 원래 프로젝트에서 테스트할 대상을 가져오려면 @testable를 쓰면 됩니다.
@testable import ExampleProject

 

  • test 함수 이름은 꼭 test로 시작해야 test로 인식합니다.
func test_없을_땐_0이_나와야_한다() {} // 테스트로 인식
func 없을_땐_0이_나와야_한다() {} // 테스트로 인식 못 함

 

  • 최근에는 애플이 새로 발표한 Swift Testing을 쓰는 추세라고 합니다. 저는 아직 써 본적이 없지만 조만간 써 보고 소개 해 보겠습니다. 
 

Swift Testing Overview - Xcode - Apple Developer

Swift Testing is a new framework with expressive and intuitive APIs that make testing your Swift code a breeze.

developer.apple.com


참고

 

XCTest | Apple Developer Documentation

Create and run unit tests, performance tests, and UI tests for your Xcode project.

developer.apple.com


반응형