Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- window
- github
- MacOS
- JPA
- view
- iOS16
- Notification
- appstore
- Realm
- UIButton
- Git
- darkmode
- Apple
- Archive
- geofencing
- FLUTTER
- error
- 개발자
- Code
- rxswift
- 웹뷰
- Session
- Firebase
- 한글
- IOS
- stack
- Swift
- mac
- SwiftUI
- Xcode
Archives
- Today
- Total
EEYatHo 앱 깎는 이야기
Swift ) XCTest UnitTest - EEYatHo iOS 본문
반응형
Test 파일 만들기
- New File > Unit Test Case Class > 파일명 입력
- 파일명은 일반적으로 XXXTests 로 짓는다
- 예시로 User 의 모델이나 API 를 테스트하기 위한 UserTests 를 만들었다.
제공된 함수 설명
UintTest 파일을 만들면 4가지 함수가 있다.
- setUpWithError : 테스트 시작 직후, 가장 먼저 실행되는 코드. 테스트를 위한 모델이나 시스템을 정의하는 역할.
- tearDownWithError : 테스트 끝나기 직전, 가장 마지막에 실행되는 코드. release, deinit, dispose 등의 역할.
- testExample : 테스트 함수 예시.
testXXX 로 명명된 함수들이 UnitTest 시 모두 실행된다.
setUpWithError 실행 > 각종 testXXX 함수들 실행 > tearDownWithError 순으로 진행된다. - testPerformanceExample : 퍼포먼스를 테스트 하는 함수의 예시.
measure 함수에 넣어주는 클로저의 실행시간을 측정해준다.
10번 실행하고, 평균값을 Average 에 넣는 듯 하다.
- 예시 ) setUpWithError 를 활용하여 로그인 한 상태로 테스트 시작하기
@testable import MyApp // 개발한 Target 의 코드를 사용하기 위한 import
override func setUpWithError() throws {
// 로그인 상태로 시작하기
if !User.info.account.isLogin() {
let email = "테스트 계정 email"
let password = "테스트 계정 password"
let expectation = XCTestExpectation()
User.info.login(email: email, password: password) { statusCode, _ in
if statusCode == HttpStatus.success.rawValue {
expectation.fulfill()
} else {
XCTAssertTrue(false)
}
}
wait(for: [expectation], timeout: 5)
}
}
Test 함수
Test 함수 명명법
- 여러 명명법이 있는데, test_Given_When_Then 이 가장 합리적인 것 같다.
- Given : 주어진 상태 ( ex. 유저가 로그인 된 상태에 장바구니에서 : inCartWithLoggedIn )
- When : 행할 행동 ( ex. 매진된 상품의 +버튼을 누른다 : tabPlusButtonToSoldOutProduct )
- Then : 기대값 ( ex. 매진된 상품이라는 Alert 가 뜬다 : showSoldOutAlert )
func test_inCartWithLoggedIn_tabPlusButtonToSoldOutProduct_showSoldOutAlert() {...}
Test 함수 구성
- 마찬가지로 Given, When, Then 순서로 작성한다.
예시 )
func test_toNumberArray_filterByOddNumber_getOnlyOddNumbers() {
// Given
let arr = [1, 2, 3, 4, 5]
let expection = [1, 3, 5]
// When
let result = arr.filter { $0 % 2 == 1 }
// Then
XCTAssertEqual(result, expection)
}
비동기 Test
- XCTest 에서는 비동기 Test 를 위해, expectation 이라는 기능을 제공하고 있다.
- expection 을 생성하고, 특정 조건을 만족할 때 까지 wait 할 수 있다.
애플 문서 링크
- 예시 ) 유저의 AccessToken을 가져오는 API를 테스트하기
// UserId 를 사용하여 AccessToken 을 받아오는 API 테스트
func test_nil_requestAccessTokenWithValidUserId_succesGetAccessToken() {
// Given
var accessToken: String = ""
// When
let userId: String = "validUserIdForTest"
let expectation = XCTestExpectation()
AccountAPI.requestAccessToken(userId: userId) { _accessToken in
accessToken = _accessToken
expectation.fulfill() // 작업 완료 알림
}
wait(for: [expectation], timeout: 5.0) // 이 위치에서 작업이 완료될 때 까지 최대 5초 동안 대기.
// Then
/// accessToken 이 비어있다면 테스트 결과 실패. 비어있지 않다면 통과.
XCTAssertTrue(!accessToken.isEmpty)
}
Test Flow
- Class가 다르면 독립적으로 실행
( 테스트 파일 3개 만들고 전체 테스트 실행시, 시뮬레이터가 3개 실행된다 ) - 한 Class 안에서 test함수는 직렬 실행
( testAAA 가 끝나야 testBBB 실행 ) - test함수 실행 순서는, test함수명 오름차순
( testAAA, testBBB 중에 testAAA 먼저 실행 )
기타
- 테스트 실행 단축키 : Command + U
'iOS, Swift > Testing' 카테고리의 다른 글
Swift ) XCTestCase 파헤치기 - EEYatHo iOS (0) | 2022.11.16 |
---|---|
테스트 코드 필요성, 7원칙, FIRST 원칙 (0) | 2022.01.13 |
Comments