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 |