[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 과는 상당히 다른 표현 방식이자, 많은 경우에 더 나은 방식이다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[Effective Unit Testing] Appendix A. JUnit 기초 (0) | 2019.03.20 |
---|---|
[Effective Unit Testing] Chap9. 테스트 속도 개선 (0) | 2019.03.19 |
[Effective Unit Testing] Chap7. 테스트 가능 설계 (0) | 2019.03.17 |
[Effective Unit Testing] Chap6. 신뢰성 (0) | 2019.03.15 |
[Effective Unit Testing] Chap5. 유지보수성 (0) | 2019.03.14 |
댓글