본문 바로가기
Rx

RxJava 테스팅과 Flowable-1(JUnit 5)

by 봄석 2019. 1. 1.

본 내용은 필자가 학습한 내용을 정리하는 내용입니다.

대부분 의 내용이 아래 책의 내용이므로 원서를 구매해서 직접보시는걸 추천드립니다!

RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에

유동환 , 박정준 지음 | 한빛미디어 | 2017년 09월 04일 출간

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788968488658&orderClick=LAV&Kc=


저자님의 블로그

https://brunch.co.kr/@yudong#info




테스팅과 Flowable

소프트웨어의  품질은 테스트에서 결정됩니다. 개발 부서에서는 정해진 스펙에 맞게 기능을 구현하고 품질 부서에서는 사용자 관점에서 검증하기 때문입니다. 하지만 일회성 이슈나 특정 조건에서만 발생하는 에러의 경우 품질 부서만으로는 발견하기 어렵습니다. 테스트 주도 개발(

TDD, Test Driven Development) 라는 개발 방법론이 있을 정도로 코드가 정상 동작하는지 검증하는 테스트 코드는 매우 중요합니다. 


자바 계열에서 테스트 코드를 작성하는 가장 유명한 라이브러리는 JUnit 입니다. JUnit은 

xUnit 라이는 이름으로 다른 언어에서도 폭넓게 포팅되어있으며, 안드로이드나 웹 분야에서도 폭넓게 사용되고 있습니다 .


2017년 7월에는 JUnit의 최신 버전인 JUnit 5.0.0-R2C가 릴리즈 되었습니다. 

JUnit 라이브러리 기반으로 RxJava의 테스트코드를 작성하는 방법을 알아보겠습니다. 또한 JUnit 뿐만아나리 RxJava 2.x 엣 제공하는 TestObserver 클래스를 활용한 방법도 소개합니다. 이 두가지 방법은 별도로 사용하는 것이 아니라 함께 사용할 수 있어야 합니다.


JUnit 5 활용

많은 개발자가 사용하는 JUnit 3과 JUnit 4와 차이점을 위주로 알아보겠습니다.

JUnit 5의 가장 큰 특징은 모듈화 입니다 . JUnit 4 까지는 단일 jar 파일로 구성되었지만 이제는 기능에 따라 다음처럼 세부 모듈로 구별합니다.


JUnit 5 =JUnit Platform + JUnit Jupiter + JUnit Vintage


처음 JUnit 5를 활용하는 개발자는 Jupiter만 참고하면 됩니다. Jupiter는 내부적으로 JUnit Platform에 의존하고 있으며 Vintage는 JUnit 3 혹은 JUnit 4에서 작성한 테스트코드를 JUnit 5로 실행할 때 필요합니다.


JUnit 5의 환경설정을 하기 위해서는 다음과 같이 build.gradle을 추가합니다.

testImplementation 'org.junit.jupiter:junit-jupiter-api:5.0.0-RC2'
testRuntime 'org.junit.jupiter:junit-jupiter-engine:5.0.0-RC2'

testImplementation 'org.junit.platform:junit-platform-runner:1.0.0-RC2'




첫 번째 테스트코드 src/test/java

import static org.junit.jupiter.api.Assertions.assertEquals;
 
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.runner.RunWith;
 
public class JUnit5Basic {
    @RunWith(JUnitPlatform.class)
    public class JUnitBasic{
        @DisplayName("JUnit 5 First Example")
        @Test
        void testFirst(){
            int expected =3;
            int actual =1+2;
            assertEquals(expected,actual);
        }
    }
}



기존의 JUnit 3,4와 다른 부분 

첫 번째는 패키지 구조입니다. 기존에는 org.junit 이었는데 이제는 개발자가 사용하는 API를 com.junit.jupiter로 분리했습니다. 따라서 build.gradle에 다음 설정을 추가하면 지금까지 사용하던 JUnit 4도 같은프로젝트에서 사용할 수 있습니다.

testImplementation 'junit:junit:4.12'



단, 같은 자바파일에서는 함께 사용하면 안됩니다. JUnit 5 에 새로운 라이프사이클이 추가되었기 때문입니다.


두 번째는 @RunWith(JUnitPlatform.class) 입니다. JUnit 4 까지는 이클립스 IDE에서 지원하므로 Runner 클래스를 지정하지 않아도 되었지만 JUnit5는 아직 이클립스를 지원하지 않으며 별도의 설정을 해야합니다. 현재 InteliJ만 유일하게 지원하고 있으나 조만간 이클립스도 JUnit 5 Runner 클래스를 공식적으로 지원할 것으로 생각합니다.


세 번째는 @DisplayName 추가입니다. 지금까지는 테스트 클래스 이름과 메소디 이름으로 테스트 케이스를 구별했지만 @DisplayName을 이용하면 좀 더 직관적으로 테스트 개요를 파악할 수 있습니다. 예를 들어 메소드 이름은 공백을 넣을 수 없지만 @DispalyName 뒤에 원하는 특수 문자나 공백 등을 자바 메소드 이름 규칙에 구애받지 않고 자유롭게 넣을 수 있습니다.

위 코드처럼 "JUnit 5 First Example' 이라고 이름 지어도 좋고 아니면 'RC-CMD-001'처럼 테스트 케이스 ID를 적어두면 실무에서 사용할 때도 편리합니다.


마지막으로 스트 메소드를 더이상 public 키워드로 선언하지 않아도 됩니다. JUnit 3이 2000년대 초에 나왔을 때 테스트 메소드는 반드시 public 키워드로 선언하고 'testXXX'라는 이름으로 시작해야 했습니다. 2006년 2월에 JUnit 4가 나왔을 때는 에너테이션(@)을 도입해 테스트 메소드의 이름은 자유롭게 지을수 있게 되기는 했습니다. 하지만 public 키워드는 계속 선언해야 한다는 제약조건이 있었습니다.


JUnit 5에서는 이러한 제약마저도 사라졌습니다. 테스트 코드는 테스트 외의 목적으로 실행해서는 안되므로 public 보다는 default 키워드로 선언하는 것이 좋습니다.


위코드를 실행하려면 [JUnitBasic] 클래스 이름을 오른쪽 마우스로 클릭하면 등장하는 바로가기 메뉴에서 [Run As]->[JUnit Test]를 선택해 실행합니다.




댓글