관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Nimble, Quick 프레임워크 (Unit test) 본문

Unit Test와 UI Test

[iOS - swift] Nimble, Quick 프레임워크 (Unit test)

jake-kim 2021. 2. 12. 01:31

테스트 대상 코드

class Converter {
    func starPrint(number: Int) -> String {
        return String(repeating: "*", count: number)
    }
}

Nimble 프레임워크

  • Nimble: "재빠른"
  • 다양한 assertion 제공
  • 가독성 좋은 실패 메세지 제공: (XCTAssert에서는 실패 메세지를 따로 정의해주어야 확인이 쉬움)
    - XCTAssertTrue(result, "1") // 틀린경우 "XCTAssertTrue failed"
    - XCTAssertTrue(result, "1", "입력값에 대한 값이 틀림") // 틀린경우 아래와 같은 메세지
func testExample() throws {
    let result = converter?.starPrint(number: 1)
    XCTAssertEqual(result, "1", "1에대한 테스트 틀림")
}

XCTAssert를 사용한 경우
더욱 간결: Nimble을 사용한 경우

Nimble 사용

  • 의존성
pod 'Nimble'
  • XCTAssert가 아닌 expect().to()형태로 사용
func testExample() throws {
    let result = converter?.starPrint(number: 1)
//        XCTAssertEqual(result, "1", "1에대한 테스트 틀림")
    expect(result).to(contain("1"))
}
  • description 사용가능
func testExample() throws {
    expect(1 + 1).to(equal(3), description: "failed - 덧셈 기능을 테스트")
}

최초 보여지는 메세지
위 메세지를 클릭했을 때 보여지는 메세지

  • async한 테스트 - toEventually, toEventuallyNot

  • time out에 관한 테스트
// Swift

// Waits three seconds for ocean to contain "starfish":
expect(ocean).toEventually(contain("starfish"), timeout: .seconds(3))

// Evaluate someValue every 0.2 seconds repeatedly until it equals 100, or fails if it timeouts after 5.5 seconds.
expect(someValue).toEventually(equal(100), timeout: .milliseconds(5500), pollInterval: .milliseconds(200))
  • Type, class 형에관한 테스트

  • true/false, nil 여부 테스트


Quick 프레임워크

  • 개념: BDD (Behavior-Driven Development)를 위한 프레임워크
  • Quick은 desciription과 함께 클로저로 블럭단위 묶음으로 코딩하게끔 하여 가독성 상승을 위해 사용
  • given(시나리오 정의)-when(시나리오 조건)-then(시나리오를 완료했을 때 보장되는 결과 명시)

Quick 프레임워크 사용 방법

  • 클로저 블록 단위 Given, When, Then 구성
    - Given = describe
    - When = context
    - Then = it
    - 초기화 블록: beforeEach
import Quick
  • class에는 QuickSpec 상속
class NimbleQuickTests: QuickSpec {
  • spec()이라는 함수 override
class NimbleQuickTests: QuickSpec {
    override func spec() {
    }
}
  • Given = describe
        describe("뷰가 로드되면") { // Given
            var myModule: Converter!
            beforeEach {
                myModule = Converter()
            }

 

  • When - context
            context("텍스트필드에 입력되면, convert된다") { // When
                beforeEach {
                    myModule.starPrint(number: 5)
                }
  • Then - it
                it("값이 잘 변환되었는지 테스트") { // Then
                    expect(myModule.result).to(equal("****"))
                }
  • 전체코드
class NimbleQuickTests: QuickSpec {

    override func spec() {
        describe("뷰가 로드되면") { // Given
            var myModule: Converter!
            beforeEach {
                myModule = Converter()
            }

            context("텍스트필드에 입력되면, convert된다") { // When
                beforeEach {
                    myModule.starPrint(number: 5)
                }

                it("값이 잘 변환되었는지 테스트") { // Then
                    expect(myModule.result).to(equal("****"))
                }
            }

        }
    }
}

* 참고

- Nimble: github.com/Quick/Nimble

- Quick: github.com/Quick/Quick

 

Comments