문제
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) 테스트 사례를 효과적으로 그룹화합니다.