문제

Junit 4.4와 Maven을 사용하고 있으며 많은 장기 통합 테스트가 있습니다.

테스트 스위트를 병렬화 할 때 각 테스트 방법을 단일 테스트 클래스로 병렬로 실행할 수있는 몇 가지 솔루션이 있습니다. 그러나 이들 모두는 테스트를 어떤 식 으로든 변경해야합니다.

X 스레드에서 X 다른 테스트 클래스를 동시에 실행하는 것이 훨씬 더 깨끗한 솔루션이라고 생각합니다. 수백 개의 테스트가 있으므로 개별 테스트 클래스를 실행하는 데 실제로 신경 쓰지 않습니다.

이것을 할 방법이 있습니까?

도움이 되었습니까?

해결책 2

Junit 4.7에서 TestNG를 사용하지 않고 테스트를 병렬로 실행할 수 있습니다. 실제로 4.6 이후 이후 가능했지만 4.7에서 수정이 이루어지면서 실행 가능한 옵션이 될 수 있습니다. 스프링과 함께 병렬 테스트를 실행할 수도 있습니다. 여기

다른 팁

Maven 플러그인 사용 :

<build>
    <plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.7.1</version>
        <configuration>
            <parallel>classes</parallel>
            <threadCount>5</threadCount>
        </configuration>
    </plugin>
    </plugins>
</build>

Junit의 실험에서 영감을 얻었습니다 병렬 컴퓨터 러너 나는 내 자신을 만들었습니다 평행선 그리고 ParallelParameterized 주자. 이 러너를 사용하면 테스트 스위트와 매개 변수화 된 테스트를 쉽게 병렬화 할 수 있습니다.

Parallelsuite.java

public class ParallelSuite extends Suite {

    public ParallelSuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {

        super(klass, builder);

        setScheduler(new RunnerScheduler() {

            private final ExecutorService service = Executors.newFixedThreadPool(4);

            public void schedule(Runnable childStatement) {
                service.submit(childStatement);
            }

            public void finished() {
                try {
                    service.shutdown();
                    service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
                } catch (InterruptedException e) {
                    e.printStackTrace(System.err);
                }
            }
        });
    }
}

ParallelParameterized.java

public class ParallelParameterized extends Parameterized {

    public ParallelParameterized(Class<?> arg0) throws Throwable {

        super(arg0);

        setScheduler(new RunnerScheduler() {

            private final ExecutorService service = Executors.newFixedThreadPool(8);

            public void schedule(Runnable childStatement) {
                service.submit(childStatement);
            }

            public void finished() {
                try {
                    service.shutdown();
                    service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
                } catch (InterruptedException e) {
                    e.printStackTrace(System.err);
                }
            }
        });
    }
}

사용법은 간단합니다. 그냥 변경하십시오 @runwith 이들 중 하나에 주석 값 평행한* 클래스.

@RunWith(ParallelSuite.class)
@SuiteClasses({ATest.class, BTest.class, CTest.class})
public class ABCSuite {}

템포 푸트 비슷한 것을 제공하고 자세한 내용은 문서를 확인하십시오. 그것은 Junit 4.7에 의존하고 당신은 당신의 시험을 @RunWith(ConcurrentTestRunner).

건배

testng는 그렇게 할 수 있습니다 (이것은 나의 첫 번째 반사였습니다. 그런 다음 나는 당신이 이미 많은 테스트 케이스를 가지고있는 것을 보았습니다).

Junit의 경우보십시오 평행 주니트.

오픈 소스 라이브러리를 확인할 수 있습니다. 로드 밸런서를 테스트하십시오. 그것은 당신이 요구하는 것과 정확히 일치합니다 - 다른 테스트 클래스를 병렬로 실행합니다. 이것은 ANT-JUNIT 수준으로 통합되어 테스트를 변경할 필요가 없습니다. 나는 도서관의 저자 중 하나입니다.

또한 프로세스 레벨 샌드 박스가 필요할 수 있으므로 스레드에서 실행하지 않는 것을 생각해보십시오. 예를 들어, 통합 테스트에서 DB를 치는 경우 다른 테스트가 다른 스레드에 일부 데이터를 추가했기 때문에 하나의 테스트가 실패하지 않기를 바랍니다. 대부분의 시간, 테스트는 이것을 염두에두고 기록되지 않습니다.

마지막으로, 지금 까지이 문제를 어떻게 해결 했습니까?

Junit 자체가 제공하는 병렬 컴퓨터를 사용하여 테스트를 병렬로 실행할 수 있습니다. 다음은 당신을 시작할 수있는 작은 스 니펫이 있습니다.

Class[] cls = { TestCase1.class, TestCase2.class };
Result result = JUnitCore.runClasses(ParallelComputer.classes(), cls);
List<Failure> failures = result.getFailures();

이것은 Maven 또는 기타 빌드 관리 도구에 대한 의존성이 없으므로 코드에서 테스트를 실행해야 할 때 도움이됩니다.

이렇게하면 모든 테스트 사례가 병렬로 실행됩니다. 다른 테스트 사례간에 종속성이 있으면 오 탐지가 발생할 수 있습니다. 어쨌든 상호 의존적 인 테스트가 없어야합니다.

테스트를 1 분 안에 테스트 테스트로 변경할 수 있습니다 (수입 만 변경하면됩니다). TestNG는 병렬 테스트에서 최고입니다.

당신은 시도 할 수 있습니다 그리드 게인 이를 통해 컴퓨팅 그리드에 걸쳐 테스트를 배포 할 수 있습니다.

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