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


195

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


나는 이미이 링크를
겪었다

나는 이 기사@Rule 가 다소 잘 설명되어 있음을 발견 했다. 특히 마지막 사건 "세부 정보의 순서"를 확인하라
Peter Perháč

주사 개념과 비슷하다고 생각합니다. 맞습니까?
Chao

해당 링크를 공유해 주셔서 감사합니다. 한 가지는 명확하지 않습니다. DEFAULT Statement.evaluate ()는 언제 호출됩니까? 모든 규칙의 evaluation () 전에 또는 모든 규칙 후에 호출됩니까? 나는 그들 모두를 추측하고 있습니다.
MasterJoe2

@ testerjoe2 기본 문장을 완전히 무시하도록 선택할 수 있습니다. 당신은 그것에 위임하기로 선택할 수도 있고 단순히 그것을 당신 자신의 다른 진술로 대체 할 수도 있습니다. 그것은하지 않습니다 호출되는 , 당신은 그 전화를 걸거나하지 않을 수 있습니다. "스크린 샷 문의 평가 () 메소드는 기본 문의 평가 () 메소드를 호출합니다."
피터 Perháč

답변:


156

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

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

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

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


1
수정 : "예를 들어 ExternalResource는 테스트 클래스 전후에 코드를 실행합니다 ." apply ()를 사용하여 ExternalResource가 테스트간에 실행되도록하는 방법이 있습니다.
derekm

62

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 인터페이스를 제공합니다.

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


4
그래서 객체를 삭제 / 지우는 코드를 작성하지 않고 삭제됩니다.
Dror

github.com/junit-team/junit4/blob/master/src/main/java/org/… 의 소스를 살펴보면 폴더는 before () 콜백 메소드에서 작성되고 after () 콜백 메소드에서 삭제됩니다. ..
Pierluigi Vernetto '

1
TemporaryFolder가 왜 삭제되는지 이해하지 못하는 사람들에게는 Junit에서 제공하는 TemporaryFolder가 자동으로 삭제되는 임시 폴더 역할을하기 때문입니다. 즉, 분해 단계는 TemporaryFolder 클래스 자체의 일부입니다.
Mindaugas Bernatavičius 2018 년

18

작동 방식에 대한 설명 :

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

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


2
명령문에 메소드 평가가 실행되지 않았습니다.
Hemanth

0

규칙은 일반적인 방식으로 각 테스트 방법의 동작을 향상시키는 데 사용됩니다. 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이 제공 한 내장 규칙의 예를 볼 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.