만들기 JUnit 예제가 포함된 테스트 스위트: @RunWith @SuiteClasses

⚡ 스마트 요약

JUnit 테스트 스위트는 여러 클래스의 테스트 케이스를 모아서 @RunWith(Suite.class) 및 @SuiteClasses 어노테이션을 통해 단일 패스로 함께 실행되도록 하며, 일반 테스트 러너 클래스를 통해 실행됩니다.

  • 🔘 목적 : 여러 클래스의 테스트를 개별적으로 실행하는 대신, 하나의 실행 가능한 단위로 그룹화하세요.
  • ☑️ 특수 효과 : @RunWith(Suite.class)는 실행을 위임하는 반면, @SuiteClasses는 스위트가 실행해야 하는 모든 클래스 목록을 지정합니다.
  • ✅ 단계 : 테스트 클래스를 작성하고, 두 어노테이션을 모두 포함하는 홀더 클래스를 추가한 다음, 실행하세요. JUnit핵심 러너.
  • 🧪 예: JunitTest.java는 SuiteTest1과 SuiteTest2를 그룹화하고, 콘솔에는 세 개의 테스트가 모두 통과했다는 메시지가 표시됩니다.
  • 🛠️ JUnit 5: Jupiter는 플랫폼 스위트 엔진에서 실행기를 @Suite와 @SelectClasses 또는 @SelectPackages로 대체합니다.
  • 📌 함정 : 테스트 스위트가 비어 있거나, 임포트가 누락되었거나, 스위트 클래스 자체에 @Test 메서드가 있는 경우 대부분의 오류가 발생합니다.

만들기 JUnit @RunWith 및 @SuiteClasses 어노테이션이 포함된 테스트 스위트

In JUnit테스트 스위트를 사용하면 모든 것을 종합할 수 있습니다. 테스트 케이스 여러 수업의 내용을 한 곳에 모아 동시에 진행할 수 있습니다.

스위트 테스트를 실행하려면 아래에 언급된 어노테이션을 사용하여 클래스에 어노테이션을 추가해야 합니다.

  1. @RunWith(Suite.class)
  2. @SuiteClasses(test1.class, test2.class…) 또는 @Suite.SuiteClasses({test1.class, test2.class…})

위와 같은 어노테이션을 사용하면 테스트 스위트에 포함된 모든 테스트 클래스가 하나씩 순차적으로 실행됩니다. 스위트 클래스 자체는 비어 있으며, 단지 어노테이션을 저장하는 역할만 합니다. 실행 프로그램은 이러한 어노테이션을 읽고 어떤 클래스를 실행할지 결정합니다.

테스트 스위트 및 테스트 실행기를 생성하는 단계

아래의 네 단계는 실제로 실행되는 가장 작은 테스트 스위트를 구축하는 방법입니다. 이 스위트는 두 개의 일반 테스트 클래스, 이 클래스들의 이름을 지정하는 스위트 클래스, 그리고 메인 메서드에서 스위트를 시작하는 실행기로 구성됩니다.

단계 1) 간단한 테스트 클래스(예: MyFirstClassTest)를 만들고 어노테이션이 있는 메서드를 추가하세요. @테스트.

첫 번째 클래스는 빈 테스트 메서드 하나만 포함하고 있는데, 이것만으로도 테스트 스위트가 해당 클래스를 인식한다는 것을 증명하기에 충분합니다.

MyFirstClassTest 클래스 Eclipse @Test 어노테이션이 있는 myFirstMethod를 선언합니다.

단계 2) 테스트 클래스를 하나 더 생성하고(예: MySecondClassTest), @Test 어노테이션이 붙은 메서드를 만드세요.

두 번째 클래스도 정확히 같은 형태를 따르므로, 이 스위트는 집계할 두 개의 별도 클래스를 가지고 있습니다.

MySecondClassTest 클래스 Eclipse @Test 어노테이션이 있는 mySecondMethod를 선언합니다.

단계 3) 테스트 스위트를 생성하려면 먼저 클래스에 `@RunWith(Suite.class)` 및 `@SuiteClasses(class1.class, class2.class…)` 어노테이션을 추가해야 합니다.

TestSuiteExample 클래스는 자체적으로 테스트 메서드를 선언하지 않았다는 점에 주목하세요. 두 개의 어노테이션이 모든 정보를 담고 있습니다.

TestSuiteExample에는 @RunWith(Suite.class) 및 @SuiteClasses 어노테이션이 지정되어 있으며, 각각 MyFirstClassTest와 MySecondClassTest라는 이름을 가지고 있습니다.

단계 4) 아래와 같이 테스트 스위트를 실행하는 Test Runner 클래스를 생성하세요.

