2013-10-05 2 views
24

저는 현재 첫 번째 Java 프로젝트를하고 있으며 완전히 TDD로하고 싶습니다. 테스트를 작성하기 위해 JUnit을 사용하고 있습니다. 분명히 JUnit은 data providers에 대한 지원을 제공하지 않으므로 20 가지 다른 버전의 인수를 사용하여 동일한 메소드를 테스트하는 것을 성가 시게 만듭니다. 데이터 공급자를 지원하는 Java에 대한 가장 일반적인/표준 테스트 도구는 무엇입니까? 나는 TestNG을 발견했으나 그 중 하나가 얼마나 인기가 있었는지 전혀 모르거나 대체 방법과 비교하는 방법을 모릅니다.데이터 공급자로 Java 테스트 작성하기

이 동작을 얻는 방법이 JUnit을 사용하는 좋은 방법이라면, 그것도 작동 할 수 있습니다.

+0

JUnit에는 매개 변수화 된 테스트가 있습니다. –

+0

그러나 매개 변수화 된 JUnit 테스트를위한 Eclipse 통합이 끔찍하다는 것을주의해야한다. a) 단일 매개 변수 집합을 실행할 수 없습니다. b) 테스트 중에 실제로 실패한 매개 변수 (JUnit 창에서 [0], [1], [2]와 같은 것을 볼 수 있음)를 JUnit 창에서 알기 어렵습니다. – qqilihq

+2

@qqqhhq JUnit 4.11에는 매개 변수화 된 테스트의 이름을 더 잘 지정하여 더 이상 이런 종류의 문제가 발생하지 않습니다. https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md – dkatzel

답변

23

의 JUnit 4는 가독성 대 유연성을 필요에 따라 PHP는 데이터 공급자

@RunWith(Parameterized.class) 
public class MyTest{ 
    @Parameters 
    public static Collection<Object[]> data() { 
      /*create and return a Collection 
      of Objects arrays here. 
      Each element in each array is 
      a parameter to your constructor. 
      */ 

    } 

    private int a,b,c; 


    public MyTest(int a, int b, int c) { 
      this.a= a; 
      this.b = b; 
      this.c = c; 
    } 

    @Test 
    public void test() { 
      //do your test with a,b 
    } 

    @Test 
    public void testC(){ 
     //you can have multiple tests 
     //which all will run 

     //...test c 
    } 
} 
+4

이것은 비슷하지만 비슷합니다. PHP 데이터 공급자는 메서드에 인수를 전달합니다. 예제에서 인수는 테스트 클래스의 생성자에 전달됩니다. 값 목록을 갖고 싶은 여러 테스트 메소드가 있다면 어떻게 될까요? 각각에 대한 테스트 클래스를 작성하는 것은 매우 어색합니다. –

+0

'@ Test' 주석이 붙은 여러 개의 테스트 메소드를 가질 수 있습니다. 모든 검사가 실시됩니다. 나는 약간의 대답을 보여주기 위해 약간 업데이트했다. – dkatzel

+8

동일한 목록의 동일한 인수 목록이나 요소를 사용하는 여러 테스트가있는 경우에 유용하다. 중복이 없으면 실제로 도움이되지 않습니다. 필자의 경우 유효한 입력 목록과 중복 입력이없는 잘못된 입력 목록이 있습니다. 그것들을 모으는 것은 매우 이상 할 것입니다. –

6

같은 일을하는 것입니다 테스트를 파라미터있다, 당신은 선택할 수 있습니다 Parameterized - JUnit을의이 dkatzel 설명, 옵션이 내장되어 있습니다. 조금 다른 기능을 가진

@TestWith({ 
     "clerk,  45'000 USD, GOLD", 
     "supervisor, 60'000 GBP, PLATINUM" 
    }) 
    public void canAcceptDebit(Employee employee, Money money, ClientType clientType) { 
     assertTrue( employee.canAcceptDebit(money, clientType) ); 
    } 

또는 junitParams : 다른 옵션은 당신이하자 zohhak 같은 외부 라이브러리가 제공하는 외부의 JUnit 주자이다. 가장 좋아하는 것을 골라 내십시오.

36

우리 회사 동료는 012ub을 찾을 수있는 JUnit 용 TestNG 스타일의 무료 DataProvider를 작성했습니다.

우리는 매우 큰 프로젝트에서 그것을 사용하고 그것은 우리를 위해 잘 작동합니다. JUnit의 Parameterized에 비해 몇 가지 장점이 있습니다. 개별 클래스의 오버 헤드를 줄이고 단일 테스트를 실행할 수 있기 때문입니다.

예는이

@DataProvider 
public static Object[][] provideStringAndExpectedLength() { 
    return new Object[][] { 
     { "Hello World", 11 }, 
     { "Foo", 3 } 
    }; 
} 

@Test 
@UseDataProvider("provideStringAndExpectedLength") 
public void testCalculateLength(String input, int expectedLength) { 
    assertThat(calculateLength(input)).isEqualTo(expectedLength); 
} 

편집과 같은 : V1.7 이후, 또한 데이터 (문자열, 목록)을 제공하고 별도의 방법이되도록 제공 인라인 수있는 다른 방법을 지원합니다 꼭 필요한 것은 아닙니다.

전체 예제는 github의 매뉴얼 페이지에서 찾을 수 있습니다. 또한 유틸리티 클래스에서 공급자를 수집하고 다른 클래스에서 액세스하는 등의 몇 가지 기능을 추가로 제공합니다. 설명서 페이지는 매우 자세하게 설명되어 있으므로 질문에 대한 답변을 찾을 수있을 것입니다.

+2

위의 예제를 실행하려는 사람들은 테스트 클래스에 @RunWith (DataProviderRunner.class) 주석을 추가하는 것을 잊지 마십시오! – ADi3ek

관련 문제