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에대한 테스트 틀림")
}


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