달리기 선수는 평범하다 Java 스위트 클래스를 전달하는 main 메서드를 가진 클래스 JUnit코어 :

테스트 실행기 클래스 호출 JUnitTestSuiteExample에서 Core.runClasses를 실행하고 실패 목록을 출력합니다.

Code 설명 :

  • Code 8 라인 : Test 클래스의 main 메서드를 선언합니다. 이 메서드는 우리의 테스트를 실행할 것입니다. JUnit 테스트.
  • Code 9 라인 : 테스트 케이스 실행 JUnitCore.runClasses는 테스트 클래스 이름을 매개변수로 받습니다(위 예시에서는 3단계에 나와 있는 TestSuiteExample.class를 사용합니다).
  • Code 11 라인 : for 루프를 사용하여 결과를 처리하고 실패 결과를 출력합니다.
  • Code 13 라인 : 성공적인 결과를 인쇄해 보세요.

출력: 다음은 테스트가 실패 없이 성공적으로 완료되었음을 보여주는 출력 결과입니다. trace는 아래와 같습니다.

Eclipse JUnit TestSuiteExample 실행 결과 2/2, 오류 및 실패 없음

녹색 막대는 스위트의 용도를 나타냅니다. 스위트는 한 번의 실행, 한 번의 결과 보기, 그리고 두 개의 개별 실행이 아닌 스위트 노드 아래에 두 클래스 모두 보고되는 기능을 제공합니다.

JUnit 테스트 스위트 예

좀 더 복잡한 예를 들어보겠습니다. 이 예에서는 스위트 내의 클래스들이 실제로... 단언하다 빈 메서드를 보유하는 대신 무언가를 보유합니다.

JunitTest.java

JunitTest.java는 어노테이션이 달린 간단한 클래스입니다. @런위드 @모음곡 어노테이션. 아래와 같이 스위트에 포함될 클래스를 원하는 만큼 매개변수로 나열할 수 있습니다.

package guru99.junit;		
import org.junit.runner.RunWith;		
import org.junit.runners.Suite;		

@RunWith(Suite.class)				
@Suite.SuiteClasses({				
  SuiteTest1.class,
  SuiteTest2.class,  			
})		

public class JunitTest {				
			// This class remains empty, it is used only as a holder for the above annotations		
}

SuiteTest1.java

SuiteTest1.java 이 클래스는 아래와 같이 메시지를 출력하는 테스트 메서드를 가진 테스트 클래스입니다. 이 클래스는 위에서 언급한 클래스의 테스트 스위트 멤버로 사용됩니다. 이 클래스는 라는 이름의 헬퍼 클래스를 사용합니다. JUnit이 메시지는 동일 패키지의 다른 곳에서 정의되어 있으므로 여기서는 재현하지 않습니다.

package guru99.junit;		

import static org.junit.Assert.assertEquals;				

import org.junit.Test;		

public class SuiteTest1 {				

    public String message = "Saurabh";							

    JUnitMessage junitMessage = new JUnitMessage(message);							

    @Test(expected = ArithmeticException.class)					
    public void testJUnitMessage() {					

        System.out.println("Junit Message is printing ");					
        junitMessage.printMessage();			

    }		

    @Test		
    public void testJUnitHiMessage() {					
        message = "Hi!" + message;							
        System.out.println("Junit Hi Message is printing ");					
        assertEquals(message, junitMessage.printHiMessage());					
        System.out.println("Suite Test 2 is successful " + message);							
    }		
}		

SuiteTest2.java

SuiteTest2.java 이것은 또 다른 테스트 클래스이며, 다음과 유사합니다. SuiteTest1.java아래와 같은 메시지를 출력하는 테스트 메서드를 가지고 있습니다. 이 클래스는 스위트의 멤버로 사용될 것입니다. JunitTest.java.

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Test;		

public class SuiteTest2 {				
   	

    @Test		
    public void createAndSetName() {					
        		

        String expected = "Y";					
        String actual = "Y";					

        Assert.assertEquals(expected, actual);					
        System.out.println("Suite Test 1 is successful " + actual);							
    }		

}		

산출

실행 후 주닛테스트.java 파일에는 다음과 같은 내용이 포함된 스위트가 들어 있습니다. SuiteTest1.java SuiteTest2.java그러면 아래와 같은 출력이 나타납니다. 콘솔에는 두 클래스에서 생성된 메시지가 모두 출력됩니다.

Eclipse JunitTest가 완료된 후 두 테스트 클래스에서 출력된 메시지를 보여주는 콘솔 화면입니다.

The JUnit 보기 기록은 스위트 클래스 아래에 그룹화된 세 가지 통과 테스트 메서드와 동일하게 실행됩니다.

