테스트 코드작성하기위해 찾아보던 자료중 어쩌다 JUnit4을 발견해서 JUnit5과 차이점을 알아보기위해 작성했습니다.
JUnit
- 자바 프로그래밍 언어용 유닛 테스트 프레임워크
- 테스트 결과는 Test클래스로 개발자에게 테스트 방법 및 클래스의 History를 공유 가능
- 단정(assert) 메서드로 테스트 케이스의 수행 결과를 판별
- 어노테이션으로 간결하게 지원(JUnit4부터)
스프링부트에서는 언제부터 Junit5를 지원하게되었나?
SpringBoot 2.2.x 버전이 release 되면서 예전의 SpringBoot에서 Junit4 버전이 Junit5이 기본으로 변경되었습니다.
Junit5는 Java 8 이상의 버전을 요구합니다.
Junit4 vs Junit5
- Junit4 > vintage-engine
- Junit5 > jupiter-engine
엔진의 차이점이 있다는것이었다
추가적인 차이는 https://reiphiel.tistory.com/entry/junit5-features2?category=814473 여기를 참고하자!!
또 어노테이션들에 많은 차이가있었다
JUnit5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
JUnit5 모듈 구성
JUnit5는 이전버전과 달리 크게 3개의 서브 프로젝트로 구성된 복수의 모듈로 구성되어 있습니다. 또한 각각의 프로젝트는 용도에 따라서 몇개의 서브 모듈로 구성되어 있습니다.
JUnit Platform
JUnit 테스트를 실행하기 위한 기반이 되는 모듈입니다. Gradle, Maven과 같은 빌드툴은 물론 IDE를 위한 모듈도 각각 존재합니다. Platform이 제공하는 TestEngine
을 구현한 모듈을 찾아서 실행해준다고 보면 될 것 같습니다.
JVM에서 동작하는 테스트 프레임워크입니다. 테스트를 발견하고 계획을 생성하고 결과를 보고하는 TestEngine 인터페이스를 정의합니다.
JUnit Jupiter
테스트를 기술하기 위한 프로그램, 확장 모델들이 담겨있는 모듈입니다. 엄밀한 의미에서는 맞지않겠지만 흔히 JUnit5라고 언급할 경우에 이 모듈을 지칭한다고 생각하시면 될 듯 합니다.
JUnit Vintage
JUnit의 3, 4 버전을 실행하기 위한 TestEngine
을 제공하는 모듈입니다. 이 모듈을 통해서 JUnit5와 병행 사용이 가능합니다. TestEngine에서 Junit3 및 Junit4 기반 테스트를 실행하기 위한 기능을 제공합니다.
제가 제일 궁금했던 어노테이션의 차이는 @ExtendWith입니다. 왜냐 @AutoMockMvc와 같이사용해야 MockMvc를 사용할수있었기떄문입니다.
@ExtendWith 애노테이션은 JUnit5에서 확장 기능을 실행할 때 사용한다.
SpringExtension은 JUnit5를 위한 스프링 확장 기능으로 스프링 연동 테스트를 실행할 수 있게 한다.
그런데 @SpringBootTest에 들어있기때문에 안사용해도된다.
AssertJ 와 Junit Assertions
Assertions는 Junit이 구현한 클래스도있고, AssertJ의 Assertions가 있다. 주로 AssertJ를 사용한다 왜냐하면 Junit은 메소드를 외워야한다는 단점이있다고 한다 (백기선님 피셜)
AssertJ공식문서를 보면 바꾸는방법이 나온예시에서 AssertJ가 더 명확하다
// Junit
assertEquals(expected, actual);
// to : AssertJ
assertThat(actual).isEqualTo(expected);
https://jade314.tistory.com/entry/Junit-5
https://junit.org/junit5/docs/current/user-guide/#advanced-topics
https://joel-costigliola.github.io/assertj/assertj-core-converting-junit5-assertions-to-assertj.html