programing

JUnit의 @TestMethodOrder 주석이 작동하지 않습니다.

lastmemo 2023. 2. 25. 19:42
반응형

JUnit의 @TestMethodOrder 주석이 작동하지 않습니다.

다음 통합 테스트에 문제가 있습니다.

import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;

@SpringBootTest
@ActiveProfiles("test")
@TestMethodOrder(OrderAnnotation.class)
public class FooServiceIT {
    @Test
    @Order(1)
    void testUploadSuccess() { ... }
    @Test
    @Order(2)
    void testDownloadSuccess() { ... }
    @Test
    @Order(3)
    void testDeleteSuccess() { ... }
}

테스트를 실행할 때는 실행순서가 1, 2, 3이 될 것으로 예상되지만 어떤 이유에서인지 실제 실행순서는 2, 3, 1입니다.

Tbh, 나는 왜 주석이 작동하지 않는지 모르겠어요.JUnit 5.4에서 Spring Boot 2.1.3을 사용하고 있습니다.

IDE 를 올바르게 설정할 필요가 있습니다.

요구 사항들

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.4.0</version>
</dependency>

IDE를 제공하는 JUnit 5는 사용하지 마십시오.라이브러리로 추가하면 다음과 같이 됩니다.

No tests found for with test runner 'JUnit 5' 
==================== and this exception ===================
TestEngine with ID 'junit-vintage' failed to discover tests
java.lang.SecurityException: class "org.junit.jupiter.api.TestMethodOrder"'s signer information does not match signer information of other classes in the same package

따라서 언급된 종속성만 포함하면 코드가 예상대로 작동합니다.

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class FooServiceIT {

    @Test
    @Order(1)
    public void testUploadSuccess() {
        System.out.println("1");
    }

    @Test
    @Order(2)
    public void testDownloadSuccess() {
        System.out.println("2");
    }

    @Test
    @Order(3)
    public void testDeleteSuccess() {
        System.out.println("3");
    }
}

JUnit 결과:

1
2
3

나도 같은 문제에 직면했다.하지만, 저는 제 케이스에 정확히 있는 문제를 발견했어요."Order" 클래스를 잘못 가져왔습니다.

잘못된 것

import org.springframework.core.annotation.Order;

오른쪽 하나

*import org.junit.jupiter.api.Order;*

또, 다음의 5개의 클래스를 적절히 Import 해 주세요.

import org.junit.jupiter.api.Assertions;

import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;

import org.junit.jupiter.api.Order;

import org.junit.jupiter.api.Test;

import org.junit.jupiter.api.TestMethodOrder;

docs https://junit.org/junit5/docs/current/api/org/junit/jupiter/api/TestMethodOrder.html 에서 입수할 수 있습니다.

 @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
 class OrderedTests {

     @Test
     @Order(1)
     void nullValues() {}

     @Test
     @Order(2)
     void emptyValues() {}

     @Test
     @Order(3)
     void validValues() {}
 }

JUnit 4를 가지고 있거나 가지고 있는 경우 Import에서 주석을 확인합니다.@Test:import org.junit.Test;

JUnit 5의 경우 Import는 다음과 같습니다.import org.junit.jupiter.api.Test;

이 질문은 제 문제였습니다.

pom.xml을 올바르게 설정해야 합니다.내 것을 봐:

<properties>
    <!-- Dependency versions -->
    <junit.jupiter.version>5.6.0</junit.jupiter.version>
    <maven-surefire-plugin.version>3.0.0-M4</maven-surefire-plugin.version>

    <!-- Java 10 -->
    <maven.compiler.source>1.10</maven.compiler.source>
    <maven.compiler.target>1.10</maven.compiler.target>

    <!-- Encoding -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>

<!-- Jupiter API for writing tests -->
<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit.jupiter.version}</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<!-- Maven Surefire plugin to run tests -->
<build>
    <plugins>
        <!-- plugin to run test cases from maven -->
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
        </plugin>
        <!-- Maven plugin to use perticular java version to compile code -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>${maven.compiler.source}</source>
                <target>${maven.compiler.target}</target>
            </configuration>
        </plugin>
    </plugins>
</build>

이제 Junit 5 주석이 올바르게 작동해야 합니다.

이전 권장 솔루션에 따라 모든 설정을 적용한 후아직 같은 역순서 또는 랜덤 @order 실행 중입니다.

Pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.3.RELEASE</version>
</parent>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>5.4.0</version>
    <scope>test</scope>
</dependency>

메이븐 의존관계 트리:

mvn dependency:tree -Dverbose -Dincludes=org.junit.jupiter:junit-jupiter-engine

[INFO] com.personalitytest.demo:personalitytest:jar:1.0-SNAPSHOT
[INFO] \- org.junit.jupiter:junit-jupiter-engine:jar:5.4.0:test

JUnit 테스트:

@SpringBootTest
@ActiveProfiles("test")
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JUnitOrderTest {

    private static final Logger log = LoggerFactory.getLogger(JUnitOrderTest.class);

    @Test
    @Order(1)
    public void testUploadSuccess() {
        log.info("Junit - Order 1");
    }

    @Test
    @Order(2)
    public void testDownloadSuccess() {
        log.info("Junit - Order 2");
    }

    @Test
    @Order(3)
    public void testDeleteSuccess() {
        log.info("Junit - Order 3");
    }
}

출력:

Running com.personalitytest.demo.security.JUnitOrderTest
08:48:35.470 [main] INFO com.personalitytest.demo.security.JUnitOrderTest - Junit - Order 2
08:48:35.480 [main] INFO com.personalitytest.demo.security.JUnitOrderTest - Junit - Order 3
08:48:35.481 [main] INFO com.personalitytest.demo.security.JUnitOrderTest - Junit - Order 1

같은 문제

저 같은 경우에는요.먼저 @Test 주석입니다.org.junit.jupiter.api.Test,것은 아니다.org.junit.Test.

둘째, 나는 덧붙였다.@RunWith(SpringRunner.class)테스트 클래스 선두에서는 제거 후 테스트 케이스 순서가 예상대로 실행됩니다.

예를 들어 스프링 부트를 사용하면 @FixMethodOrder(MethodSorters)를 사용할 수 있습니다.@TestMethodOrder(MethodOrderer)가 아닌 JVM).OrderAnnotation.class).모든 테스트는 표시되는 순서대로 실행됩니다.

@FixMethodOrder(MethodSorters.JVM)
public class MyTest{

   @Test
   public void zzzz(){}

   @Test
   public void cccc(){}

   @Test
   public void aaaa(){}

   @Test
   public void bbbb(){}
}

주문 실행:

zzzz()
cccc()
aaaa()
bbbb()

언급URL : https://stackoverflow.com/questions/54947645/junits-testmethodorder-annotation-not-working

반응형