2012-09-14 4 views
0

흥미로운 요구 사항이 있습니다. 나는 어플리케이션에서 가능한 한 더 나은 테스트 케이스 커버리지를 원한다. 필자는 Parameterized Junit을 사용하여 여러 입력의 테스트 케이스를 실행하고 있습니다. 내 샘플 테스트 클래스는 다음과 같습니다.더 나은 JUnit 작성 매개 변수화 된 테스트 케이스

@Parameters 
public static Collection<Object[]> testInputs() 
{ 
    return Arrays.asList({ 
     {1, CoreMatchers.is(1)}, 
     {2, CoreMatchers.is(2)} 
    }); 
} 
@Test 
public test() 
{ 
    myApp.run(); 
    assertThat(myApp.getA(), matcher); 
} 

이렇게하면 테스트 매개 변수로 논리 논리를 정의했습니다. 이제 테스트 케이스에서 여러 matcher를 실행하려고합니다. 그 중 일부는 내가 작성한 맞춤 matchers가 될 수 있습니다.

@Parameters 
public static Collection<Object[]> testInputs() 
{ 
    return Arrays.asList({ 
     {1, Arrays.asList(CoreMatchers.is(1), CustomMatchers.status(1)) }, 
     {2, Arrays.asList(CoreMatchers.is(2), CustomMatchers.status(2)) } 
    }); 
} 

그리고 주장

는 같다 :

for(Matcher<MyApp> matcher: matchers) 
{ 
    assertThat(myApp, matcher); 
} 

그러나 문제는, 모두 매처 (matcher)는 다른 개체에서 실행됩니다. 내 CustomMatcher를 정의 할 수있는 가장 좋은 방법은 무엇입니까 ??

정규 표현식의 유형별로 어설 션을 분류해야합니까?

어떤 도움을 주셔서 감사합니다. 미리 감사드립니다.

답변

1

두 matcher 모두 다른 오브젝트에서 실행된다는 것이 확실하지 않지만 CoreMatchers.allOf을 사용하여 하나의 테스트 실행을 위해 matcher를 결합 할 수 있습니다. 이 방법을 사용하면 matchers 목록을 반복 할 필요가 없으며 하나를 포함하여 모든 matchers를 전달할 수 있습니다.

@Parameters 
public static Collection<Object[]> testInputs() 
{ 
    return Arrays.asList({ 
     {1, CoreMatchers.allOf(CoreMatchers.is(1), CustomMatchers.status(1)) }, 
     {2, CoreMatchers.allOf(CoreMatchers.is(2), CustomMatchers.status(2)) } 
    }); 
} 
1

당신이 무엇을 요구하고 있는지 잘 모르겠지만 JUnit 객체보다는 매개 변수로 순수한 java.lang 객체를 사용하는 것이 더 좋을 것이라고 생각합니다. 따라서

return Arrays.asList({ 
    {1, 1}, 
    {2, 2} 
}); 

실제 시험에서는 is 정규 표현식을 사용하십시오.

matchers가 실제로 다른 작업을 수행하는 경우 매개 변수가있는 테스트를 사용하지 말고 별도의 테스트 방법을 사용하십시오. 중복을 줄이려면 일반적인 리팩토링 도구를 사용하여 테스트 방법간에 일반적인 방법을 추출하십시오.