Eclipse JUnit SuiteTest1 및 SuiteTest2를 확장하여 JunitTest를 실행한 결과 3/3이 모두 성공했다는 보고서를 확인하세요.

참고 : 이 예제에서는 콘솔 레이블이 서로 바뀌어 있습니다. SuiteTest1이 출력하는 문자열은 "Suite Test 2"이고 SuiteTest2가 출력하는 문자열은 "Suite Test 1"입니다. 원본 코드는 변경 없이 그대로 재현되었으므로 레이블은 작성자가 작성한 그대로 유지됩니다. 클래스 이름은 다음과 같습니다. JUnit 출력과 소스를 일치시킬 때는 인쇄된 라벨보다는 보기 화면을 참조하십시오.

테스트 스위트를 만드는 방법 JUnit 5

JUnit 버전 5에서는 러너가 완전히 제거되었으므로 `@RunWith(Suite.class)`는 `org.junit.jupiter` 패키지에 존재하지 않습니다. 스위트는 다른 곳으로 이동했습니다. JUnit 플랫폼은 이러한 파일들을 별도의 아티팩트에 담아 배송합니다. junit 플랫폼 스위트 엔진해당 의존성을 추가한 다음, 클래스에 @Suite 어노테이션과 선택자 어노테이션 중 하나를 추가하세요.

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

@Suite
@SuiteDisplayName("Guru99 suite")
@SelectClasses({ SuiteTest1.class, SuiteTest2.class })
public class JunitTest {
    // Empty holder, exactly as in JUnit 4
}

선택자 어노테이션은 단일 @SuiteClasses 목록을 몇 가지 옵션으로 대체합니다.

주석 선택하는 것
@SelectClasses 개별 테스트 클래스의 이름을 하나씩 지정할 수 있으며, 이는 @SuiteClasses를 직접 대체합니다.
@SelectPackages 지정된 패키지와 그 하위 패키지에 있는 모든 테스트 클래스.
@IncludeClassNamePatterns 선택 영역에 정규 표현식 필터를 적용했습니다.
@SuiteDisplayName 보고서에 수업 이름 대신 읽기 쉬운 이름이 표시됩니다.

실제로 중요한 두 가지 차이점이 더 있습니다. JUnit 5. 스위트 클래스는 전체 스위트를 한 번씩 실행하는 @BeforeSuite 및 @AfterSuite 메서드를 선언할 수 있습니다. JUnit 위의 4번째 예시는 여전히 실행됩니다. JUnit 이 플랫폼은 기존 엔진을 통해 작동하므로 이 페이지의 원래 코드를 다시 작성할 필요 없이 계속 작동합니다.

장점과 한계 JUnit 테스트 스위트

스위트룸은 그룹입니다.ping 메커니즘이지, 메커니즘이 아닙니다. 테스트 프레임워크 그 자체로 고유한 특성을 지니고 있으며, 이는 그 제품이 잘하는 부분과 더 이상 유용하지 않게 되는 부분을 모두 결정합니다.

장점

  • 한 번의 실행으로 관련 클래스들이 함께 실행되므로, 스모크 세트나 되돌아옴 설정은 단 하나의 명령으로 시작됩니다.
  • 결과 보기에서는 모든 클래스가 하나의 스위트 노드 아래에 그룹화되므로 공통 오류를 더 쉽게 파악할 수 있습니다.
  • 회원 목록은 코드에 저장되어 있으므로 다른 소스 파일과 마찬가지로 검토 및 버전 관리가 이루어집니다.
  • 동일한 스위트 클래스는 IDE 또는 실행 도구(예: )에서 실행할 수 있습니다. JUnit코어 또는 빌드 도구에서 가져온 것입니다.

제한 사항

  • @SuiteClasses는 하드코딩된 리스트이므로, 누군가가 스위트를 수정하기 전까지는 새로운 테스트 클래스가 추가되더라도 아무런 알림 없이 제외됩니다.
  • 이 패키지는 수업이 나열된 순서 외에는 순서를 보장하지 않습니다.
  • 멤버 클래스 간에는 공유되는 것이 없으므로, 스위트는 픽스처나 베이스 클래스를 대체할 수 없습니다.
  • 빌드 도구는 이미 명명 규칙을 통해 테스트 클래스를 검색하므로 많은 프로젝트에서 테스트 스위트가 불필요해집니다.

생성 시 흔히 발생하는 오류 JUnit 테스트 스위트

대부분의 스위트 문제 발생 시 짧고 도움이 되지 않는 메시지가 표시됩니다. 아래 표는 발생 가능성이 높은 메시지와 그 원인 및 해결 방법을 보여줍니다.

