2008-09-30 2 views
14

현재 JUnit 4를 사용하고 있으며 테스트를 여러 조합으로 선택적으로 실행할 수있는 그룹으로 나눌 필요가 있습니다. TestNG에는 테스트에 주석을 달아 그룹에 할당하는 기능이 있지만 지금은 TestNG로 마이그레이션 할 수 없다는 것을 알고 있습니다. 몇 가지 커스텀 어노테이션과 커스텀 JUnit TestRunner를 사용하여 JUnit에서 쉽게 수행 할 수있는 것 같습니다. 나는 JUnit 문서를 모두 검사하고 웹을 검색했지만 그런 것을 찾을 수 없었다. 누구나 그런 TestRunner를 알고 있습니까?테스트 그룹을 실행하기위한 JUnit TestRunner가 있습니까?

업데이트 : 테스트 스위트에 대한 답장을 보내 주셔서 감사합니다. 나는 원래 질문에서 이것들을 다루었어야했다. 여기에 우리가 간다. 나는 테스트 스위트를 수동으로 생성하고 관리해야하기 때문에 테스트 스위트를 사용하고 싶지 않다. 모든 테스트에 손을 대고 수동으로 스위트를 배열하는 것이다 (너무 많은 작업과 유지 보수의 악몽). 필자가해야 할 일은 진정한 통합 테스트 인 몇 가지 테스트를 제외한 모든 단위 테스트를 실행하는 것입니다. 그래서 저는 이것들에 주석을 달고 다른 모든 것을 실행하고 싶습니다. 다른 때에는 통합 테스트를 실행하고 싶습니다. 또한 스위트 룸에서는 불가능한 여러 그룹에 단위 테스트를 할 필요가 있습니다. 희망이 물건을 정리하는 데 도움이됩니다.

업데이트 2 : JUnit에이 OOB가 없으면 JUnit (주석 + 사용자 정의 JUnit 테스트 러너)에 추가하는 오픈 소스 라이브러리를 찾고 있습니다.

+0

관련 항목 : http://stackoverflow.com/questions/457276/junit4-test-suites/4952225#4952225 – cmcginty

답변

6

봄의 SpringJUnit4ClassRunner을 확인하십시오. 나는 이것을 사용하여 시스템 속성을 기반으로 테스트를 선택적으로 실행했다. IfProfileValue 주석을 사용했다.

이 : 시스템 속성 '테스트 그룹은'단위 테스트 '또는'통합 - 테스트 '로 설정되어있는 경우

@IfProfileValue(name="test-groups", values={"unit-tests", "integration-tests"}) 
    public void testWhichRunsForUnitOrIntegrationTestGroups() { 
     // ... 
} 

가 실행됩니다.

업데이트 : JUnitExt@Category@Prerequisite 개의 주석을 가지고 있으며 필요한 것을 수행해야합니다. 그러나, 나는 그것을 사용하지 않았으므로 그것을 보증 할 수는 없다.

+0

감사합니다. 둘 다 유망 해 보입니다. 나는 그들을 체크 아웃 할 것이다. – thvo

+0

SpringJUnit4ClassRunner는 효과가 있었지만 이전 버전의 Spring을 사용하고 있습니다. 우리가 업데이트 할 때까지 (거대한 프로젝트에서는 쉽지 않다), 나는이 방법을 사용할 수 없다. – thvo

+0

참고 : Spring'@ IfProfileValue' 만 ** 이름과 값이 일치하지 않고 ** 실행하지 않는 ** 테스트를 건너 뛰거나 무시합니다 **. 이것을 사용하여 JUnit Categories 유형을 구현하고자한다면'SpringJUnit4ClassRunner # runChild'를 _ignoring_ 대신 _not-run_으로 확장해야 할 수도 있습니다. 그 결과가 jenkins에있는 경우 주로 문제가됩니다. – raksja

0

스위트를 만들 수 있습니다. 단, 모든 구성을 스위트에 넣고 주석에 넣지는 않습니다.

0

