본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Effective Unit Testing] Chap8. 제 2의 JVM 언어를 활용한 테스트 작성

by 돼지왕 왕돼지 2019. 3. 18.
반응형

[Effective Unit Testing] Chap8. 제 2의 JVM 언어를 활용한 테스트 작성


bdd, bdd 도구의 뛰어난 표현력, Cleanup, closure, easyb, effective junit, effective unit test, expect, feature, feature 메서드, given-when-then, Groovy, jruby, jvm 언어 혼용의 조건, jython, LISP, Mock, scalar, setup, Then, when, Where, [Effective Unit Testing] Chap8. 제 2의 JVM 언어를 활용한 테스트 작성, 동작, 문자열 상수, 블록, 생명주기, 성능보다 가독성, 스폭, 자이썬, 테스트 더블, 테스트 작성하기, 테스트의 표현력을 높여주는 스폭, 행위


8.1. JVM 언어 혼용의 조건


-

제 2의 JVM 언어의 역사는 파이썬 언어의 JVM 버전인 자이썬(Jython)으로부터 시작되었다.

자이썬은 사용자를 충분히 확보하지 못하여 결국 2005년에 실질적인 개발이 중단되었지만, 또 다른 JVM 언어들이 등장하는 계기가 되어주었다.



-

2001년에는 자바판 루비인 JRuby, 2003년에는 Groovy 가 발표되었다.

2003년은 Scalar 가 나온 해이기도 하다.

2007년 Lisp 를 변형하여 만든 Closure 역시 강력한 JVM 언어이다.




8.1.1. 일반적인 이점


-

JVM non-java 언어의 장점은..

    자질구레한 문법이 적어 핵심 로직이 잘 드러난다.

    더 읽기 쉬운 데이터 구조를 제공한다.

    표준 데이터 타입을 편하게 다룰 수 있는 메서드를 추가로 제공한다.

    더 강력한 기능을 언어 차원에서 지원한다.




8.1.2. 테스트 작성하기


-

성능보다 가독성

    제품 개발에 그루비나 루비 같은 동적 언어를 꺼리는 이유 중 하나는 성능이다.

    표현력과 간결한 문법을 얻을 수 있지만, 최고의 성능을 얻을 수 없기 때문이다.

    그러나 테스트 코드 관점에서 느린 성능은 치명적인 걸림돌이 되진 않는다.

    테스트에 더 중요한 것은 결국 가독성이고, 가독성은 동적 언어가 자랑하는 특징이다.



-

“미끼”로써의 테스트

    자동화된 테스트에만 제한적으로 적용하고 제품 코드는 익숙한 자바로 계속 작성할 수 있다.



-

테스트용 언어는 따로 있다.

    목적을 테스트 작성으로 한정한다면 다양한 JVM 언어 중에서도 우열을 가릴 수 있다.

    테스트 작성에는 대체로 간결한 문법과 다목적 데이터 구조를 제공하는 언어가 적합하다.

    non-Java JVM 언어 중에서는 루비와 그루비가 가장 적합하다고 볼 수 있다.





8.2.  그루비로 단위 테스트 작성하기


8.2.1. 간소화된 테스트 셋업




8.2.2. 그루비로 작성한 JUnit4 테스트





8.3. BDD 도구의 뛰어난 표현력


-

BDD 는 한 TDD 실천자가 테스트의 의도를 더 명확하게 표현하기 위한 용어를 찾는 과정에서 탄생했다.

테스트라는 단어는 원하는 동작을 정의한다는 정신을 잘 반영하지 못하며 의미가 너무 함축적이다.

그래서 개발자 커뮤니티에서는 테스트와 테스트 메서드보다는 명세(스펙)와 행위(동작)라는 용어를 거론하기 시작하면서 BDD 가 나왔다.




8.3.1. easyb 로 작성한 그루비 명세


-

easyb 는 문자열 상수로 표현할 수 있는 자유로움과 given-when-then 의 구조 사이에서 절묘한 조화를 보여준다.



-

scenario “새 리스트는 비어 있다.”, {
    given “새 리스트를 만든다.”, {
        list = new List()
    }

    then “리스트는 비어 있어야 한다.”, {
        list.isEmpty().shouldBe true
    }
}


8.3.2. 테스트의 표현력을 높여주는 스폭


-

스폭 프레임워크로 작성한 테스트(명세)는 easyb 시나리오와 흡사하다.



-

class ListSpec extends Specification{
    def setup(){
        list = new List()
    }

    def “처음에는 비어 있다.”(){
        expect:
            list.isEmpty() == true
    }

    def “원소를 넣으면 더 이상 비어 있지 않다.”(){
        when:
            list.add(new Object())
        then:
            list.isEmpty() == false
    }
}


-

스폭은 feature 라는 독특한 생명주기를 갖는 메서드를 실행하도록 만들어진 프레임워크다.

feature 메서드의 생명주기는 총 여섯 단계로 나뉘며, 각 단계를 블록(block)이라 부른다. (when, expect, then, setup,cleanup, where 블록)



-

where 블록은 feature 메서드의 마지막에 자리하며, feature 메서드를 파라미터화하여 실행한다.

def “두 수 중 더 큰 것을 구한다.”(){
    expect:
        Math.max(a,b) == c
    
    where:
        a << [5, 3]
        b << [1, 9]
        c << [5, 9]
}



8.3.3. 스폭의 또 다른 무기, 테스트 더블


-

스폭 프레임워크는 비 final 클래스와 인터페이스의 테스트 더블을 생성해주는 기능을 기본으로 제공한다.

스폭의 용어로는 mock 이라고 하며 다음과 같이 두 가지 생성 방식을 제공한다.

def screen = Mock(Screen) // 동적 방식
Keyboard keyboard = Mock() // 정적 방식, 프레임워크가 변수 타입을 보고 적절한 Mock 을 알아서 결정해준다.


-

mocking  은 아래와 같이 한다.

keyboard.receive() >> “스텁으로 만든 고정된 입력입니다.”





8.4. 요약


-

제2의 JVM 언어들을 이용하여 훨씬 간결한 문법과 언어의 강력한 기본 기능으로 더 가독성 높은 코드를 작성할 수 있다.

테스트에 동적 언어를 사용하는 이유가 위험부담 없이 새로운 언어를 익히기 위해서건, 그 언어의 장점에 이끌려서건 상관없이, 분명 테스트의 많은 부분이 개선될 것이다.



-

easyb 와 스폭이라는 오픈 소스 BDD 프레임워크를 이용하여 원하는 동작들을 가독성 좋게 표현할 수 있다.

전통적인 JUnit 과는 상당히 다른 표현 방식이자, 많은 경우에 더 나은 방식이다.




반응형

댓글