2009-11-06 5 views
258

OK, 따라서 @Ignore 주석은 테스트 케이스가 실행되지 않아야 함을 표시하는 데 적합합니다.JUnit 4의 조건부 테스트 무시

그러나 때때로 런타임 정보를 기반으로 테스트를 무시하고 싶습니다. 예를 들어 특정 개수의 코어가있는 시스템에서 실행해야하는 동시성 테스트가있는 경우 일 수 있습니다. 이 테스트가 단일 프로세서 머신에서 실행 되었다면 테스트를 통과 한 것이 정확하지 않을 것이라고 생각합니다. (실행되지 않았으므로) 테스트를 실패하고 빌드를 중단하는 것은 옳지 않습니다. .

그래서 런타임시 테스트를 무시할 수 있기를 바랍니다. 테스트 프레임 워크는 테스트 프레임 워크가 통과 할 수 있지만 테스트가 실행되지 않았 음을 기록하기 때문에 올바른 결과로 보입니다. 나는 주석이 나에게이 유연성을주지 않을 것이라고 확신한다. 문제의 클래스에 대한 테스트 스위트를 수동으로 생성해야한다고 생각한다. 그러나이 설명서에 대해서는 아무 것도 언급하지 않았으며 API을 통해 보면 프로그래밍 방식으로이 작업을 수행하는 방법이 명확하지 않은 것입니다 (예 : Test 또는 유사하게 @Ignore 주석으로 작성된 인스턴스와 프로그래밍 방식으로 어떻게 만들 수 있습니까?).

누구나 과거에 비슷한 일을 해왔거나 내가 어떻게 다른 일을 할 수 있는지에 대한 밝은 생각을 갖고 있다면 기쁜 마음으로 소식을 듣게 될 것입니다.

답변

347

의 JUnit 방법은 런타임에서이 작업을 수행하는 것입니다

@Test 
@RunIf(DatabaseIsConnected.class) 
public void calculateTotalSalary() { 
    //your code there 
} 

class DatabaseIsConnected implements Checker { 
    public boolean satisify() { 
     return Database.connect() != null; 
    } 
} 

[자신의 튜토리얼에서 가져온 코드 샘플] org.junit.Assume입니다 : 그들은 같은 조건부 테스트를 수행 RunIf 주석이 있습니다.

@Before 
public void beforeMethod() { 
    org.junit.Assume.assumeTrue(someCondition()); 
    // rest of setup. 
} 

당신은이 @Before 방법이나 시험 자체에서 할 수 있지만, 아닌 @After 방법으로 할 수 있습니다. 테스트 자체에서 수행하면 @Before 메서드가 실행됩니다. 클래스 초기화를 막으려면 @BeforeClass에서 수행 할 수도 있습니다.

가정 오류로 인해 테스트가 무시됩니다.

편집 :

@Test 
public void calculateTotalSalary() { 
    assumeThat(Database.connect(), is(notNull())); 
    //test code below. 
} 

가 캡처하고를 사용하는 것이 훨씬 쉽다는 것을 언급하지 않기 위하여 :JUnit을-EXT에서 @RunIf 주석을 비교하기 위해, 자신의 샘플 코드는 다음과 같을 것이다 이 방법으로 Database.connect() 메서드에서 연결하십시오.

+1

@notnoop, 그건 전혀 내 관찰이 아닙니다. 그들은 무시됩니다. IDEA 테스트 주자는 그런 식으로보고합니다. JUnit 소스 코드를 보면 테스트가 무시 된 것으로보고되었음을 알 수 있습니다. – Yishai

+1

인용구 : "미래에는 이것이 변할 수 있으며, 실패한 가정은 테스트가 무시되는 결과를 가져올 수 있습니다." 실제로 4.5라고 믿습니다. 현재의 javadoc은 "기본 JUnit 러너는 실패한 가정을 무시하고 테스트를 처리합니다. 사용자 정의 러너는 다르게 동작 할 수 있습니다." http://github.com/KentBeck/junit/blob/7aac4b19d359285041ccb51d575235339a1a8be0/src/main/java/org/junit/Assume.java – Yishai

+0

고마워, 그게 내가 원하는거야. 'Assume'의 의미는 내가 여기서하려고하는 것과 똑같이 들리므로 주자가 그것을'@ Ignore'라고 취급하지 않는다고해도 나는 적절하게 다루어 질 것이라고 믿는다. –

37

프로젝트 Junit-ext을 확인해야합니다.

+3

이 답변을 주셔서 감사합니다. 기능에 대한 흥미로운 대체 구문입니다. 다른 의존성을 도입하지 않으려면 '가정'으로 직접 갈 것입니다. –

+2

개인적으로이 솔루션을 선호합니다. 동일한 조건에 따라 실행해야하는 테스트가 많으면 모든 테스트에서 가정을 사용하는 것보다 훨씬 이상적입니다. 또한 메서드 수준이 아닌 클래스 수준에서이 메서드를 사용할 수 있다면 더 이상적입니다. – Richard

+3

junit-ext는 Maven Central에서 사용할 수 없습니다 :-( –

-1

빠른 참고 : Assume.assumeTrue(condition)은 나머지 단계를 무시하지만 테스트를 통과합니다. 테스트를 통과하지 않으려면 org.junit.Assert.fail()을 조건문 안에 사용하십시오. Assume.assumeTrue()과 동일하게 작동하지만 테스트에 실패합니다.

+2

위의 대답에서 언급했듯이 실패한 가정은 ** 테스트가 통과하지 못해 ** 별도의 상태를 반환합니다. 어떤 주자는 실수로 패스 *라고 생각할 수도 있지만 테스트 러너의 약점/버그입니다 (기본 JUnit 러너는 테스트를 무시한 것으로 표시합니다). 그리고 마지막 문장에 관해서는, 시험을 낙제하는 것이 내가 원하는 것을 구체적으로하지 않는 것입니다. –

+0

오 OK. 내 경우에는 실패한 가정을 통과 한 테스트이지만 실패한 것으로보고하기를 원합니다 (테스트 감시자로부터 예외를 확인하고있었습니다). 실패를 강요하면 나를 도왔다. –

4

JUnit 4에서는 테스트가 사용자 정의 기준을 충족해야한다는 것을 나타내는 주석을 작성한 다음 기본 러너를 사용자 고유로 확장하고 리플렉션을 사용하여 사용자 정의 기준을 기반으로 결정할 수 있습니다.