JUnit 3을 사용하면 다른 테스트와 마찬가지로 실행할 수있는 테스트 스위트를 만들 수 있습니다. JUnit 4는 비슷한 개념을 가지고 있지 않습니까?

0

ANT 또는 maven을 사용하는 경우 이름으로 테스트를 필터링하여 실행할 테스트를 제어 할 수 있습니다. 약간 어색하지만, 그것은 당신을 위해 일할 수도 있습니다.

1

아니요, 안타깝게도 TestNG 그룹과 비슷한 개념이 없습니다. JUnit4를 위해 계획되었지만, 확실하지 않은 이유로 계획에서 제외되었습니다.

11

JUnit에는 현재이 러너가 없습니다. 근본적인 문제를 해결하기 위해 제한된 시간 내에 테스트 슈트에서 합리적인 확신을 얻을 필요가 있으며, 다음 릴리스에서 가장 우선적 인 개발 우선 순위입니다. 그 동안 애널리틱스를 통해 작동하는 필터를 구현하는 것은 큰 편은 아니라고 생각합니다.하지만 편향됩니다.

+0

감사합니다. 켄트, 당신은 근본적인 문제를 지적하는 머리에 못을 박았습니다. 이 점이 다음 JUnit 릴리스에서 해결 될 것이라는 점을 잘 알고 있습니다. JUnit을 공동 작성 했으므로 필자가 작성한 램프 업 시간이 너보다 조금 더 길 수도 있습니다. :) 제가 살펴 봅니다. – thvo

+0

다음은 Filter 클래스 JavaDoc에 대한 링크입니다. http://junit.sourceforge.net/javadoc/org/junit/runner/manipulation/Filter.html – thvo

3

먼저 단위 테스트 (종종 테스트중인 유닛과 동일한 패키지에 있음)와 통합 테스트의 두 가지 문제를 해결합니다. 필자는 보통 통합 테스트를 com.example.project.tests와 같은 별도의 패키지에 보관합니다. 이클립스에서 내 프로젝트는 다음과 같다 : 패키지에

project/ 
    src/ 
    com.example.project/ 
    tsrc/ 
    com.example.project/ 
    com.example.project.tests/ 

을 마우스 오른쪽 버튼으로 클릭하고 '실행'을 선택하면 패키지의 테스트를 실행합니다; 원본 폴더에서 동일한 작업을 수행하면 모든 테스트가 실행됩니다.

Suite runner을 사용하여 관심을 나타내지는 않지만 비슷한 효과를 얻을 수 있습니다. 그러나 이는 DRY에 위배됩니다. 스위트 클래스에서 테스트 이름의 복사본을 최신 상태로 유지해야합니다. 그러나 여러 테스트에 동일한 테스트를 쉽게 적용 할 수 있습니다.

@RunWith(Suite.class) 
@Suite.SuiteClasses({ 
    TestAlpha.class, 
    TestBeta.class }) 
public class GreekLetterUnitTests { 
} 

물론 나는 이러한 것들을 자동화 된 상태로 유지해야합니다. 이를 수행하는 좋은 방법은 the Ant task을 사용하는 것입니다.

<target name="tests.unit"> 
    <junit> 
    <batchtest> 
     <fileset dir="tsrc"> 
     <include name="**/Test*.java"/> 
     <exclude name="**/tests/*.java"/> 
     </fileset> 
    </batchtest> 
    </junit> 
</target> 
<target name="tests.integration"> 
    <junit> 
    <batchtest> 
     <fileset dir="tsrc"> 
     <include name="**/tests/Test*.java"/> 
     </fileset> 
    </batchtest> 
    </junit> 
</target> 
0

TestNG에 내 투표가 있습니다. 그것은 Annotation 기반으로, Group, Single Tests 등으로 실행될 수 있으며, Maven으로 링크 될 수 있으며, 테스트 실행의 일부로 모든 JUnit 테스트를 실행할 수 있습니다.

JUnit을 사용하는 것이 좋습니다.

0

제 조언은 단순히 JUnit을 사용하고 TestNG를 사용하는 것입니다. TestNG에 익숙해지면 Junit은 석기 시대처럼 보입니다.