WooKoo Blog

물과 같이

개발/개발

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

WooKoo 2023. 2. 14. 09:20

지난 Unit Test 의 기본 개념에 이어서

https://lazyowl.tistory.com/370

 

[iOS] - Unit Test 기본 개념 공부하기

많은 개발자분들께서 테스트 코드를 작성이 중요하고 작성을 하고 있다는 것을 알게되었습니다. TDD 에 대하여 장단점을 논하면서 쓰자 쓰지말자 논쟁도 많았구요. 그러나 정말 중요한 것은 테

lazyowl.tistory.com

오늘은 Quick/Nimble 을 배워보려고합니다.

 

Quick 문서가 너무나도 한국어로 잘되어있어서 배워보면서 정리해보려고합니다.

Objective-C 와 라이브러리 설치, 프로젝트 설정 등은 과감하게 제외하고 테스트 관련 내용만 문서를 보고 정리하였습니다.

https://github.com/Quick/Quick/tree/main/Documentation/ko-kr

 

GitHub - Quick/Quick: The Swift (and Objective-C) testing framework.

The Swift (and Objective-C) testing framework. Contribute to Quick/Quick development by creating an account on GitHub.

github.com

(틀린 부분이 있을 수 있으니 문서를 참고해서 봐주시면 감사드리겠습니다.)

 

 첨부한 문서랑 같이보는게 좋을 것 같아요!

 


Quick 과 nimble 은 뭘까?

Quick 은 Swift 와 Ojbective-C 의 BDD(Behavior-driven_development) 프레임워크이다.
Nimble 은 테스트를 위해 Quick 과 함께 제공되는 것이다. XCTAssert() 를 쉽게 도와주는 녀석이에요.
간단하게 정리하면 기본 XCTest 로 구현되어있는 것이 불편해서

편하게 Unit 테스트 코드를 작성을 지원하는 라이브러리에요.

 

자 이제 문서보고 한번 같이 배워봅시다.

# XCTest 를 사용한 효과적인 테스트: Arrange (환경 구축), Act(실행), 그리고 Assert(동작 확인)

 

1. Arrange Act Assert 대로 작성하라

Unit Test 는 간단한 패턴에 따라 작성하면 효과적인 단위 테스트를 할 수 있습니다.
Given When Then 들어보셨죠?


Arrange: Given (환경 구축)
Act: When (실행)
Assert: Then (동작 확인)

같은거에요!!!

 

문서에 나온 예제로 볼까요

 

 

바나나 객체를 만들고

 

Given When Then 기븐웬덴

Quick 에서는 Given When Then을 뭐라고 할까요?

Describe (Given) 

Context (When)

It (Then) 

 

패턴 대로 작성해줍니다.

 

 

2. 간단한 테스트 이름을 사용하라

프로그램은 계속해서 수정하고 변함으로써 테스트 코드가 필요하고

테스트 케이스를 통해서 어떤 케이스가 실패했는지를 명확하게 알도록 해야합니다.

 

그렇기 때문에 

 

1. 무엇을 테스트하고있는지 명확하게

2. 어떤 상황에 테스트가 통과하고 실패하는지 명확하게

 

테스트 코드의 이름을 작성을 해야합니다.

testPeel 의 이름을 좀 더 자세하게 testPeel_makesTheBananaEdible 로 변경했습니다.

 

 

3. 테스트 시 여러 조건들

벗겨진 바나나를 제공하거나

안벗겨진 바나나를 제공하거나

 

두 가지 케이스의 상황을 모두 테스트 코드를 작성합니다.

class OfferTests: XCTestCase {
  func testOffer_whenTheBananaIsPeeled_offersTheBanana() {
    // Arrange: Create a banana and peel it.
    let banana = Banana()
    banana.peel()

    // Act: Create the string used to offer the banana.
    let message = offer(banana)

    // Assert: Verify it's the right string.
    XCTAssertEqual(message, "Hey, want a banana?")
  }

  func testOffer_whenTheBananaIsntPeeled_offersToPeelTheBanana() {
    // Arrange: Create a banana.
    let banana = Banana()

    // Act: Create the string used to offer the banana.
    let message = offer(banana)

    // Assert: Verify it's the right string.
    XCTAssertEqual(message, "Hey, want me to peel this banana for you?")
  }
}

 

 

테스트의 이름은 보시다시피 어떤 조건에 통과해야하는지 명확해야합니다.

 

테스트 이름_어떻게 했을 때_ 어떻게 되어야한다.

 

방식으로 말이죠.

 

 

코드를 테스트하지말고 동작을 테스트 하라

 

1. 테스트는 예상치 못한 동작을 했을 때 실패하도록 해야한다.

무엇을 테스트하는지 어떻게 되어있는지를 테스트 하는게 아니다.

 

첫 소개 할 때 Quick 이 BDD 라고했죠?

 

응용 프로그램이 무엇을 했는지 확인하는 테스트를 동작테스트(Behavioral tests)

동작이 동일하게 유지되더라도 프로그램 코드가 변경되면 중단되는 테스트 취약한 테스트 (Brittle tests)

 

바나나를 DB 에 넣는다고했을 때 이를 어떻게 테스트 해야할까요?

 

A: DB 에 저장 후 DB 의 크기를 확인한다. (취약한 테스트)

B: 저장 후 읽어본다. (동작 테스트)

 

우리는 테스트를 작성할 때 B로  접근 해야합니다.

A는 다른 사이드 이펙트로 인해서 동작은 동일하나 다른 결과를 내뱉을 수 있으니까요.

 

1. 코드가 무엇을 해야하는지

2. 테스트가 오직 동작만을 테스트하는지

3. 다르게 동작하면 실패 할 수 있는지

 

이렇게 접근합시다!

 

다음 글은 2편에서

 

https://lazyowl.tistory.com/375