[java] Junit @Rule은 어떻게 작동합니까?

대량의 코드에 대한 테스트 사례를 작성하고 싶습니다. JUnit @Rule주석 기능에 대한 세부 정보를 알고 싶습니다 . 테스트 사례를 작성하는 데 사용할 수 있습니다. 간단한 예를 통해 기능에 대한 자세한 설명을 제공하는 유용한 답변이나 링크를 제공하십시오.



답변

규칙은 테스트 클래스 내의 모든 테스트에 적용되지만보다 일반적인 방식으로 추가 기능을 추가하는 데 사용됩니다.

예를 들어 ExternalResource@Beforeand 를 사용하지 않고도 테스트 메소드 전후에 코드를 실행합니다 @After. 사용하여 ExternalResource보다는 @Before@After 더 나은 코드 재사용을위한 기회를 제공합니다; 동일한 규칙을 서로 다른 두 테스트 클래스에서 사용할 수 있습니다.

설계는 다음을 기반으로합니다. JUnit의 인터셉터

자세한 정보는 JUnit 위키 : 규칙을 참조하십시오 .


답변

Junit Rules는 AOP (aspect oriented programming)의 원칙에 따라 작동합니다. 테스트 방법을 가로 채어 특정 테스트 방법을 실행하기 전이나 후에 어떤 일을 할 수있는 기회를 제공합니다.

아래 코드의 예를 보자.

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

위의 테스트 방법을 실행할 때마다 임시 폴더가 생성되고 메서드 실행 후 삭제됩니다. Junit에서 제공하는 기본 규칙의 예입니다.

자체 규칙을 만들어 비슷한 동작을 수행 할 수도 있습니다. Junit은 자체 규칙 규칙을 작성하기 위해 구현할 수있는 TestRule 인터페이스를 제공합니다.

다음은 참조를위한 유용한 링크입니다.


답변

작동 방식에 대한 설명 :

JUnit은 테스트 메소드를 Statement 오브젝트로 랩하여 명령문을 Execute()실행 하고 테스트를 실행합니다. 그런 다음 statement.Execute()JUnit은 직접 테스트를 실행 하는 대신 @Rule주석 을 사용하여 Statement를 TestRule에 전달합니다 . TestRule의 “적용”함수는 테스트와 함께 Statement가 주어지면 새로운 Statement를 반환합니다. 새 Statement의 Execute()메소드는 테스트 Statement의 execute 메소드를 호출하거나 여러 번 호출하거나 원하는대로 수행 할 수 있습니다 before and after.

이제 JUnit에는 테스트를 실행하는 것 이상을 수행하는 새로운 Statement가 있으며, 마지막으로 Execute를 호출하기 전에 더 이상 규칙에 전달할 수 있습니다.


답변

규칙은 일반적인 방식으로 각 테스트 방법의 동작을 향상시키는 데 사용됩니다. Junit 규칙은 테스트 메소드를 가로 채서 테스트 메소드가 실행을 시작하기 전과 테스트 메소드가 실행 된 후 무언가를 수행 할 수 있도록합니다.

예를 들어 @Timeout 규칙을 사용하면 모든 테스트에 대한 시간 초과를 설정할 수 있습니다.

public class TestApp {
    @Rule
    public Timeout globalTimeout = new Timeout(20, TimeUnit.MILLISECONDS);

    ......
    ......

 }

@TemporaryFolder 규칙은 임시 폴더, 파일을 만드는 데 사용됩니다. 테스트 메소드가 실행될 때마다 임시 폴더가 작성되고 메소드 실행 후 삭제됩니다.

public class TempFolderTest {

 @Rule
 public TemporaryFolder tempFolder= new TemporaryFolder();

 @Test
 public void testTempFolder() throws IOException {
  File folder = tempFolder.newFolder("demos");
  File file = tempFolder.newFile("Hello.txt");

  assertEquals(folder.getName(), "demos");
  assertEquals(file.getName(), "Hello.txt");

 }


}

링크 에서 junit이 제공 한 내장 규칙의 예를 볼 수 있습니다 .


답변