iOS

Unit Test (XCTest)

JoonSwift 2020. 12. 16. 18:52

Unit Test

XCode에서는 Unit Test 또는 단위 테스트라고 하는 기능을 제공하고 있습니다. XCode에서 Unit Test를 하여 테스팅을 자동화하여 테스팅에 사용되는 시간을 절약할 수 있으며, 버그를 사전에 예방할 수 있고, 이러한 테스팅 과정을 통해서 코드를 보다 더 최적화 시킬 수 있게 도와줍니다. 

 

XCTest

Unit Test에서 주로 사용하는 Framework중 하나인 XCTest를 살펴보겠습니다.

XCTest란 XCode 프로젝트에서 Unit Test를 만들거나 실행하고, Performance Tests, UI Tests를 하는데에 사용하는 프레임워크입니다.

 

Swift Package를 활용하여 간단한 Unit Test를 해보겠습니다.

우선 Swift Package를 생성하면 Sources 그룹과 Tests 그룹이 있습니다. 저는 FloatingPoint를 활용하여 입력값이 Int타입인지 Double타입인지 확인하는 테스트 코드를 작성해 보겠습니다.

 

 

 

우선 IntOrDouble.swift라는 Swift파일을 생성하고, Tests에는 IntOrDoubleTests.swift라는 Swift파일을 생성하였습니다.

 

 

 

 

그리고 우선 IntOrDouble.swift파일에 다음과 같은 코드를 추가하겠습니다.

extension FloatingPoint {
    var isInteger: Bool? {
        if self == 0 {
            return nil
        }
        else if self == rounded() {
            //it's Integer
            return true
        }
        //it's Double
        return false
    }
}

nil에 대한 테스트를 제공하기 위해 0일때 nil을 반환하게 하였고, rounded() 메소드를 활용하여 Integer이면 true를 리턴, 그렇지 않으면 false를 리턴하게 하는 코드입니다. 

 

이제 본격적으로 테스트 코드를 작성해 보겠습니다!

IntOrDoubleTests.swift 파일의 시작은 다음과 같습니다.

import XCTest
@testable import UnitTestPractice

XCTest module을 import해주고, 패키지 또한 @testable을 붙여 import해줍니다.

@testable? 

@testable을 붙여주어 패키지를 import해주는데 이것을 없애면 Error가 발생합니다. 그 이유는 접근 권한과 관련이 있는데요!

혹여나 @testable을 안붙이고 테스트를 한다면 꼭 테스트를 위해 접근해야 하는 곳에 접근 권한을 public으로 설정해 주어야 합니다!

public extension FloatingPoint {

이렇게 해주면 Error가 없어집니다! 계속 가보겠습니다!

 

다음은 테스트 클래스의 선언입니다. 

final class IntOrDoubleTests: XCTestCase {

여기서 XCTestCase란 테스트 케이스, 테스트 메서드, 성능 테스트를 정의하는 기본 클래스 입니다. 

 

테스트 메서드를 정의해보겠습니다.

func test_FloatingPoint() throws {

테스트 메서드의 선언은 항상 test라는 키워드로 시작합니다. 그렇게 해야 테스트를 할 수 있습니다.

 

이번 테스트 메서드에서 사용해 볼 메서드는 다음과 같습니다.

  • XCTFail -> 무조건적으로 실패하는 오류를 생성한다.
  • XCTAssertTrue -> 식이 True임을 나타내준다. == XCTAssert
  • XCTAssertFalse -> 식이 False임을 나타내준다.
  • XCTAssertNil -> 식이 Nil임을 나타내 준다. 
  • XCTUnwrap -> 식이 Nil이 아님을 나타내고, unwrapped value를 리턴해 준다.
    func test_FloatingPoint() throws {
        let onePointFive = try XCTUnwrap(1.5.isInteger)
        let onePointZero = try XCTUnwrap(1.0.isInteger)
        XCTAssertTrue(onePointZero)
        XCTAssertFalse(onePointFive)
        XCTAssertNil(0.0.isInteger)
    }

모두 성공하는 테스트만을 작성해 두었습니다. 

테스트가 성공한 모습을 볼 수 있습니다. 실패하는 테스트를 간단하게 XCTFail만을 추가해서 만들어보면 

아주 간단하게 테스트를 해보았습니다.

Code Coverage

테스트를 할 때 사용하면 유용한 Code Coverage를 설정하는 방법에 대해서도 알아보겠습니다. 

 

 

 

 

 

 

 

Xcode에서 Product -> Scheme -> Edit Scheme을 선택합니다.

 

Code Coverage에 체크를 해주시고 Close를 누릅니다.

이후 코드에 가서 

Editor -> Code Coverage에 체크를 해주면 

 

이런식으로 Code Coverage를 확인할 수 있습니다.

 

✍️ 추가!

XCTAssertEqual

 

이를 토대로 TDD를 공부하여 활용해 보는 포스팅을 다음에 작성할 예정입니다!

혹시나 지금 포스팅에서 문제점이나 보완할 부분이 있다면 알려주시면 감사하겠습니다!