문제

Junit에서 테스트를 그룹화하여 일부 그룹 만 실행할 수있는 방법이 있습니까?

아니면 일부 테스트에 주석을 달고 전 세계적으로 비활성화 할 수 있습니까?

사용 중입니다 주니트 4, 나는 testng를 사용할 수 없다.

편집하다: @Runwith 및 @SuiteClasses는 훌륭하게 작동합니다. 그러나 테스트 클래스에서 이와 같이 주석을 달 수 있습니까? 아니면 전체 테스트 클래스에 주석을 달아야합니까?

도움이 되었습니까?

해결책

테스트 클래스 내에서 테스트를 그룹화 하시겠습니까, 아니면 테스트 클래스를 그룹화하고 싶습니까? 나는 후자를 가정 할 것이다.

테스트를 실행하는 방법에 따라 다릅니다. Maven이 실행하는 경우 포함하려는 테스트를 정확하게 지정할 수 있습니다. 보다 Maven Surefire 문서 이것을 위해.

더 일반적으로, 내가하는 일은 시험 스위트 나무가 있다는 것입니다. Junit 4의 테스트 스위트는 다음과 같습니다.

 @RunWith(Suite.class)
 @SuiteClasses(SomeUnitTest1.class, SomeUnitTest2.class)
 public class UnitTestsSuite {
 }

그래서 아마도 나는 functiontestssuite와 unittestssuite를 가지고 있고, 다른 두 가지를 포함하는 AllTestSsuite가있을 것입니다. 일식에서 그들을 실행하면 아주 좋은 계층 적 견해를 얻습니다.

이 접근법의 문제점은 테스트를 하나 이상의 다른 방식으로 슬라이스하려면 지루한 것입니다. 그러나 여전히 가능합니다 (예 : 모듈을 기반으로 슬라이스하는 한 세트의 스위트가있을 수 있습니다. 그런 다음 테스트 유형의 다른 슬라이싱).

다른 팁

Junit 4.8은 그룹화를 지원합니다.

public interface SlowTests {}
public interface IntegrationTests extends SlowTests {}
public interface PerformanceTests extends SlowTests {}

그리고...

public class AccountTest {

    @Test
    @Category(IntegrationTests.class)
    public void thisTestWillTakeSomeTime() {
        ...
    }

    @Test
    @Category(IntegrationTests.class)
    public void thisTestWillTakeEvenLonger() {
        ...
    }

    @Test
    public void thisOneIsRealFast() {
        ...
    }
}

그리고 마지막으로,

@RunWith(Categories.class)
@ExcludeCategory(SlowTests.class)
@SuiteClasses( { AccountTest.class, ClientTest.class })
public class UnitTestSuite {}

여기에서 가져온 것 : http://weblogs.java.net/blog/johnsmart/archive/2010/04/25/grouping-tests-using-junit-categories-0

또한 Arquillian 자체는 그룹화를 지원합니다.https://github.com/weld/core/blob/master/tests-arquillian/src/test/java/org/jboss/weld/tests/categories.java

전 세계적으로 비활성화하기 위해 Junit (4.5+)에는 새로운 방법을 사용하는 두 가지 방법이 있습니다. 테스트 클래스의 @beforeclass (또는 @before)에 넣고 조건이 실패하면 테스트가 무시됩니다. 조건에서는 시스템 속성 또는 전 세계적으로 켜거나 꺼질 수있는 다른 것을 넣을 수 있습니다.

다른 대안은 글로벌 속성을 이해하고 해당 러너에게 대표하는 사용자 정의 러너를 만드는 것입니다. 이 접근법은 훨씬 더 부서지기 쉽지만 (Junit4 내부 러너는 불안정하고 릴리스에서 릴리스로 변경 될 수 있기 때문에) 클래스 계층 구조를 상속받을 수 있고 서브 클래스로 무시할 수 있다는 이점이 있습니다. 레거시 junit38 클래스를 지원해야한다면이 작업을 수행하는 유일한 현실적인 방법입니다.

다음은 사용자 정의 러너를 수행하는 코드입니다. GetPropripriaTerunnerforclass가 할 수있는 일에 대해, 내가 구현 한 방식은 맞춤 러너에게 무엇을 실행 해야하는지 알려주는 별도의 주석을 갖는 것이 었습니다. 유일한 대안은 Junit 코드의 매우 부서지기 쉬운 복사 페이스트였습니다.

