유명한 Java 장치 테스트 프레임 워크 인 Junit 4는 오랫동안 나왔습니다. 당시 Junit 5가 베타 버전에 있다는 것을 알았으므로 Junit 5를 소개하기 위해 기사를 작성하려고했습니다. 그러나 여전히 베타 버전이기 때문에 일부 부품은 완벽하지 않으며 약간 게으르고 글을 잘 쓰지 않습니다. 나는 요즘이 사건을 갑자기 기억했다. 공식 웹 사이트에서 확인했을 때 9 월 10 일, Junit 5의 공식 버전이 마침내 나왔음을 알았습니다! 그런 다음 기사를 다시 쓰고 최신 Junit 프레임 워크를 소개했습니다.
프레임 워크 구조
Junit 4와 비교하여 Junit 5의 구조는 매우 명확하며 사용자 정의 플러그인, IDE 테스트 실행 등과 같은 확장 된 기능을 잘 지원합니다. 이는 프로젝트 구조에서 볼 수 있습니다.
주니트 플랫폼
이 그룹의 패키지 이름은 org.junit.platform입니다. 이름에서 볼 수 있듯이이 그룹의 주요 기능은 테스트 프레임 워크의 기본 플랫폼 역할을하는 것입니다. 이 패키지의 모듈에는 기본 API, 실행 엔진 및 실행자, 기본 명령 줄 실행 기능, 명령 줄 인터페이스, Maven 및 Gradle 테스트 플러그인 및 기타 기본 기능이 포함됩니다.
주니 목성
목성은 Junit 5의 코드 이름입니다.이 패키지의 모듈에는 Junit 5의 주요 기능이 포함되어 있습니다. Junit 5를 사용하려면이 모듈 세트를 포함시켜야합니다.
주니 빈티지
빈티지는 이전 버전의 Junit의 코드 이름입니다. 이 패키지의 모듈을 사용하면 새로운 주니트 플랫폼에서 Old Junit 3 및 4의 테스트를 실행할 수 있습니다.
수입 클래스 라이브러리
Junit 5는 여전히 베타 단계에 있지만 Maven과 Gradle에 Junit 5를 통합하는 예가 있습니다. 그러나 공식 버전에서는이 부분의 내용이 사라져서 샘플 프로젝트에 대한 두 가지 링크 만 남겨 두었습니다 (복사 및 붙여 넣기).
Maven 사용
Junit5-Maven-Consumer는 공식적인 Maven 예입니다. 나는 원래 관련 POM 구성을 여기에 게시하려고했지만 Maven의 구성이 너무 길다는 것을 알았을 때 잊어 버렸을 것입니다. 요구 사항이 있으면이 프로젝트의 POM 구성을 직접 확인하십시오.
Gradle 사용
Gradle을 사용하면이 문제가 훨씬 간단합니다. Junit5-gradle-consumer 샘플 프로젝트에는 자세한 설명도 있습니다.
우선, Gradle은 기본적으로 Junit 5를 지원하지 않으므로 Junit Platform Gradle 플러그인을 지원할 수 있도록 활성화해야합니다.
빌드 스크립트 {repositories {mavencentral ()} 종속성 {classpath 'org.junit.platform : junit-platform-gradle-plugin : 1.0.0'}} 플러그인을 적용하십시오 : 'org.junit.platform.gradle.plugin'그런 다음이 Gradle 플러그인의 구성이 있습니다. 기본적으로 모든 엔진 및 태그가 실행됩니다. 특정 엔진 및 태그에 대한 테스트를 수행하려면 다음을 무시하고 자신의 요구에 따라 수정할 수 있습니다. 물론 이러한 고급 요구 사항이없는 경우이 부분을 삭제할 수 있습니다.
junitplatform {// platformversion '1.0.0'필터 {엔진 {// 'junit-jupiter', 'junit-vintage', 'junit-vintage'// exclude 'custom-engine'} tags {// 'fast'slow '} // include'} // includeclassnamepattern '. 파일 ( '빌드/테스트-레즈울/junit-platform') // 이것은 기본값 // logmanager 'org.apache.logging.log4j.jul.logmanager'}입니다.Junit 5 테스트 만 실행하면 다음 두 가지 종속성을 가져 오십시오. 주니트 플랫폼 종속성이 자동으로 가져옵니다.
종속성 {testCompile ( "org.junit.jupiter : junit-jupiter-api : 5.0.0") testruntime ( "org.junit.jupiter : junit-jupiter-ennine : 5.0.0")}새 플랫폼에서 Old Junit 3 및 4 테스트를 실행하려면 다음 종속성을 가져와야합니다.
종속성 {testCompile ( "junit : junit : 4.12") testruntime ( "org.junit.vintage : junit-vintage-engine : 4.12.0")}테스트를 작성하십시오
Junit 4 테스트
이전 구성이 모두 완료되면 지금 테스트를 시작할 수 있습니다. 먼저 Old Junit 4 테스트를 검토해 봅시다.
public class junit4test {@beforeclass public static void init () {system.out.println ( "전 클래스");}@afterclass public static void clean () {system.out.println ( "After Class");}@public void 이전 () {system.out.println ( "이전"); {System.out.println ( "After");}@test public void test1 () {system.out.println ( "test 1");}@test public void test2 () {system.out.println ( "test 2");}}Gradle 테스트 및 기타 명령을 사용 하여이 테스트를 실행하십시오. 결과는 이것과 비슷합니다.
ClassbeforeTest 이전 1test 2fater 클래스 전에
Junit 5 테스트
동등한 Junit 5 테스트를 작성하는 방법을 살펴 보겠습니다. 가장 명백한 변화는 볼 수 있습니다. 우선, 몇 가지 주석이 더 유명한 이름으로 바뀌 었습니다. 또 다른 요점은 테스트 방법이 공개 메소드 일 필요가 없으므로 키보드를 몇 번 더 적게 입력 할 수 있다는 것입니다.
public class junit5test {@beforeall static void beforeall () {system.out.println ( "전");}@Afterall static void afterall () {system.out.println ( "결국"); {System.out.println ( "After");}@test void test1 () {system.out.println ( "test 1");}@test void test2 () {system.out.println ( "test 2");}}주장을 작성하십시오
테스트 사례가 올바른지 확인하려면 몇 가지 주장을 작성해야합니다. Junit 5에는 테스트 사례를 작성하는 데 도움이되는 많은 주장이 있습니다. 또한, 이러한 주장에는 Java 8 사용에 매우 적합한 Lambda 표현식을 허용 할 수있는 과부하 된 버전이 제공됩니다. 물론, 나는 개인적으로 Assertj가 더 편리하다고 생각합니다.
import static org.junit.assert.asserttrue; import static org.junit.jupiter.api.assertions.*; public class assertiondemo {@test void testAssertion () {AsserTequals (10, 10); asserttrue (true); Assertequals (100, 100, "2 개의 동일한 숫자"); AsserTall ( "number" -> assertequals ( "name", "name"), () -> assertequals (500, 500)); assertThrows (invalidparameterexception.class, () -> {새로운 invalidparameterexception ();}); int result = assertTimeout (duration.ofseconds (5), () -> {int i = 0, j = 0; while (i <= 100) {for (; j <= 100000; j ++) j ++; i ++;} return i;}); Assertequals (100, 결과); }}의존성 주입
이제 테스트 클래스의 생성자와 테스트 방법 모두 매개 변수를 수용 할 수 있습니다. ParameterResolver 인터페이스는 런타임에 매개 변수를 주입하는 방법을 정의합니다. 몇몇 내장을 통해 테스트 케이스의 런타임에 대한 정보를 얻을 수 있습니다.
첫 번째는 TestInfoparameterResolver입니다. 이 메소드에 TestInfo 유형 인스턴스가있는 경우 Junit 5 프레임 워크가 자동으로 인스턴스를 주입합니다. 이 인스턴스의 몇 가지 방법을 사용하면 이름, 표시 이름, 레이블 및 테스트 클래스 및 테스트 방법의 기타 정보를 얻을 수 있습니다.
public class fectenctioninjectiondemo {@test @displayname ( "종속성 주입") @tag ( "test") void testdisplayname (testinfo testinfo) {Assertequals ( "종속성 주입", testinfo.getDisplayame (); AsserTequals (collections.singleton ( "test"), testInfo.getTags ()); }}repetitioninfoparameterresolver와 같은 내장 매개 변수 파서도 나중에 소개됩니다.
일반적인 주석
표시 이름
테스트 러너 및 테스트 보고서가 표시하는 테스트 클래스 및 테스트 방법에 사용자 정의 이름을 추가 할 수 있습니다. 디스플레이 이름은 변수 이름처럼 표시되지 않습니다. 공백이 포함 된 긴 줄 또는 이모티콘 이모티콘 일 수도 있습니다.
@displayName ( "테스트 클래스는 디스플레이 이름을 지정할 수 있습니다") 공개 클래스 디스플레이 디스플레이 {@test @DisplayName ( "테스트 메소드도 디스플레이 이름을 지정할 수 있습니다") void testwithLongDisplayName () {} @Test @DisplayName ( "디스플레이 이름도 포함 할 수 있습니다.") {}}테스트를 비활성화합니다
@Disabled 주석은 테스트 클래스 또는 테스트 방법에 사용할 수 있으며 해당 테스트를 비활성화 할 수 있습니다.
@disabledpublic class disabledtestdemo {@test // disabled void testDisabled () {}}반복 테스트
테스트 방법을 여러 번 실행 해야하는 경우 @repeatedTest 주석을 사용하십시오.
public class repeatedTestDemo {@repeatedTest (10) void testRepeated10times () {}}또한 인스턴스 repetitioninfo를 주입하여 현재 반복 수와 총 반복 수를 확인할 수도 있습니다.
public class repetedTestDemo {@beforeeach void voideach (repetitionInfo info) {system.out.printf ( " %d- %d/n", info.getCurrentRepetition (), info.getToTalRepetitions ());}@repeatedTest (10) void testrepeated10times ()}}}}}}}}}}}태그와 함께 제공됩니다
Gradle 구성을 도입했을 때 구성에서 특정 레이블을 필터링하도록 선택할 수 있다고 말했습니다. 코드에 태그를 제공하는 것은 매우 간단합니다. @tag 주석 만 사용하십시오.
@tag ( "taggedest") public class tagdemo {@test @tag ( "taggedtest1") void testwithtag1 () {}} @test @tag ( "taggedTest2") void testwithTag2 () {}}중첩 된 테스트
때로는 중첩 테스트가 특정 테스트 간의 포함 관계를 나타내려면 필요할 수 있습니다. 중첩 테스트는 @nested 주석을 사용합니다.
@DisplayName ( "OUTER TEST") PUBLIC CLASS NESTEDDEMO {@test void testOUter () {} @nested @DisplayName ( "Inner Test") 클래스 innerTestDemo {@test void testinner () {}}}정적 내부 클래스 만 중첩 된 주석을 사용할 수 있습니다. 또한 Java는 내부 클래스가 정적 메소드를 가질 수 없으므로 @beforeall 및 @afterall 주석을 가질 수 없습니다. 이 제한을 깰 경우 중첩 된 내부 클래스에 @testinstance (lifecycle.per_class) 주석을 추가해야합니다. 자세한 내용은 테스트 인스턴스 라이프 사이클을 참조하십시오.
IDE 지원
Junit 5가 지금 나왔지만. 그러나 다양한 도구 체인의 지원은 유지되지 않았습니다. 현재 Intellij Idea와 Eclipse 4.7 (산소) 만 Junit 5에 대한 지원을 추가했습니다. 따라서 공식적인 상황에있는 경우 Junit 4를 사용하는 것이 더 안전합니다.
자주 묻는 질문
@Test 주석의 다른 버전을 구별하십시오
이 기사를 작성하는 것처럼 테스트 예제에 문제가 발생했습니다. 테스트를 전달할 수없고 아래 오류 메시지가 표시됩니다.
실패 (1) : junit 빈티지 : yitian.study.test.assertiondemo : initializationError classSource [classname = 'yitian.study.test.assertiondemo', fileposition = null] => java.lang.exception : 메소드 테스트 assertion ()
영어가 좋은 학생들은 그것을 인식 할 수 있어야합니다. 이 오류 메시지는 테스트 방법이 공개되어야한다고 말합니다. 그러나 앞에서 언급했듯이 Junit 5는이 제한을 취소 했으므로 왜이 오류가 여전히 발생합니까? 나는 조심스럽게보고 오류를 발견했다. 아마도 Junit 4가 과거에 많이 사용 되었기 때문에 IDE는 @test 주석에 기본적으로 기본적으로 완료되었습니다.
import org.junit.test;
이 패키지는 Junit 4의 @Test 주석입니다. Junit 5를 사용하려면 다음 @Test 주석이 필요합니다.
import org.junit.jupiter.api.test;
수정 한 후 테스트를 다시 실행하면 실제로 아무런 문제가 없었습니다. 물론 학습과 사용을 위해 Junit 4 패키지도 참조하므로 이러한 갈등이 발생합니다. 특별한 요구가없는 경우 혼란을 방지하기 위해 Junit 5 JAR 패키지 만 가져 오는 것이 좋습니다. 물론, 그것들을 모두 가져 오는 것은 괜찮지 만, 그것들을 구별하기 위해주의해야하고 Junit 4 주석을 Junit 5 테스트에 쓰지 않아야합니다. 마지막으로 테스트 예제를 첨부하겠습니다. 관심있는 사람들은 살펴볼 수 있습니다.
요약
위는 Junit5 관련 콘텐츠에 대한이 기사의 전체 내용이며 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!