Dev/TDD

Junit In Action - TDD를 위한 테스트 원칙, 도구 및 활용 Review - Gradle, IntelliJ 와 함께하는 Junit5

린네의 2024. 10. 9. 16:13

들어가기전에

책에는 빌드 도구로 Gradle 뿐만 아니라 Maven,  IDE는 Eclipse 및 NetBeans 등이 추가로 기술되어 있었지만 책이 집필된 시점과 현재를 비교했을 때 사용률이 월등히 다르기도하고 내가 Gradle, Intellij, Jenkins를 실무에서 쓰고 있기 때문에 나머지 내용은 스킵했다. 

 

이번 장에선 Junit5의 사용법보다는, 각 build Tool 과 IDE를 쓰면 얻을 수 있는 장점정도를 간략하게 정리하려고 한다.

 

 

Gradle

Gradle은 프로젝트 설정 파일을 Groovy(그루비:JVM에서 실행될 수 있고 자바 언어와 호환 가능한 객체 지향 프로그래밍 언어)를 기반으로한 DSL로 작성한다. 여기서 DSL이란 Domain Specific language의 준말이다. 번역하면 '도메인 특화 언어'라는 뜻으로, 쉽게 말해서 특정 도메인에서 발생하는 문제를 해결하기 위한 언어를 사용하자는 것이다.

 

Gradle은 빌드의 의도를 선언적으로 나타낸다. 즉 Gradle을 활용해서는 빌드가 어떻게 실행되어야 하는지 절차를 말하는 것이 아니라, 결과가 무엇과 같아야 하는지 최종 목적을 말하게 된다.

 

무엇인지만 기술하면 된다. 어떻게는 필요하지 않다!

 

가령, '컴파일 해야한다' '테스트는 이것으로 할것이다' 정도만 기술하면 어떻게 할지는 Gradle이 내부적으로 처리 한다. 

 

다음은 build.gradle 파일에서 사용하는 설정 파일들의 항목들이다.

 

  • plugins :  플러그인 종류 작성. 여기서 플러그인은 태스크의 집합을 의미하며, script plugin과 binary plugin으로 나뉜다. script는 로컬 파일 시스템이나 원격에서 정의한 스크립트를 적용할 때 사용하고,  개발자는 주로 binary 에 주목해야 한다. 널리 쓰이는 binary플러그인은 일반적으로 이름이 짧다.id 'java'
  • repositories :  어떤 저장소를 사용할 것인지 작성 jcenter()
  • dependencies : 의존성 구성 작성 implementation 
  • application : 어플리케이션 구성 정보 작성 mainClassName 
  • test : 테스트에 사용할 정보 작성 useJunitPlatform() : 괄호안에  includeTags, excludeTags 등을 사용해서 테스트를 실행할 때 포함하거나 제외할 태그를 특정할 수도 있음

 

아래는 표준적인 의존성 구성 종류이다. dependencies {} 블록 에서 사용된다.

  • gradle init (혹은 gradlew init) 새로운 프로젝트를 초기화할 때 사용, build.gradle등과 같은 초기화 파일 자동 생성 됨
표준 구성 의미
implementation 소스 코드를 컴파일할 때 필요한 의존성
runtime 런타임에 필요한 의존성. 기본적으로 컴파일 타임 의존성도 있다.
testImplementation 테스트 코드를 컴파일할 때 필요한 의존성. 기본적으로 컴파일 타임 의존성과 컴파일된 클래스가 있다.
testRuntime 테스트를 런타임에 실행하기 위한 의존성. 런타임과 테스트 컴파일 타임 의존성이 같이 포함된다.
runtimeOnly 컴파일 타임이 아닌 런타임에만 필요한 의존성을 포함할 때 사용한다.
testRuntimeOnly 테스트 컴파일 타임이 아니라 테스트 런타임에만 필요한 의존성을 포함할 때 사용한다.

 

 

이렇듯 Gradle로 프로젝트를 생성하면 Gradle 래퍼(wrapper)도 같이 생성된다. 이것을 줄이면 gradlew라고도 부를 수 있다. 래퍼는 특

정한 버전의 Gradle을 호출하는 스크립트를 의미한다.  래퍼를 사용하면 프로젝트를 공유할 때 매우 유용하다. 다른 사용자는 래퍼를 통해 프로젝트를 만드는 데 사용한 Gradle과 정확히 동일한 버전으로 프로젝트를 빌드할 수 있고, 별도로 Gradle을 설치할 필요도 없다.

 

  • gradle test (혹은 gradlew test) → 해당 명령어를 실행하면 build/reports/tests/test 폴더에 테스트 리포트가 생성 된다. 
  • gradle build (혹은 gradlew build) 해당 명령어를 실행하면 build/libs 폴더에 jar 아티팩트가 생성된다.

 

 

 

 

IntelliJ 

IntelliJ는 다른 IDE(Eclipse, NetBeans)와 비교해서 Junit5와 가장 통합이 잘되어 있는 IDE이다.  주요 기능은 다음과 같다.

 

  • 비활성화된 테스트 강제실행 (@Disabled 사용 테스트)
  • @DisplayName 애노테이션을 활용한 사용자 친화적인 디스플레이
  • 동적 테스트를 실행했을 때 나타나는 사용자 친화적인 디스플레이

  • 중첩 테스트를 실행했을 때 나타나는 사용자 친화적인 디스플레이

  • 파라미터를 사용한 테스트를 실행했을 때 나타나는 사용자 친화적인 디스플레이

  • 반복 테스트를 실행했을 때 나타나는 사용자 친화적인 디스플레이
  • 태그를 사용한 테스트를 실행했을 때 나타나는 사용자 친화적인 디스플레이
  • IDE를 활용해 코드 커버리지 확인 가능