Unit Test
컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차이다. 단위테스트라고도 하며, 메서드를 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다.
F.I.R.S.T
Fast
테스트는 빨라야 합니다. 간단한 한 줄 변경 후에 테스트 실행을 주저한다면 테스트가 너무 느린 것입니다.
소프트웨어 프로젝트는 결국 수만 개의 단위 테스트를 거치게 되며 팀 구성원은 죄의식 없이 매분 단위 테스트를 모두 실행해야 합니다.
Independent / Isolated
각각의 테스트는 서로 독립적이며 서로 의존해서는 안 됩니다.
the text of the assertion가 포함된 각 테스트 클래스 이름과 테스트 메서드 이름은 무엇이 잘못되었고 어디에서 잘못되었는지 정확히 나타내야 합니다. 다른 코드에 의존성이 높거나 영향을 많이 주고받고 있는 경우 해당 테스트를 더 작고 보다 구체적인 테스트로 대체하는 것이 가장 좋습니다
Repeatable
테스트는 언제 어디서나 같은 결과가 반복되어야 합니다.
통제가 어려운 부분에 대해서는 테스트를 위한 객체를 만들어주는 방법을 선택합니다
Self-Validating
테스트는 Bool을 이용하여 성공/실패에 대해서 스스로 검증이 가능해야 합니다. 테스트 코드 내부에서 이 테스트가 잘 동작했는지를 판별할 수 있어야 합니다.
Timely
이상적인 테스트는 테스트하려는 실제 코드를 구현하기 직전에 구현해야 합니다.
Unit Test 파일
1. 아래와 같이 Unit Test 파일 생성
2. 테스트할 파일의 Target Membership에서 Tests파일을 체크
3. 테스트 코드의 순서setUpWithError()tearDownWithError()
final class TestTests: XCTestCase {
var sut: LottoMachine! // System Under Test 실행중인 시스템
// 1, 4 : 객체를 만드는
override func setUpWithError() throws {
try super.setUpWithError()
sut = LottoMachine()
}
// 3, 6 : 테스트 마치고 해제
override func tearDownWithError() throws {
try super.tearDownWithError()
sut = nil
}
// 2
func test_로또번호_제대로_생성하는지_확인한다() throws {
// given
// when
// then
}
// 5
func test_작성중() throws {
}
}
테스트 함수명에는 test로 시작을 해야하며, 주로 한글로 표현을 한다
💡 BDD 패턴 (Behavior Driven Development) 시나리오를 설정하여 예상대로 결과가 나타나는지를 확인하는 방법론
- 어떤 상황이 주어지고 (given)
- 어떤 코드를 실행하고 (when)
- 어떤 결과를 확인하는지 (then)
흐름대로 예상한 결과를 도출하는지 확인하는 것입니다.
TDD
테스트 주도 개발(Test-Driven Development)
- Red: 실패하는 테스트를 작성하는 구간
- Green: 실패한 테스트를 통과하기 위해 최소한의 변경을 하여 테스트에 성공하는 구간
- Refactor: 테스트의 성공을 유지하면서 코드를 더 나은 방향으로 개선해나가는 구간
장점
- 안전한 코드
- 의존성이 낮은 코드
- 유지 보수가 용이
단점
- 개발 속도가 느려짐
테스트 코드 작성
// LottoMachine.swift
func countMatchingNumber(user: [Int], winner: [Int]) throws -> Int {
guard isValidLottoNumbers(of: user) && isValidLottoNumbers(of: winner) else {
throw LottoMachineError.invalidNumbers
}
let winNumbers = user.filter { winner.contains($0) }
return winNumbers.count
}
// LottoMachineTests.swift
func test_적합하지_않은_입력값_에러_동작이_되는지() {
// given
let userNumbers = [1, 2, 3]
let winnerNumbers = [1, 2, 3]
do {
let result = try sut.countMatchingNumber(user: userNumbers, winner: winnerNumbers)
XCTAssertThrowsError(result)
} catch {
XCTAssertEqual(error as? LottoMachineError, LottoMachineError.invalidNumbers)
}
}
참고
야곰 사이트 : 링크
참고 사이트 : 링크
공식 문서 : 링크
'Language > Swift' 카테고리의 다른 글
[Swift] Result 타입 (0) | 2023.05.12 |
---|---|
[Swift]UIAlertController (0) | 2023.01.11 |
[Swift] Class, Struct, Enum (0) | 2022.12.19 |
[Swift] Firebase database 설명, 선택 그리고 설정 (0) | 2022.12.06 |
[Swift] set size and position for view(CGRect, AutoLayout) (0) | 2022.12.01 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!