메시지 또는 증상 원인 수정
초기화 오류: 실행 가능한 메서드가 없습니다 해당 클래스는 일반 테스트 클래스처럼 실행되지만, 어노테이션만 포함하고 있습니다. 기본 실행기 대신 스위트 실행기가 작동하도록 하려면 `@RunWith(Suite.class)`를 추가하세요.
클래스 Suite 기호를 찾을 수 없습니다. Suite 가져오기가 누락되었습니다. org.junit.runner.RunWith와 함께 org.junit.runners.Suite를 가져옵니다.
스위트 프로그램은 실행되지만 수업 하나가 건너뛰어졌습니다. 해당 클래스는 @SuiteClasses 목록에 추가된 적이 없습니다. 클래스를 명시적으로 추가하거나 @SelectPackages로 이동하세요. JUnit 5.
컴파일러가 클래스 이름을 허용하지 않습니다. @Runwith 또는 @suiteClasses 어노테이션의 대소문자가 잘못 입력되었습니다. Java 어노테이션은 대소문자를 구분합니다. @RunWith와 @SuiteClasses를 정확히 입력하세요.
해당 스위트 클래스 자체의 테스트는 전혀 실행되지 않습니다. 스위트 홀더에 `@Test` 메서드가 추가되었습니다. 홀더를 비워두고 테스트 메서드를 멤버 클래스로 옮기세요.

모음곡을 한 번 쓰고 유지하세요ping 정확성이 진정한 핵심입니다. 목록이 디스크에 있는 클래스와 다르면 테스트 스위트는 녹색으로 보고하지만 일부는 그렇지 않습니다. 단위 테스트 set 함수가 전혀 실행되지 않는 것은 가장 조용한 오류 유형 중 하나입니다. 소프트웨어 테스팅.

자주 묻는 질문

해당 스위트는 나열된 순서대로 클래스를 실행합니다. JUnit 각 클래스 내부 메서드의 실행 순서에 대해서는 보장하지 않습니다. 이전 테스트 실행에 의존하는 테스트는 취약하므로 독립적으로 실행될 수 있도록 다시 작성해야 합니다.

네. 실행기 입장에서 스위트 클래스는 일반 클래스와 동일하므로, `@SuiteClasses` 리스트 안에 이름을 지정하면 스위트가 중첩됩니다. 중첩은 더 작은 모듈 스위트들을 기반으로 최상위 회귀 테스트 스위트를 구축할 때 유용합니다.

AI 어시스턴트는 디스크에 저장된 테스트 클래스를 읽고, 이를 @SuiteClasses 목록과 비교하여 추가되지 않은 클래스를 표시합니다. 또한 반복되는 오류를 그룹화합니다. trac근본 원인별로 분류하여, 여러 문제가 한꺼번에 보고된 후에도 문제 해결 시간을 단축할 수 있습니다.

부조종사 주석 쌍을 빠르게 작성하지만, 자주 혼합됩니다. JUnit 4 및 JUnit 같은 파일에 5개의 import 문이 있습니다. org.junit.runners.Suite와 org.junit.platform.suite.api.Suite가 함께 나타나지 않도록 확인하세요. 둘 중 하나만 사용 중인 러너와 일치하기 때문입니다.

테스트 범위에 `junit-platform-suite-engine`을 추가하세요. `@Suite` 및 `@SelectClasses` 어노테이션은 `junit-platform-suite-api`에 있으며, 이 엔진 아티팩트가 이를 간접적으로 가져오기 때문에 일반적으로 하나의 종속성만으로도 충분합니다.

보통은 그렇지 않습니다. Surefire와 Gradle 테스트 태스크는 이미 네이밍 패턴을 통해 테스트 클래스를 찾아 모두 실행합니다. 전체 실행보다 작은 규모의 명명된 부분 집합(예: 스모크 테스트 세트)을 실행하려는 경우 테스트 스위트를 작성하는 것이 좋습니다.

테스트 실행기가 해당 멤버에 대한 초기화 오류를 보고하며, 실행 가능한 메서드를 찾을 수 없다고 표시하고 전체 테스트 스위트를 실패로 표시합니다. 해당 항목을 제거하거나 클래스에 @Test 메서드를 추가하세요.

하나의 선택 목록 안에 있지 않습니다. 유지하세요. JUnit 빈티지 엔진에 대한 4가지 클래스 중에서 선택하세요. JUnit 5개 패키지로 구성되어 있으므로 두 엔진 모두 동일한 환경에서 실행됩니다. JUnit 어노테이션 패밀리를 혼합하지 않고 플랫폼을 시작합니다.

이 게시물을 요약하면 다음과 같습니다.