WooKoo Blog

물과 같이

개발/개발

[iOS] - Quick/Nimble 문서로 Unit Test 배우기 - 2

WooKoo 2023. 2. 14. 16:12

https://lazyowl.tistory.com/374

지난 1편에 이어서 바로 시작하겠습니다.


Nimble Assertions 를 사용하여 테스트 더욱 간결하게 하기

 

XCTest 로 개발한  테스트 케이스가 실패 할 경우 어떻게 나타날까요?

이렇게만 뜰꺼에요

우리는 이왕 정보를 얻을거 좀 더 많은 정보를 얻으면 좋겠죠?

무언가를 실패했는데?

그래서 뭔데?

등등 왜 실패했는지 원인을 찾는데 많은 시간을 들여요.

 

그래서 실패 시 이렇게 메세지를 작성했었죠

 

여기서 nimble 의 힘이 나타납니다!

 

 expect(sillyMonkeys).to(contain(kiki))

이렇게

expect(). to()

를 이용하면 메세지를 작성하지 않아도 알아서 알려줍니다.

 

여러가지 사용법

 

Quick Example 과 Example 그룹으로 구성된 테스트

 

이제 Quick 을 이용해서 테스트 코드를 작성하는데

Quick 의 ExamplesExample 은 두 가지 용도로 사용됩니다.

 

1. 서술적인 테스트 이름 작성

2. 환경 구축(Arrange 단계 있죠? Given) 코드를 단순화

 

 

1. it 를 사용한 Examples

 

it 는 테스트 중인 내용을 명확하게 하기위해서 추가 된 것입니다.

그리고 example은 QuickSpec 을 채택하고 spec 메서드를 오버라이드하여 구현합니다.

하나의 테스트 케이스(XCTestCase)가 스펙인거죠

 

2. describe 과 context 를 사용한 Example 그룹

Example 그룹은 setup(설정), teardown(분해) 코드를 공유 할 수 있습니다.

XCTest 에서 테스트를 위해 해줬던 setup 과 teardown 을 그룹 내에서 사용 할 수 있다는 이야기 같습니다.

 

이렇게 작성하면

언더바로 묶여서 나타납니다.

 

3. beforeEach 와 afterEach 를 사용하여 설정 / 해제코드 공유하기

여기서는 인스턴스를 신선하게 하기위한 작업입니다.

예제는 깃헙 문서에 있는거를 가져올게요!

import Quick
import Nimble

class DolphinSpec: QuickSpec {
  override func spec() {
    describe("a dolphin") {
      var dolphin: Dolphin!
      beforeEach { // 여기 1
        dolphin = Dolphin()
      }

      describe("its click") {
        var click: Click!
        beforeEach { // 여기 2
          click = dolphin.click()
        }

        it("is loud") {
          expect(click.isLoud).to(beTruthy())
        }

        it("has a high frequency") {
          expect(click.hasHighFrequency).to(beTruthy())
        }
      }
    }
  }
}

1번과 2번에서 dolphin 과 click 의 인스턴스를 생성하네요

사용하는 스펙 안에서 인스턴스를 생성해줘서 좀 더 관리하기 쉽게해준 것 같아요.

반대로 example  후에 인스턴스를 컨트롤 해야한다면 afterEach 를 쓰면 될 것 같네요

 

4. Context 를 사용하여 조건부 동작 지정하기

개발을 하다보면 버튼을 여러번 클릭한다거나 하는 동작들이 있을텐데

조건부로 동작시킬 수 있는 그런 녀석인 것 같습니다.

 

import Quick
import Nimble

class DolphinSpec: QuickSpec {
  override func spec() {
    describe("a dolphin") {
      var dolphin: Dolphin!
      beforeEach { dolphin = Dolphin() }

      describe("its click") {
        context("when the dolphin is not near anything interesting") {
          it("is only emitted once") {
            expect(dolphin.click().count).to(equal(1))
          }
        }

        context("when the dolphin is near something interesting") {
          beforeEach {
            let ship = SunkenShip()
            Jamaica.dolphinCove.add(ship)
            Jamaica.dolphinCove.add(dolphin)
          }

          it("is emitted three times") {
            expect(dolphin.click().count).to(equal(3))
          }
        }
      }
    }
  }
}

클릭을 여러번하게 되면 beforeEach 를 이용해서 새로운 객체에 추가하는

조건부 context 입니다.

도큐먼트로는 이해가 잘 되지 않네요.

무튼 동작을 수행했을 때를 체크하는 것 같습니다.

describe("돌고래가") {
  describe("클릭한다") {
    context("돌고래 근처에 흥미로운 뭔가가 있을 때") {
      it("3을 방출한다.") {
        // ... Nimble Assert
      }
    }
  }
}

종합 해보면 이런 형태로 테스트 코드를 작성 할 수 있습니다.

 

추측하자면

describe 는 동작의 설명

context 는 어떤 구체적인 동작

it 는 ~~해야한다.

마지막으로 확인 Assert

 

그 외

일시적인 example 이나 그룹 비활성화

x 키워드 이용

 

일정부분 임시적 실행

f 키워드 이용

 

전역 설정 및 해제

beforSuite

afterSuite

 

등은 나중에 심화적으로 다뤄보실 때 한번 공부해부시는 걸 추천드려요!

 

마지막 3편으로 다시 오겠습니다.