티스토리 뷰
How To run tests in RxSwift
RxSwift에서 테스트를 하는 방법 포스팅 글을 학습차원에서 번역했습니다. 오역 지적 환영합니다.
OverView
RxTest와 RxBlocking은 RxSwift 저장소(repository)의 한 파트를 담당합니다. 이들은 별도의 pods를 통해 사용이 가능합니다. 그러므로 별도의 imports를 요구합니다.
RxTest는 RxSwift 코드를 테스트 하는데 유용한 추가기능을 제공합니다. RxTest는 TestScheduler(가상 시간 스케쥴러), 정확한 시간 간격으로 이벤트를 추가할 수 있는 메서드 기능을 제공합니다.
반면, RxBlocking을 사용하면 일반 Observable 시퀀스를 Blocking Observable로 변환가능 한데 이는 Observable 시퀀스가 완료되거나 지정된 시간초과시기에 도달 했을때까지 실행되던 스레드들을 차단합니다. 이는 비동기 동작의 테스팅을 보다 더 쉽게 만들어 줍니다.
이제 RxTest, RxBlocking에 대해 각각 보도록 하겠습니다.
RxTest
앞서 설명했듯이, RxTest는 RxSwift 저장소의 한 부분을 담당합니다. RxTesting에 대해서 파고들기 전에 하나 더 RxTest에 대해 알아야 할 것이 있습니다. : RxTest는 테스팅 목적으로 두가지 타입의 Observables를 드러낼 수 있습니다. 그 두가지 Observable은 아래와 같습니다.
1) HotObservables
2) ColdObservables
1) HotObservable은 어떤 가입자가 있는지 여부에 상관없이 테스트 스케쥴러를 사용하여 지정된 시간에 이벤트를 재생합니다.
2) ColdObservables는 일반적인 Observables와 같이 동작하며 구독 시 새로운 구독자들에게 그들의 요소를 재생해줍니다.
RxBlocking
만약 당신이 XCTest에 대해 친숙하다면, RxBlocking이 비동기적 작업을 테스트할 수 있는 또 다른 하나의 방법임을 알아야 할 것 입니다. RxBlocking을 사용하는 것은 단지 그 테스팅 방법을 쉽게 할 뿐입니다.
이제부터 비동기 작업의 테스팅 간 해당 라이브러리를 사용하는 방법을 알아볼 수 있습니다.
우리는 이제 새로운 테스트를 시작할 겁니다. 10, 20, 30의 Observable을 다음과 같이 만들어 줍니다.
func testBlocking(){
let observableToTest = Observable.of(10, 20, 30)
}
자, 이제 방금 생성한 observable 위에 toBlocking()을 호출한 결과를 정의할 것입니다.
let result = observableToTest.toBlocking()
▼ 아래 이미지 QuickHelp 설명과 같이 1차원 배열에 Blocking Observable을 반환하게 됩니다.
이제 우린 Throwing 메서드(오류 여지가 있는 메서드)인지 확인하길 원한 다면 first() 메서드를 사용할 필요가 있습니다.
따라서 do-catch 문으로 래핑한 뒤 해당 작업이 만약 성공했다면, AssertEquals 문을 추가해줍니다. 그 모습은 아래와 같습니다. ▼
func testBlocking(){
let observableToTest = Observable.of(10, 20, 30)
do{
let result = try observableToTest.toBlocking().first()
XCTAssertEqual(result, 10)
} catch {
}
}
만약 Observable의 값과 일치하지 않으면 Assert는 실패처리 됩니다.
do{
let result = try observableToTest.toBlocking().first()
XCTAssertEqual(result, 10)
} catch {
XCTFail(error.localizedDescription)
}
그게 다입니다! 이제 테스트를 실행해봅시다. 그리고 당신은 테스트에 통과하는 것을 볼 수 있습니다.
우린 try 강제옵셔널 처리를 사용해서 코드를 단 2라인만으로 단순화시킬 수 있습니다. AssertEqual은 단 한줄로 표현 될 겁니다. 코드는 아래와 같습니다.
XCTAssertEqual(try! observableToTest.toBlocking().first(), 10)
다시 테스트를 실행해봅니다. 당신은 한번 더 테스트에 통과하는 것을 보실 수 있습니다. 지금까지의 코멘트 주석이 담긴 전체적 코드는 아래와 같습니다.
func testBlocking(){
let observableToTest = Observable.of(10, 20, 30)
// do{
// let result = try observableToTest.toBlocking().first()
// XCTAssertEqual(result, 10)
// } catch {
// XCTFail(error.localizedDescription)
// }
XCTAssertEqual(try! observableToTest.toBlocking().first(), 10)
}
코드의 간결함, 어떻게 보시나요? 사실 Observable 시퀀스는 이미 동기화 되어있습니다. 구독 중 방출된 요소들을 출력한 뒤에 테스트 마커가 따라옵니다. 마커 값은 구독 완료 이벤트 이후에야 출력될 것입니다.
실질적 비동기 작업을 테스트하기 위해, 우리는 하나의 테스트를 더 작성할겁니다. 지금 부터 우진 동시적 스케쥴러를 백그라운드 스레드에서 사용할 것입니다.
func testAsynchronousToArry(){
let scheduler = ConcurrentDispatchQueueScheduler(qos: .background)
}
이제, 우린 간단한 정수 시퀀스의 Observable을 만들 수 있습니다. 우린 map을 사용하여 각각의 값들을 2배로 만들겁니다.
let intObservbale = Observable.of(10, 20, 30)
.map{ $0 * 2 }
그 뒤, 앞서 만든 동시적 스케쥴러를 구독 할 겁니다.
let intObservbale = Observable.of(10, 20, 30)
.map{ $0 * 2 }
.subscribeOn(scheduler)
이제 우린 조금 전의 테스트에 사용한 것과 비슷한 do-catch문을 작성할 것입니다.
Obserbable에서 toBlocking() 을 호출합니다.
* 이때의 Observable은 main scheduler에서 관찰되어져야 합니다.
그러고 난 뒤, 우린 앞서 했던 보기와 동일한 Assertions를 추가할 것입니다.
do{
let result = try intObservbale.observeOn(MainScheduler.instance).toBlocking().toArray()
XCTAssertEqual(result, [20, 40, 60])
} catch {
XCTFail(error.localizedDescription)
}
그리고 테스트를 실행해봅니다. 당신은 *gutter 에 녹색 체크를 만들며 통과하는 것을 보실 수 있습니다. 마지막 테스팅 결과는 위 이미지와 같습니다.
마커는 콘솔의 요소들이 방출 되기 전에 출력 됩니다.
*gutter : 코드 에디터 좌측의 코드 작업여부 확인, break Point 설정 등 가능한 틈새부위
해당 저자 NavRudraSamByal 에 대한 더 많은 업데이트를 받으시려면 트위터의 @NavRudraSambyal를 팔로우 하시길 바랍니다.
▼해당 포스팅 원본 링크
'iOS 개발' 카테고리의 다른 글
UITableView scrollToRow, 특정 셀로 스크롤시키기 (0) | 2019.08.23 |
---|---|
iOS 디버깅 실행 시 콘솔창 자동으로 띄우는 설정방법 (0) | 2019.08.21 |
iOS 다수 UILabel 사이 붙이는 간단 제약조건 설정법 (0) | 2019.08.12 |
iOS 스토리보드 Segue로 뷰 컨트롤러간 데이터 전달 방법 (3) | 2019.08.09 |
iOS 네비게이션컨트롤러 화면전환 기능 코드구현하기 (1) | 2019.07.29 |
- Total
- Today
- Yesterday
- Collection
- publisher
- 부스트코스
- 개발자문서
- swift문제
- CoreML
- 자연어처리
- 알고리즘문제
- 프로토콜
- createML
- Protocol
- 스위프트
- uikit
- 백준swift
- 프로그래머스swift
- swift 기초
- swift string
- swift 문자열
- swift알고리즘
- swift언어
- 김프매매
- 컬렉션
- swift reduce
- ios
- 프로그래머스
- SwiftUI
- swift
- 백준알고리즘
- 알고리즘
- Swift 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |