programing

JUnit 4에서의 테스트 조건 무시

goodcopy 2022. 7. 3. 23:07
반응형

JUnit 4에서의 테스트 조건 무시

자, 그럼 이제@Ignore주석은 테스트 케이스를 실행해서는 안 된다는 표시를 하는 데 유용합니다.

그러나 런타임 정보에 기반한 테스트를 무시하고 싶을 때가 있습니다.예를 들어 특정 수의 코어가 있는 시스템에서 실행해야 하는 동시성 테스트가 있는 경우 등이 있습니다.이 테스트가 단프로세서 머신에서 실행된다면 테스트에 합격하는 것(실행하지 않았기 때문에)은 옳지 않다고 생각합니다.또, 테스트에 실패해 빌드를 망가뜨리는 것은 결코 옳지 않다고 생각합니다.

따라서 실행 시 테스트를 무시할 수 있습니다. 이는 올바른 결과인 것 같기 때문입니다(테스트 프레임워크는 빌드에 합격하지만 테스트가 실행되지 않았음을 기록하기 때문입니다).주석으로는 이러한 유연성을 얻을 수 없다고 확신하며, 해당 클래스의 테스트 스위트를 수동으로 작성해야 할 것 같습니다.단, 이 문서에서는 이에 대해 언급하지 않고 API를 통해 살펴본 결과 프로그래밍 방식으로 실행되는 방법도 명확하지 않습니다(즉, 어떻게 프로그래밍 방식으로 인스턴스를 작성해야 하는지).Test또는 에 의해 작성된 것과 동등한 것@Ignore주석?)

과거에 이와 비슷한 일을 한 적이 있거나, 제가 이 일에 대해 다른 방법을 알고 있는 사람이 있다면, 저는 기꺼이 그것에 대해 듣고 싶습니다.

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

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

단시간에 할 수 있습니다.@Before방법 또는 테스트 자체에서, 그러나 방법 또는 테스트 자체에서@After방법.테스트 자체에서 하면@Before메서드가 실행됩니다.다음 범위 내에서 할 수도 있습니다.@BeforeClass클래스 초기화를 방지합니다.

가정이 실패하면 테스트가 무시됩니다.

편집: 와 비교합니다.@RunIfjunit-ext로부터의 주석, 샘플 코드는 다음과 같습니다.

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

접속을 캡처하여 사용하는 것이 훨씬 용이하다는 것은 말할 것도 없습니다.Database.connect()이 방법을 사용합니다.

프로젝트를 체크해야 합니다.그들은 가지고 있다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 */
    }
}

@tkruse와 @Yishai의 답변에 더하여:
은 특히 때 합니다.Parameterized테스트(일부 테스트 데이터 레코드에 대해서만 테스트 방법을 실행해야 하는지 여부).

public class MyTest {
    // get current test method
    @Rule public TestName testName = new TestName();
    
    @Before
    public void setUp() {
        org.junit.Assume.assumeTrue(new Function<String, Boolean>() {
          @Override
          public Boolean apply(String testMethod) {
            if (testMethod.startsWith("testMyMethod")) {
              return <some condition>;
            }
            return true;
          }
        }.apply(testName.getMethodName()));
        
        ... continue setup ...
    }
}

: ★★★★★★★★★★★★★★★★★★★★★」Assume.assumeTrue(condition)나머지 스텝은 무시하지만 테스트에 합격합니다.하려면 , 「」를 합니다.org.junit.Assert.fail()조건문 안에 있습니다.'와 같이 동작합니다.Assume.assumeTrue()테스트에 불합격.

언급URL : https://stackoverflow.com/questions/1689242/conditionally-ignoring-tests-in-junit-4

반응형