[RxSwift] RxTest, RxBlocking

김범수·2022년 6월 2일
2

iOS

목록 보기
8/8
post-thumbnail


Unit Test


  • 단위 테스트: 프로그램의 기본 단위인 모듈을 테스트
  • 모듈이 제대로 구현되어 정해진 기능을 정확히 수행하는지 테스트
  • 프로그램의 각 부분을 고립시켜 각각의 부분이 정확하게 동작하는지 확인
  • Unit Test의 구조가 잡혀있으면 추후 리팩토링 후 확인이 쉬워 변경이 쉬움

XCTestCase


Xcode에서 사용하는 테스트 클래스의 기반이 되는 XCTestCase 는 테스트에 필요한 기본적인 기능을 제공하기 때문에, 모든 테스트 클래스는 XCTestCase를 상속받아 구현해야 함

class func setup()
class func teardown()
  • setup(): 테스트 코드 시작 전 실행 (값을 세팅하는 부분)
  • teardown(): setUp과 반대로 모든 테스트코드가 실행된 후에 호출 (setUp에서 설정한 값들을 해제 시 사용)

Nimble


https://github.com/Quick/Nimble

Nimble은 Apple에서 제공하는 XCTest Assertion에서 단점을 극복하기 위해 만들어짐

  • 충분하지 않은 매크로
    XCTest Assertion에는 문자열에 특정 하위 문자열이 포함되거나 숫자가 다른 문자열보다 작거나 같다고 하는 방법이 없음
  • 비동기 코드 작성의 어려움
    XCTest를 사용하면 많은 상용구 코드를 작성해야 함
  • Nimble은 expect.to() method를 이용하여 가독성 높은 코드 작성이 가능함

RxTest


RxSwift/UnitTests.md at main · ReactiveX/RxSwift

  • Observable에 시간 개념을 주입
  • 임의의 Observer를 통해 subscribe 여부 관계 없이 검증 가능

ex)

[(”A”, 1초), (”B”, 2초), (”C”, 3초)]

2초에 B가 나왔는지 검증?

// 가상의 시간 흐름 생성
let scheduler = TestScheduler(initialClock: 0)

// 원하는 시점에 Event가 발생하는 Observable 생성 
// createHotObservable -> 구독 여부 관계 없이 이벤트 발생
// createColdObservable -> 구독 시작되어야 정해진 순서대로 이벤트 발생
let observable = scheduler.createHotObservable([
			.next(1, "A"),
			.next(2, "B"),
			.next(3, "C"),
		])

// String을 관찰하는 Observer 생성
let observer = scheduler.createObserver(String.self)

observable
	.subscribe(observer)
	.disposed(by: bag)

// 가상의 시간이 모두 흐르도록
scheduler.start()

// Nimble의 문법을 활용할 Test Assertion
expect(observer.events).to(
	equal([
		.next(1, "A"),
		.next(2, "B"),
		.next(3, "C")
	])
)

RxBlocking


RxSwift/RxBlocking at main · ReactiveX/RxSwift

  • Observable의 Event 방출을 검증
  • 특정 시간동안 방출된 Observable의 Event 검증
  • RxTest의 Scheduler 개념 X

ex)

[”A”, “B”, “C”]
검증?

// Observable -> BlockingObservable
let observable = Observable.of("A", "B", "C").toBlocking()

// Observable의 .next 이벤트를 Array로 전환
let values = try! observable.toArray()

// Nimble의 문법을 활용한 Test Assertion
expect(values).to(equal(["A", "B", "C"))

만약 complete 되지 않은 HotObservable의 Test를 시도한다면 timeout을 설정해야함

// Observable -> BlockingObservable
let observable = Observable.of("A", "B", "C").toBlocking**(timeout: 2)**

// Observable의 .next 이벤트를 Array로 전환
let values = try! observable.toArray()

// Nimble의 문법을 활용한 Test Assertion
expect(values).to(equal(["A", "B", "C"))

Scheduler의 개념이 필요하고 좀 더 원하는 타이밍에 원하는 값이 나오기 검증을 원한다
→ RxTest

단순 Observable이 제대로 방출되는지 확인을 원한다
→ RxBlocking

profile
iOS Developer

0개의 댓글