junit test execution order
이 튜토리얼은 JUnit 테스트 케이스에 대한 실행 순서를 설정하는 방법을 설명합니다. JUnit 4와 JUnit 5에서 JUnit 테스트 실행 순서를 설정하는 주석 및 클래스에 대해 학습합니다.
테스트 스위트를 만드는 방법, 테스트 케이스에 카테고리 또는 태그를 추가하는 방법, 이전 튜토리얼에서 카테고리 또는 태그를 기반으로 테스트를 필터링 (테스트 케이스 제외 또는 포함)하는 방법을 배웠습니다.
게다가 JUnit 4에서는 @Category, @IncludeCategory, 과 @ExcludeCategory JUnit 5가 테스트 케이스를 필터링하는 동안 @IncludeTags 과 @ExcludeTags 똑같이.
JUnit 5에는 주석을 사용하는 추가 필터링 옵션이 있습니다. @IncludePackages, @ExcludePackages, 클래스 이름 패턴을 사용하여 클래스를 포함하거나 제외하는 주석도 있습니다.
=> JUnit 교육 자습서의 A-Z를 보려면 여기를 확인하십시오. .
학습 내용 :
JUnit 테스트 실행 순서
이 튜토리얼에서는 설정된 순서대로 실행되도록 각 테스트 케이스의 순서를 설정하는 방법을 학습합니다. JUnit 4와 JUnit 5에서 테스트를 주문하는 방법을 배웁니다.
테스트 방법은 기본적으로 특정 순서를 따르지 않습니다.테스트 케이스는 작성된 순서대로 실행될 필요는 없습니다.
테스트 케이스의 실행 순서를 설정하는 다양한 방법 또는 모드가 있습니다. 또한 JUnit 5와 비교했을 때 테스트 케이스를 정렬 할 때 JUnit 4가 어떻게 달라지는 지 자세히 살펴볼 것입니다.
JUnit 4 : @FixedMethodOrder, 클래스 MethodSorters
JUnit 4.11부터 주석이 있습니다. 안녕하세요. 과 MethodSorters.class 테스트 실행 순서를 설정하는 기능을 지원합니다.
패키지 org.junit.runners. * 클래스를 포함하려면 가져와야합니다. MethodSorters . 이 클래스는 테스트 케이스의 순서를 결정합니다. MethodSorters 있다 세 열거 형 가치.
다음은 각 값이 제공하는 목적과 함께 클래스의 열거 형 값입니다.
MethodSorters.DEFAULT | 이 열거 형 값은 특정 순서로 테스트 실행을 정렬합니다. 그러나 테스트 케이스를 어떤 순서로 실행할지 예측할 수 없습니다. |
그렇기 때문에 어떤 테스트 케이스를 먼저 실행하고 다음에 어떤 테스트 케이스를 따라야하는지에 대한 결정을 제어 할 수 있습니다. | |
실행시 DEFAULT 열거 형으로 정렬 된 여러 메서드가있는 클래스가 테스트 실행 중에 매번 동일하게 유지되는 것을 확인했습니다. | |
그러나 주문이 설정된 방식을 예측하거나 파악할 수있는 방법은 없습니다. | |
MethodSorters.JVM | JVM enum을 사용한 테스트 실행 순서는 이름에서 알 수 있듯이 JVM에 의해 결정됩니다. |
이 경우 클래스를 실행할 때마다 테스트가 동일하지 않고 임의의 순서로 실행됩니다. | |
즉, 테스트 순서는 각 실행 중에 변경됩니다. | |
MethodSorters.NAME_ASCENDING | 이 열거 형은 메서드 이름의 사전 순으로 테스트 메서드를 정렬합니다. 따라서 이것이 테스트 실행을 주문하는 가장 예측 가능한 방법이므로 안심할 수 있습니다. |
따라서 설정 한 이름의 사전 순서에 따라 테스트 순서를 미리 결정할 수 있습니다. |
주석 안녕하세요. 입력 매개 변수를받습니다. MethodSorters 열거 형 값으로. 주석에 필요한 패키지는 다음과 같습니다. org.junit.FixedMethodOrder.
코드를 통해 어떻게 구현되는지 살펴 보겠습니다.
MethodSorters.DEFAULT에 대한 코드 구현
JUnit 클래스 파일‘ Junit4TestOrder.java ' 우리가 사용할 곳 MethodSorters.DEFAULT
Junit4TestOrder.java의 코드
@FixMethodOrder(MethodSorters.DEFAULT) public class JUnit4TestOrder { @Test public void Testcase_3() { System.out.println('Testcase_3 executes'); } @Test public void Testcase_1() { System.out.println('Testcase_1 executes'); } @Test public void Testcase_2() { System.out.println('Testcase_2 executes '); } }
우리는 클래스를 세 번 실행하고 아래와 같이 동일한 테스트 순서가 실행되는 것을 보지만 테스트 케이스는 정렬 된 순서로 실행될 수도 있고 실행되지 않을 수도 있습니다.
콘솔 창에 다음과 같은 결과가 표시됩니다. 테스트 실행 순서는 TestCase_3, TestCase_1, TestCase_2이며 순서는 실행 횟수에 따라 변경되지 않습니다.
MethodSorters에 대한 코드 구현. JVM
이제‘Junit4TestOrder.java’를 업데이트하여 MethodSorters.JVM
Junit4TestOrder.java의 코드 스 니펫
@FixMethodOrder(MethodSorters . JVM ) public class JUnit4TestOrder {
클래스를 두 번 실행하고 실행할 때마다 테스트 실행 순서가 변경됩니다.
콘솔 창 먼저 실행은 다음과 같습니다.
콘솔 창 둘째 실행은 다음과 같습니다.
두 실행 모두에서 테스트가 실행되는 순서의 변화를주의 깊게 관찰하십시오. 두 실행의 테스트 순서가 달랐습니다.
MethodSorters.NAME_ASCENDING에 대한 코드 구현
이제‘Junit4TestOrder.java’를 업데이트하여 MethodSorters.NAME_ASCENDING
Junit4TestOrder.java의 코드 스 니펫
@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class JUnit4TestOrder {
클래스를 두 번 실행하면 실행되는 테스트 순서는 동일하게 유지되며 메서드 이름의 오름차순에 따라 실행됩니다.
콘솔 창에는 TestCase_1, TestCase_2 및 TestCase_3 순서로 실행 된 테스트 결과가 표시됩니다.
JUnit 5 : @TestMethodOrder, @Order, 인터페이스 MethodOrderer
테스트 실행 순서를 제어하기 위해 아래 항목이 동일한 작업을 수행하는 데 도움이됩니다.
- @TestMethodOrder 주석
- @Order 주석
- MethodOrderer 인터페이스에 속하는 클래스
기본 제공 MethodOrderer 클래스 및 세부 정보는 다음과 같습니다.
MethodOrderer의 내장 클래스 | 패키지에서 | 세부 |
---|---|---|
영숫자 | org.junit.jupiter.api.MethodOrderer.Alphanumeric | 이름에 따라 영숫자 순으로 테스트 메서드를 정렬합니다. |
OrderAnnotation | org.junit.jupiter.api.MethodOrderer.OrderAnnotation | @Order 주석에 전달 된 값을 기준으로 테스트 메서드를 숫자로 정렬합니다. |
랜덤 | org.junit.jupiter.api.MethodOrderer.Random | JUnit 4의 MethodSorters.JVM 케이스와 같이 테스트 메소드를 무작위로 정렬합니다. |
이제 이러한 각 주문 전략의 데모를 살펴 보겠습니다.
Alphanumeric.class에 대한 코드 구현
JUnit4TestOrder.java와 동일한 JUnit5TestOrder.java라는 JUnit 5 클래스 파일을 만들고 Alphanumeric.class와 함께 주석을 사용하여 테스트를 영숫자 순서로 정렬 해 보겠습니다.
Junit5TestOrder.java의 코드
@TestMethodOrder(Alphanumeric.class) public class JUnit5TestOrder { @Test public void Testcase_3() { System.out.println('Testcase_3 executes'); } @Test public void Testcase_1() { System.out.println('Testcase_1 executes'); } @Test public void Testcase_2() { System.out.println('Testcase_2 executes '); } }
클래스를 세 번 실행했지만 테스트 메서드 이름의 영숫자 정렬 순서로 동일한 테스트 순서가 실행되는 것을 볼 수 있습니다.
클래스 파일 실행 후, 테스트 실행 순서 :
- Testcase_1,
- Testcase_2 및
- Testcase_3
노트 : 영숫자 정렬 전략 대소 문자를 구분합니다 따라서 testcase_1이라는 이름의 다른 테스트 케이스가있는 경우
실행 순서는 다음과 같습니다.
- Testcase_1,
- Testcase_2,
- Testcase_3,
- testcase_1.
따라서 대문자가 소문자 메서드 이름보다 우선합니다.
Random.class에 대한 코드 구현
이제 Random.class와 함께 주석을 사용하도록 JUnit 5 클래스 JUnit5TestOrder.java를 업데이트합니다.
Junit5TestOrder.java의 코드 스 니펫
@TestMethodOrder (Random.class) public class JUnit5TestOrder {
우리는 클래스를 두 번 실행했고 매번 클래스를 실행할 때마다 테스트 실행 순서가 무작위로 정렬되어 있음을 확인했습니다.
에 대한 클래스 파일 실행 후 처음으로 에서 테스트 실행 순서는 다음과 같습니다.
- Testcase_2,
- Testcase_1
- Testcase_3
실행 된 실행 순서 둘째 보여준 시간 :
- Testcase_2,
- Testcase_3
- Testcase_1 .
OrderAnnotation.class에 대한 코드 구현
이제 주석을 사용하도록 JUnit 5 클래스 JUnit5TestOrder.java를 업데이트합니다. OrderAnnotation.class. 주석 @주문 여기에서 테스트 방법의 우선 순위 설정에 중요한 역할을합니다.
Junit5TestOrder.java의 코드 스 니펫
@TestMethodOrder(OrderAnnotation.class) public class JUnit5TestOrder { @Test @Order(1) public void Testcase_3() { System.out.println('Testcase_3 executes'); } @Test @Order(2) public void Testcase_1() { System.out.println('Testcase_1 executes'); } @Test @Order(3) public void Testcase_2() { System.out.println('Testcase_2 executes '); } }
따라서 테스트 실행 순서를 설정하는이 전략에서 @Order 주석은 테스트 메서드가 주문 금액 그것을 위해 설정되고 있습니다.
테스트 메서드의 @Order 값이 낮을수록 실행 중 우선 순위가 높습니다.
실행 후 테스트 순서는 다음과 같이 실행되었습니다.
- Testcase_3,
- Testcase_1
- 테스트 케이스의 순서 세트가 각각 1,2 및 3이기 때문에 Testcase_2입니다.
그렇기 때문에 테스트 케이스가 순서대로 작성되었는지는 중요하지 않습니다. 또한 메서드 이름이 영숫자 순서인지 여부는 중요하지 않습니다.
JUnit 5 : 맞춤 주문 생성
또한 내장 주문 클래스 인 JUnit 5는 인터페이스를 구현하여 맞춤 주문도 지원합니다. MethodOrderer . JUnit 5 버전 5.4부터 사용자 정의 정렬이 지원됩니다.
메서드 길이별로 맞춤 주문을 만들고 구현하는 방법을 빠르게 살펴 보겠습니다.
1 단계: MethodOrderer 인터페이스를 구현하는 사용자 정의 주문 클래스를 만들고 클래스 이름을 TestCaseLengthOrder로 지정했습니다.
TestCaseLengthOrder.java의 코드
public class TestCaseLengthOrder implements MethodOrderer { @Override public void orderMethods(MethodOrdererContext context) { MethodDescriptor md1; MethodDescriptor md2; context.getMethodDescriptors().sort((md1, md2)-> md1.getMethod().getName().length().compareTo(md2.getMethod().getName().length())); } }
TestCaseLengthOrder 코드 설명 :
- 사용자 정의 주문 클래스는 MethodOrderer 인터페이스를 구현하여 생성됩니다.
- void orderMethods (MethodOrderContext context) {} 인터페이스 MethodOrderer에서 구현 된 내장 메서드입니다. 여기에서 테스트 주문 로직의 구현을 정의합니다.
- MethodDescriptor는 메서드에 대한 세부 정보를 포함하는 인터페이스입니다.
- MethodDescriptor.getMethod () 메서드는이 설명 자의 메서드 이름을 가져옵니다.
- 메소드 이름은 getName () 메소드 즉, MethodDescriptor.getMethod (). getName () 및
- length () 메서드는 메서드의 길이를 가져옵니다 (string.length ()가 문자열 값의 길이를 가져 오는 것처럼).
- 모든 메서드 이름은 compareTo () 메서드를 사용하여 서로 비교됩니다.
- getMethodDescriptors () 메서드는 클래스의 모든 메서드 설명자 목록을 가져옵니다.
- sort () 메서드는 MethodDescriptor 객체를 정렬합니다.
이제 MethodOrderer의 각 API를 명확하게 이해 했으므로 위의 코드를 쉽게 해석 할 수 있기를 바랍니다.
2 단계 : 테스트 클래스에서 기본 제공 순서를 사용하는 것처럼 사용자 정의 순서 클래스를 사용하십시오.
@TestMethodOrder 주석에 대한 입력으로.
JUnit_CustomOrder.java의 코드
@TestMethodOrder(TestCaseLengthOrder.class) class JUnit_CustomOrder{ @Test public void subt(){ } @Test public void add(){ } @Test public void multiply(){ } @Test public void divide(){ }
3 단계 :
사후 실행 JUnit_CustomOrder.class 에서 테스트 케이스 이름 길이의 오름차순을 기준으로 테스트 실행 순서는 다음과 같습니다.
- 더하다(),
- subt (),
- 나누기 ()
- 곱하다()
결론
JUnit 테스트 실행 순서에 대한이 튜토리얼을 마칩니다.
- 특정 어노테이션과 특정 클래스를 사용하여 테스트 케이스의 순서를 설정하는 방법을 배웠습니다.
- 또한 주문 전략이 변경된 JUnit 4 및 JUnit 5의 테스트를 주문하는 다양한 방법을 배웠습니다.
- 또한 JUnit 5에서 사용자 정의 정렬 클래스를 생성하고이를 실행 중에 테스트 케이스를 정렬하는 데 사용할 수있는 방법을 배웠습니다.
=> 여기에서 JUnit 초보자 가이드를 살펴보십시오.
추천 도서
- JUnit 테스트 : 예제로 JUnit 테스트 케이스를 작성하는 방법
- JUnit 주석 목록 : JUnit 4 대 JUnit 5
- JUnit 무시 테스트 사례 : JUnit 4 @Ignore Vs JUnit 5 @Disabled
- JUnit 테스트 스위트 및 필터링 테스트 케이스 : JUnit 4 Vs JUnit 5
- JUnit 테스트 픽스처 란 무엇인가 : JUnit 4 예제를 사용한 튜토리얼
- 초보자를위한 JUnit 튜토리얼-JUnit 테스팅이란?
- JUnit 테스트를 실행하는 여러 방법
- Appium 테스트의 대규모 실행을 병렬로 실행하는 방법