본문 바로가기

난 iOS개발자/UnitTest

Unit Test 작성해보기2

728x90

이전 내용(https://greate-future.tistory.com/86)에 이어서 

로또 번호를 검증하는 기능에 대해 테스트를 해보자.

 

 

LottoMachine은 아래와 같이 번호검증 메서드를 갖는다.

struct LottoMachine {
    func isValidLottoNumbers(of numbers: [Int]) -> Bool {
        guard numbers.count == 6, Set(numbers).count == 6 else { //1
            return false
        }
         
        for num in numbers { //2
            guard 1...45 ~= num else {
                return false
            }
        }
        
        return true
    }
}

//1 

isValidLottoNumbers로 전달된 numbers의 요소 갯수 검사를 한다.

numbers의 요소는 모두 여섯개여야 하고, 서로 중복되는 숫자가 없어야만 한다.

 

//2

1의 조건을 통과했을 경우 numbers의 각 요소가 숫자 1과 45사이에 포함되는지를 검사한다.

 

위 두 조건에 부합한다면 isValidNumbers는 false를 반환하고

모든 조건을 통과한다면 true를 반환한다.

 


isValidLottoNumbers(of:)를 테스트 하기 전에 어떠한 테스트가 진해될 수 있을지 정리해보자.

 

//1 조건을 테스트 하기 위해 몇가지 테스트 케이스를 추가했다.

  • 6개 보다 적은 숫자를 전달했을 때
  • 6개 보다 많은 숫자를 전달했을 때
  • 6개 보다 많은 숫자가 전달되었지만 중복된 숫자가 있을 때
  • 빈 배열을 전달했을 때
  • 중복된 숫자 없이 6개의 숫자가 입력 되었을 때
  • 6개의 숫자가 입력되었지만 중복된 숫자가 있을 때

 

//2 조건

  • 중복 없는 6개의 수 중에 1보다 작은 수가 포함되어 있을 때
  • 중복 없는 6개의 수 중에 45보다 큰 수가 포함되어 있을 때
  • 중복 없는 6개의 모든 수가 1부터 45 범위에 포함되어 있는 배열이 전달되었을 때
테스트 케이스는 무엇을 얼마나 어떻게 테스트 하는지 에 따라 얼마든지 다를 수 있다.

 

 

 

테스트 코드 작성

 

func test_isValidLottoNumbers호출시_6개보다적은숫자입력했을때_false반환하는지() {
        //given
        let input = [1, 2, 3, 4, 5]
        
        //when
        let result = lot.isValidLottoNumbers(of: input)
        
        //then
        XCTAssertEqual(result, false) // == XCTAssertFalse(result)
    }
    
    func test_isValidLottoNumbers호출시_6개보다많은숫자를입력했을때_false반환하는지() {
        //given
        let input = [1, 2, 3, 4, 5, 6, 7]
        
        //when
        let result = lot.isValidLottoNumbers(of: input)
        
        //then
        XCTAssertFalse(result)
    }
    
    func test_isValidLottonumbers호출시_6개보다많은숫자전달했지만_중복되는_숫자있을시_false반환하는지() {
        //given
        let input = [1, 2, 3, 4, 5, 5, 6]
        
        //when
        let result = lot.isValidLottoNumbers(of: input)
        
        //then
        XCTAssertFalse(result)
    }
    
    func test_isValidLottonumbers호출시_빈배열을전달했을시_false반환하는지() {
        //given
        let input: [Int] = []
        
        //when
        let result = lot.isValidLottoNumbers(of: input)
        
        //then
        XCTAssertFalse(result)
    }
    
    func test_isValidLottonumbers호출시_중복숫자없이_6개전달시_true반환하는지() {
        //given
        let input = [1, 2, 3, 4, 5, 6]
        
        //when
        let result = lot.isValidLottoNumbers(of: input)
        
        //then
        XCTAssertTrue(result)
    }
    
    func test_isValidLottonumbers호출시_6개숫자전달했지만_중복이있을시_false반환하는지() {
        //given
        let input = [1, 2, 3, 4, 5, 5]
        
        //when
        let result = lot.isValidLottoNumbers(of: input)
        
        //then
        XCTAssertFalse(result)
    }
    
    func test_isValidLottonumbers호출시_중복없는6개숫자전달시_1보다_작은숫자포함되었을시_false반환하는지() {
        //given
        let input = [0, 1, 2, 3, 4, 5]
        
        //when
        let result = lot.isValidLottoNumbers(of: input)
        
        //then
        XCTAssertFalse(result)
    }
    
    func test_isValidLottonumbers호출시_중복없는6개숫자전달시_45보다_큰숫자포함되었을시_false반환되는지() {
        //given
        let input = [1, 2, 3, 4, 5, 100]
        
        //when
        let result = lot.isValidLottoNumbers(of: input)
        
        //then
        XCTAssertFalse(result)
    }
    
    func test_isValidLottonumbers호출시_중복없는6개숫자전달시_1부터_45범위_안에포함되어있을시_true반환하는지() {
        //given
        let input = [1, 2, 3, 4, 5, 6]
        
        //when
        let result = lot.isValidLottoNumbers(of: input)
        
        //then
        XCTAssertTrue(result)
    }

 

 


 

 

func makeRandomLottoNumbersArray() -> [Int] {
    var numberSet: Set<Int> = []

    while numberSet.count < 6 {
        let randomNumber = Int.random(in: 1...45)
        numberSet.insert(randomNumber)
    }    
    return Array(numberSet)
}

6개의 로또숫자를 만들어주는 메서드이다. 위 메서드는 어떤 테스트를 하면 좋을까. 

생성된 6개의 로또 번호가 유효한지 확인하면 될 것 같다.

 

앞서 테스트한 isValidLottoNumbers를 활용하여 쉽게 테스트 해보자.

func test_makeRanddomLottoNumbersArray_반환배열이유효하여_true반환하는지() {
    //given
    let input = lot.makeRandomLottoNumbersArray()

    //when
    let result = lot.isValidLottoNumbers(of: input)

    //then
    XCTAssertTrue(result)
}
728x90

'난 iOS개발자 > UnitTest' 카테고리의 다른 글

Stub, Mock, Dummy  (0) 2023.09.04
Code Coverage 확인하기  (0) 2022.01.30
Unit Test 작성해보기1  (0) 2022.01.30
Unit Test 파일 살펴보기  (0) 2022.01.30
FIRST 원칙  (0) 2022.01.30