티스토리 뷰

반응형

 

 


How To run tests in RxSwift

RxSwift에서 테스트를 하는 방법 포스팅 글을 학습차원에서 번역했습니다. 오역 지적 환영합니다.

 

 


OverView

RxTestRxBlockingRxSwift 저장소(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 팔로우 하시길 바랍니다

 

▼해당 포스팅 원본 링크 

 

How to run tests in RxSwift

RxTest and RxBlocking are part of the RxSwift repository. They are made available via separate pods, however, and so require separate…

medium.com

 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/03   »
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
글 보관함