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.