2009-09-18 4 views
21

나는 내가 DatabaseTests 같은 다른 스위트의 테스트 스위트를 가지고 시험을위한 고전적인 구조 등 UnitTests 때로는 그 스위트 룸 SlowDatabaseTests 같은 다른 스위트 룸을 포함, 등 FastDatabaseTests는 내가 원하는의 실행 순서를 랜덤 JUnit 테스트를 임의의 순서로 실행하려면 어떻게해야합니까?

입니다

테스트를 통해 서로 의존적이지 않은지 확인합니다. 무작위 화는 모든 레벨에서 이루어져야합니다. 예를 들어 슈트가 테스트 클래스 순서를 뒤섞어서 테스트 클래스가 테스트 메소드 순서를 뒤섞어 야합니다.

Eclipse에서이 작업을 수행하는 것이 가장 좋습니다.

+7

무작위가 "우연히"작동 할 수 있기 때문에 순서를 임의 화하면 아무 것도 증명되지 않습니다. 또한 반복적이지 않으므로 실패의 원인을 추적 할 수 없습니다. – skaffman

+3

매번 테스트가 실행될 때마다 실행 명령을 작성하면 원인을 추적 할 수 있습니다. – nimcap

+8

Random()에 시간없이 날짜의 함수 인 시드를 주면 반복 가능하게 만들 수 있습니다. 이렇게하면 연속 빌드를 강력히 권장하므로 테스트가 실패했을 때 알 수 있습니다. – NamshubWriter

답변

12

을 당신이 가진 않는 Sortable하지만 난 당신이 그것을 사용하는 것입니다 볼 수 없습니다.

BlockJUnit4ClassRunner을 확장하고 computeTestMethods()은 super.computeTestMethods()의 무작위 사본을 반환 할 수 있습니다. 그런 다음 @RunWith을 사용하여 사용할 런너로 설정하십시오.

package com.stackoverflow.mlk; 

import java.util.Collections; 

import org.junit.runners.BlockJUnit4ClassRunner; 
import org.junit.runners.model.InitializationError; 

public class RandomBlockJUnit4ClassRunner extends BlockJUnit4ClassRunner { 

    public RandomBlockJUnit4ClassRunner(Class<?> klass) 
      throws InitializationError { 
     super(klass); 
    } 

    protected java.util.List<org.junit.runners.model.FrameworkMethod> computeTestMethods() { 
     java.util.List<org.junit.runners.model.FrameworkMethod> methods = super.computeTestMethods(); 
     Collections.shuffle(methods); 
     return methods; 
    } 

} 

그런 다음

@RunWith(com.stackoverflow.mlk.RandomBlockJUnit4ClassRunner.class) 
public class RandomOrder { 
    @Test 
    public void one() { 
    } 

    @Test 
    public void two() { 
    } 

    @Test 
    public void three() { 
    } 
} 
+0

좋은 답변이지만 꽤 충분하지 않습니다. Suite 클래스를 구현해야합니다. 테스트 클래스 순서를 무작위로 지정해야합니다. 게다가 많은 테스트가 있고 @RunWith 주석을 모두 넣고 싶지 않습니다. 나는 스위트 러너 – nimcap

+2

에서 이것을 처리 할 수 ​​있다고 생각하는데, 매우 유용하다는 것을 알게되었고, 테스트와 스위트를 무작위 화하는 작은 자바 프로젝트를 만들었습니다. 자세한 내용은 해당 페이지 : http://randomjunit.sourceforge.net/를 방문하십시오. – AngocA

0

나는 그들이 에 의존하지 있는지 확인합니다 서로

당신이 임의의 실행 순서에 의존하지 않고 경우가 있는지 확인해야합니다. 의존성이 존재할 수 있다는 것을 두려워하게 만드는 요인은 무엇입니까?

+0

사람들이 내 대답을 왜 왜곡하는지 물어봐도 될까요? 그게 뭐가 잘못 되었 니? –

+5

단위 테스트를 작성하고 독립 테스트를 수행하는 동안 매우 신중하고 있습니다. 그러나 우리는 또한 매우 조심스럽게 생산 코드를 작성하고, 버그가 나타나기도하고, 이들이 독립적이라는 보장은 없습니다. PS. 단위 테스트뿐만 아니라 기능 테스트를 위해 JUnit을 사용하기 때문에 때로는 일부 상태에서 DB를 남겨 둡니다. – nimcap

+5

@lutz OP의 질문에 대답하지 않고 다른 질문으로 반박했기 때문에 – akuhn

3

일반적으로해야 할 일은 테스트 러너를 작성하고 테스트 러너 클래스에 메소드를 집계하고 임의로 각 테스트를 실행하는 것입니다 (테스트를 두 번 실행하지 마십시오).

여기에 자신의 테스트 러너를 작성하는 테스트 프레임 워크와 방법에 대한 자세한 내용을 읽어 http://www.ddj.com/architect/184415674

+0

ddj.com 기사는 JUnit3 테스트 러너에 대해 설명합니다. 이 방법을 사용하면 테스트에서 TestSetup을 사용하거나 스위트 수준의 설정을 시도하고 TestSuite를 확장하여 테스트를 중단하면 여기에 제시된 방법이 작동하지 않는다는 점에 유의하십시오. 테스트 주자는 TestSuites 또는 TestDecorators를 "보지"않습니다. 이클립스와 같은 IDE에서 테스트를 실행하면 자신 만의 JUnit3 테스트 러너를 작성할 수 없습니다. – NamshubWriter

4

https://github.com/KentBeck/junit/pull/386는 일부 주문하지만 RANDOM을 소개합니다. 아마 당신은 이것을 정말로 원하지 않을 것입니다; 테스트는 결정 론적으로 실행되어야합니다. 다른 순열 테스트가 여전히 통과하는지 확인해야하는 경우 모든 순열을 테스트하거나, 또는 이것이 비현실적으로 느리다면 환경 변수 등으로 결정된 "무작위"시드를 도입하여 실패를 재현 할 수 있습니다. http://hg.netbeans.org/main/file/66d9fb12e98f/nbjunit/src/org/netbeans/junit/MethodOrder.java은 JUnit 3에서 이것을 수행하는 예제를 제공합니다.

관련 문제