JUnit 4의 조건부 테스트 무시 생각합니다 (실행되지 않았기 때문에)

OK, 그래서 @Ignore주석은 테스트 케이스를 실행되어서는 안된다는 표시에 좋습니다.

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

따라서 테스트 결과가 올바른 결과처럼 보이기 때문에 런타임에 테스트를 무시하고 싶습니다 (테스트 프레임 워크가 빌드를 통과하지만 테스트가 실행되지 않았 음을 기록하기 때문에). 주석이 이러한 유연성을 제공하지 않을 것이라고 확신하며 문제의 클래스에 대한 테스트 스위트를 수동으로 만들어야한다고 생각합니다. 그러나 설명서에는 이것에 대한 언급이 없으며 API 를 통해 어떻게 프로그래밍 방식으로 수행되는지 명확하지 않습니다 (즉 Test, @Ignore주석으로 생성 된 것과 동등한 인스턴스 또는 유사한 인스턴스를 어떻게 프로그래밍 방식으로 작성 합니까?).

과거에 누군가가 비슷한 일을했거나 다른 일을 어떻게 할 수 있는지에 대한 밝은 생각을 가지고 있다면 그것에 대해 기뻐할 것입니다.



답변

JUnit 방법은 런타임에 이것을하는 것입니다 org.junit.Assume.

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

@Before메소드 또는 테스트 자체에서 수행 할 수 있지만 메소드 에서는 수행 할 수 없습니다 @After. 테스트 자체에서 수행하면 @Before메소드가 실행됩니다. 당신은 또한 @BeforeClass클래스 초기화를 방지하기 위해 그것을 할 수 있습니다 .

가정 실패로 인해 테스트가 무시됩니다.

편집 : junit-ext@RunIf주석 과 비교하기 위해 샘플 코드는 다음과 같습니다.

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

Database.connect()이 방법으로 연결을 캡처하고 사용하는 것이 훨씬 쉽다는 것은 말할 것도 없습니다 .


답변

Junit-ext프로젝트 를 체크 아웃해야합니다 . 그들은이 RunIf주석을 그 수행 조건 테스트, 같은 :

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

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

[자습서에서 가져온 코드 샘플]


답변

JUnit 4에서 다른 옵션은 테스트가 사용자 정의 기준을 충족해야 함을 표시하기 위해 주석을 작성한 다음 기본 러너를 사용자 자신의 기준으로 확장하고 리플렉션을 사용하여 사용자 정의 기준에 따라 결정을 내릴 수 있습니다. 다음과 같이 보일 수 있습니다.

public class CustomRunner extends BlockJUnit4ClassRunner {
    public CTRunner(Class<?> klass) throws initializationError {
        super(klass);
    }

    @Override
    protected boolean isIgnored(FrameworkMethod child) {
        if(shouldIgnore()) {
            return true;
        }
        return super.isIgnored(child);
    }

    private boolean shouldIgnore(class) {
        /* some custom criteria */
    }
}


답변

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


답변