private class CustomRunner implements Runner
 private Runner runner;

    public CustomRunner(Class<?> klass, RunnerBuilder builder) throws Throwable {
        if (!isRunCustomTests()) {
            runner = new IgnoredClassRunner(klass);
        } else {
            runner = getAppropriateRunnerForClass(klass, builder);
    }

    public Description getDescription() {
        return runner.getDescription();
    }

    public void run(RunNotifier notifier) {
        runner.run(notifier);
    }
}

편집 : @runwith 태그는 전체 클래스에서만 작동합니다. 해당 제한을 중심으로 작업하는 한 가지 방법은 테스트 방법을 정적 내부 클래스로 옮기고 주석을달라고하는 것입니다. 그렇게하면 수업 조직과의 주석의 이점이 있습니다. 그러나 그렇게하는 것은 @before 또는 @beforeclass 태그에 도움이되지 않으므로 내부 클래스의 사람들을 재현해야합니다. 외부 클래스의 방법을 호출 할 수 있지만 고유 한 방법을 고리로해야합니다.

노력하다 주니트 테스트 그룹. 문서 :

@TestGroup("integration")
public class MyIntegrationTest {
   @ClassRule
   public static TestGroupRule rule = new TestGroupRule();

   ...
}
  • 간단한 테스트 그룹 실행 : -dtestgroup = 통합
  • 다중 테스트 그룹 실행 : -dtestgroup = group1, group2
  • 모든 테스트 그룹을 실행하십시오 : -dtestgroup = all

Junit 5에서는 선언 할 수 있습니다 @Tag 클래스 또는 방법 수준에서 필터링 테스트의 경우; Testng 또는 Junit 4의 카테고리의 테스트 그룹과 유사합니다.

로부터 Javadoc :

태그는 주어진 테스트 계획에 대해 테스트가 실행되는 테스트를 필터하는 데 사용됩니다. 예를 들어, 개발 팀은 "Fast", "Slow", "CI-Server"와 같은 값으로 테스트를 태그 한 다음 현재 테스트 계획에 사용할 태그 목록을 제공 할 수 있습니다. 환경.

예를 들어 테스트 클래스를 "slow" @Tag 모든 방법에 대해 상속 받고 필요한 경우 일부 방법에 대해 재정의됩니다.

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

@Tag("slow") 
public class FooTest{

   // 
   @Test
   void loadManyThings(){ 
        ...
   }

   @Test
   void loadManyManyThings(){ 
        ...
   }


   @Test
   @Tag("fast")
   void loadFewThings(){ 
        ...
   }

}

다른 테스트 클래스에 동일한 논리를 적용 할 수 있습니다.
이러한 방식으로 테스트 클래스 (및 방법도)는 특정 태그에 속합니다.

복사 및 붙여 넣기 대신 모범 사례로 @Tag("fast") 그리고 @Tag("slow") 테스트 클래스 전체에서 사용자 정의 구성된 주석을 만들 수 있습니다.
예를 들어 :

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.junit.jupiter.api.Tag;

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Tag("slow")
public @interface Slow {
}

다음과 같이 사용하십시오.

@Test
@Slow
void slowProcessing(){ 
    ...
}   

텍스트 실행 중에 특정 태그로 표시된 테스트를 활성화하거나 비활성화하려면 Maven-Surefire-Plugin 문서 :

태그 또는 태그 표현식을 포함하려면 사용하십시오 groups.

태그 또는 태그 표현식을 제외하려면 사용하십시오 excludedGroups.

POM.XML에서 요구 사항에 따라 플러그인을 구성하십시오 (문서의 예) :

 <build>
     <plugins>
         ...
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-surefire-plugin</artifactId>
             <version>2.22.0</version>
             <configuration>
                 <groups>acceptance | !feature-a</groups>
                 <excludedGroups>integration, regression</excludedGroups>
             </configuration>
         </plugin>
     </plugins> 
</build> 

정보를 위해 테스트 목표 문서 업데이트되지 않았습니다.

테스트를 만들 수 있습니다 모음곡 테스트 그룹이 포함 된 개체. 또는 IDE (Eclipse와 같은)는 주어진 패키지에 포함 된 모든 테스트를 실행하는 것을 지원할 수 있습니다.

테스트 스위트를 사용할 수 있습니다 (http://qaautomated.blogspot.in/2016/09/junit-test-suits-and-test-execution.html) 또는 카테고리를 주니 할 수 있습니다 (http://qaautomated.blogspot.in/2016/09/junit-categories.html) 테스트 사례를 효과적으로 그룹화합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top