2009-07-03 4 views
13

저는 현재 소형 라이브러리를위한 단위 테스트를 다소 완성시키기 위해 노력하고 있습니다. 서로 다른 구현을 허용하기를 원하기 때문에이 테스트 세트를 (a) 일반화하여 다른 구현을 테스트하기 위해 재사용 할 수 있고 (b) 가능한 한 완벽 해지기를 원합니다. (b) 부분에 대해서는 enum 유형을 테스트하기위한 최선의 방법이 있는지 알고 싶습니다.enum 유형을 테스트하는 방법은 무엇입니까?

public enum Month { 
    January, 
    February, 
    ... 
    December; 
} 

을 여기에 모두 열거 유형이 실제로 존재하는지 확인하려면 다음과 같이 그래서 예를 들어 내가 열거 있습니다. 그게 필요한가요? 현재 내가 다음 예에서와 같이 Hamcrests에게 assertThat을 사용하고 있습니다 :

assertThat(Month.January, is(notNullValue())); 

누락 "1월"열거 한 창조 누락 된 열거 형에 의해 해결할 수 컴파일 타임 오류가 발생합니다. 내가 여기에 자바를 사용하고 있지만, 당신의 대답은 다른 언어의 경우 난 상관 없어

..

편집 : mkato 마크 히스로

지적 모두 한 테스트 열거 할 수있다 열거 형을 사용하고있을 때 컴파일러가 컴파일되지 않기 때문에 필요하지 않습니다. 하지만 다른 테스트에서 동일한 테스트를 실행하는 별도의 TCK와 같은 test.jar을 빌드하고자하므로이 열거 형을 테스트하고 싶습니다. 그래서 내 질문은 더 많은 의미가 있었다 : 열거 형을 테스트하는 가장 좋은 방법은 무엇입니까?

은 그것에 대해 생각하면 조금 더 나는 위의 Hamcrest 문을 변경 : 1 월이 없을 때

assertThat(Month.valueOf("January"), is(notNullValue())); 

이 문은 지금 NPE가 발생합니다 (아직). 이 접근법에 문제가 있습니까?

답변

17

enum의 경우 실제로 메소드가있는 경우에만 테스트합니다. 귀하의 예와 같이 순수한 가치있는 enum이라면 귀찮게하지 말 것입니다.

하지만 테스트에 열중하고 있기 때문에 두 번째 옵션을 사용하는 것이 첫 번째 옵션보다 훨씬 좋습니다. 첫 번째 문제는 IDE를 사용하는 경우 enum의 모든 이름을 바꾸면 테스트 클래스의 이름이 바뀌는 것입니다.

+0

나는 테스트하고 싶은 한가지 메소드를 가지고있는 enum을 가지고있다. 나는 단위 테스트에서 신참이다. 그리고 그 메소드에 대한 테스트 케이스를 작성하는 방법을 알 수 없다. 예제를 제공하거나 도움을 줄 수 있습니까? . – dirtydexter

+0

"assertThat (Month.January, is (notNullValue()));" OP의 질문에 당신을위한 예제가 충분하지 않아, 나는 당신이 별도의 질문으로 질문하고 당신이 테스트하려고하는 것에 대한 예를 제공하는 것이 낫다고 생각합니다. JUnit 자체에 도움이 필요할 것 같아서 나에게 들립니다. – aberrant80

+0

그래, 고마워. – dirtydexter

3

코드에서 모든 달을 사용하면 IDE에서 컴파일을 허용하지 않으므로 단위 테스트가 필요하지 않습니다.

리플렉션에서 사용하는 경우 한 달을 삭제해도 컴파일되어 단위 테스트를 실시 할 수 있습니다.

+0

단위 테스트는 귀하의 월이 어떻게 사용될 것이며 앞으로 어떻게 사용되는지에 대한 지식도 없습니다. 즉, 달이 모두없는 경우 응용 프로그램이 현재 컴파일되지 않아도 단위 테스트를 포함해야합니다. 주의 사항 : 간단한 객체 (예 : 메소드가없는 enum)에 대해 걱정하기 전에 복잡한 객체가 단위 테스트로 올바르게 덮여 있는지 확인하십시오. –

4

일반적으로 나는 과잉이라고 말하고 싶지만 enum을위한 단위 테스트를 작성하는 이유가 있습니다.

가끔 열거 형 멤버에 할당 된 값을 절대로 변경해서는 안되며 레거시 지속 형 데이터로드가 실패하는 경우도 있습니다. 마찬가지로 사용되지 않은 멤버는 삭제하면 안됩니다. 단위 테스트는 개발자가 변경 내용을 이해하지 못하도록 변경하지 못하도록 보호하는 데 사용할 수 있습니다.

8

나는 aberrant80에 동의합니다.

enum의 경우 실제로 메소드가있는 경우에만 테스트합니다. 예와 같이 순수한 값 전용 열거 형이라면 을 귀찮게하지 마십시오.

하지만 테스트에 열중하므로 두 번째 옵션은 첫 번째 옵션보다 훨씬 좋은 입니다. 첫 번째 문제는 IDE를 사용하는 경우 enum의 이름을 바꾸면 의 이름이 테스트 클래스로 변경됩니다.

이 단위 테스트를 추가하면 확장됩니다. Enum은 매우 유용 할 수 있습니다. 대규모 코드 기반에서 작업하는 경우 빌드 시간이 늘어나 기 시작하며 단위 테스트는 기능을 확인하는 더 빠른 방법 일 수 있습니다 (테스트는 종속성 만 빌드합니다). 또 다른 큰 장점은 다른 개발자가 실수로 코드의 기능을 변경할 수 없다는 것입니다 (대규모 팀의 경우 큰 문제 임).

모든 테스트 기반 개발을 통해 Enums 메서드를 사용한 테스트는 코드 기반의 버그 수를 줄입니다.

간단한 예제

public enum Multiplier { 
    DOUBLE(2.0), 
    TRIPLE(3.0); 

    private final double multiplier; 

    Multiplier(double multiplier) { 
     this.multiplier = multiplier; 
    } 

    Double applyMultiplier(Double value) { 
     return multiplier * value; 
    } 

} 

public class MultiplierTest { 

    @Test 
    public void should() { 
     assertThat(Multiplier.DOUBLE.applyMultiplier(1.0), is(2.0)); 
     assertThat(Multiplier.TRIPLE.applyMultiplier(1.0), is(3.0)); 
    } 
} 
+0

나는 테스트하고 싶은 한가지 메소드를 가진 enum을 가지고있다. 나는 단위 테스트에서 신참이다. 그리고 그 메소드에 대한 테스트 케이스를 작성하는 방법을 알아낼 수 없다. 예제를 제공하거나 도움을 줄 수 있습니까? . – dirtydexter

+0

@dirtydexter 예제와 함께 업데이트 된 답변을 참조하십시오. –

2

예에 의해, 정확히 어떤 값을 가질 경우 테스트 할 수 있습니다

for(MyBoolean b : MyBoolean.values()) { 
    switch(b) { 
    case TRUE: 
     break; 
    case FALSE: 
     break; 
    default: 
     throw new IllegalArgumentException(b.toString()); 
} 

for(String s : new String[]{"TRUE", "FALSE" }) { 
    MyBoolean.valueOf(s); 
} 

을 누군가가 제거하거나 값을 추가하는 경우, 시험의 일부는 실패합니다.

관련 문제