티스토리 뷰

반응형

 

안녕하세요 :) Zedd입니다.

해가 진짜 길어졌네요..아직 밖이 밝아........

오늘은 Quick과 Nimble 간단히 사용해보기..!!

 

[Quick]

- Unit tests에서 사용

- Behavior-driven development(BDD) framework.

 

[Nimble]

- Unit tests에서 사용 

- Matcher framework 

 

# 사용법

# Podfile

use_frameworks!

target "MyApp" do
  # Normal libraries

  abstract_target 'Tests' do
    inherit! :search_paths
    target "MyAppTests"
    target "MyAppUITests"

    pod 'Quick' ✅
    pod 'Nimble' ✅
  end
end

Podfile에 추가하여 사용.

 

# Quick

BDD에 대해서는 자세히 설명은 안하겠음. (BDD에 대해 이해하기 쉬운 설명은 if Kakao 세션이었던 kotest가 있다면TDD 묻고 BDD로 가! 참고)

간단하게 동작(행위)에 초점을 맞춘 개발이라고 보면 될 듯. 

Quick은 테스트를 동작 주도 개발로 작성할 수 있도록 도와주는 프레임워크. 

 

Quick에 대한 문서는 여기 참고. (무려 한국어로 번역이 되어있음)

 

보통 테스트를 작성하면

import XCTest

class ZeddTests: XCTestCase {

    override func setUpWithError() throws {
        // setUp
    }

    override func tearDownWithError() throws {
        // tearDown
    }

    func testExample() throws {
        // some test code
    }
}

이런식으로 XCTestCase를 상속한 class를 만들텐데, Quick을 사용하면

class ZeddSpec: QuickSpec {
    
    override func spec() {
        
    }
}

이런식으로 QuickSpec이라는 것을 상속한 Spec 클래스를 만들고, spec메소드를 override한다. 

Spec자체가 테스트케이스가 된다.

 

🙋 : 이게 어떻게 가능..?

🧑‍💻 : QuickSpec이 XCTestCase의 Subclass. 

@interface QuickSpec : XCTestCase

 

Quick은 BDD에 맞게, Given / When / Then으로 사용자 스토리를 나눈다.

- Given (설명하려는 동작)

- When (해당 동작 / 동작의 컨텍스트)

- Then (발생할 것 으로 예상되는 동작)

ex. 
Given : 사용자가 게임을 하고 있다.
When : 한번 이동한다.
Then : 다른 플레이어로 전환되어야 한다.

 

Quick에서는 

Describe (Given) 

Context (When)

It (Then) 

이렇게 대응된다.

💡 동작 테스트를 작성할 때 중요한 포인트 :
  • 정확히 이 애플리케이션 코드가 무엇을 해야 하는지?
  • 테스트가 오직 동작만을 테스트하는가? 또는 코드가 다르게 작동함에 따라 실패할 수 있는가?

 

1. Describe

설명하려는 동작

class ZeddSpec: QuickSpec {
    
    override func spec() {
        describe("사용자가 게임을 하고 있다") { ✅
            
        }
    }
}

 

2. Context

해당 동작 / 동작의 컨텍스트

class ZeddSpec: QuickSpec {
    
    override func spec() {
        describe("사용자가 게임을 하고 있다") {
            context("한번 이동한다") { ✅
                
            }
        }
    }
}

 

3. It

class ZeddSpec: QuickSpec {
    
    override func spec() {
        describe("사용자가 게임을 하고 있다") {
            context("한번 이동한다") {
                it("플레이어가 전환되어야 한다") { ✅
                    
                }
            }
        }
    }
}

 

4, Assertion 코드 작성

class ZeddSpec: QuickSpec {
    
    override func spec() {
        describe("사용자가 게임을 하고 있다") {
            context("한번 이동한다") {
                it("플레이어가 전환되어야 한다") {
                    // Assertion 코드 작성 ✅
                } 
            }
        }
    }
}

그리고 it closure안에 Assert 코드를 넣으면 된다.

 

# Nimble

이제 it안에 Assert문을 넣으면 될 것 같은데..Nimble?

XCTest assertions에는 

1. 매크로가 충분하지 않음.

2. asynchronous tests가 어려움

과 같은 단점이 있는데,

Nimble은 XCTest assertions의 단점을 보완한 Assertion(Matcher) 프레임워크라고 보면 될 것 같다. 

 

Nimble에서는 expect(..).to 라는 메소드를 사용한다. 

// Swift
expect(1 + 1).to(equal(2))
expect(1.2).to(beCloseTo(1.1, within: 0.1))
expect(3) > 2
expect("seahorse").to(contain("sea"))
expect(["Atlantic", "Pacific"]).toNot(contain("Mississippi"))
expect(ocean.isClean).toEventually(beTruthy())

이렇게 사용이 가능.

 

아까 예제에서 it안에 assertion을 Nimble을 이용해 작성해보면, 

class ZeddSpec: QuickSpec {
    
    override func spec() {
        describe("사용자가 게임을 하고 있다") {
            context("한번 이동한다") {
                it("플레이어가 제드로 전환되어야 한다") {
                    expect(board.state).to(equal(.player("zedd")) ✅
                }
            }
        }
    }
}

그 외 메소드들은 github.com/Quick/Nimble 참고. 

 

오늘은 간단하게만 본거고..Quick과 Nimble에 대한 세부적인 사항들은 따로 공부해야게따

 

참고

medium.com/inloopx/tdd-using-quick-nimble-244b14b09e3d

www.raywenderlich.com/135-behavior-driven-testing-tutorial-for-ios-with-quick-nimble

반응형

'공부' 카테고리의 다른 글

Carthage 사용해보기  (0) 2021.04.17
Carthage  (0) 2021.04.15
Diffable Datasource - supplied item identifiers are not unique  (1) 2021.04.12
Diffable Datasource  (3) 2021.04.06
TextStyle과 UIFontMetrics(with Custom Font)  (0) 2021.04.05