2010-12-22 6 views
40

Eclipse 용 Emma 플러그인 인 EclEmma를 실행 중이며 Enum에 적용되는 유일한 값을 표시하더라도 범위 보고서에 정의 된 Enum 부분 범위 만 표시됩니다. 열거 형을 뒷받침하는 묵시적 방법에 대한 적용 범위가 있다고 가정하고 있지만 확실하지는 않습니다. 예를 들어Enum 유형 Enum 유형에

이 열거로, EclEmma 패키지 선언을 제외하고, 녹색으로 모든 것을 강조한다

package com.blah; 

public enum UserRole { 
HAS_ACCESS 
} 

나는 클래스의 범위 세부 사항을 끌어 경우, 나는이 참조 :

alt text

제 질문은, EclEmma를 사용하여 Enum 클래스에서 100 % 적용 범위를 얻는 가장 좋은 방법은 무엇입니까?

+0

엠마는 당신이 놓친 것에 대한 세부 사항을 제공하지 않습니까? 이상하게 보입니다. –

+0

이전에 저의 2 센트였습니다. 개발자들이이 함정에 빠지는 것을 보았습니다. 당신이 100 % 코드 커버리지에 도달 할 때 (원하는 것보다) 열정적 인 느낌. 이것은 시간 낭비 일뿐입니다. 커버리지 도구 보고서는 코드 개선 기회를 확인하거나 기술 부서를 줄이기 위해 사용해야하며 반드시 수정해야하는 것으로 보여서는 안됩니다. –

+0

나는 동의한다, 그러나 적용을 얻는 간단한 방법이있는 경우에, 나는 그것을 무시하지 않을 것이다. 실제 문제를 해결하기 위해 필터링하지 않아도되는 것은 보험 보상 보고서의 소음입니다. 컴파일러 경고가없는 것 같아. 나는 그 (것)들을 전부 고치는 * * * 가지고 있지 않는다, 그러나 나가 중요한 것 새로운 것을다는 것을보기 위하여보다 적게 중요한 그들을 거르고 싶지 않다. BTW, 귀하의 대답은 대답이 아니므로 코멘트로 더 잘 배치되었을 것입니다. –

답변

51

열거 형 때문에 일부 숨겨진 바이트 코드가 생성됩니다.

이 문제를 해결하려면 Carl Manaster와 Peter Lawrey가 이미 언급했듯이 열거 형의 values ​​() 및 valueOf() 메서드에 대한 호출을 추가하십시오.

+11

필자가해야 할 일은 valueOf를 한 번 호출하여 100 % 적용 범위를 얻는 것입니다. 나는 그 이상을해야한다고 생각했다. –

+0

나는'enum'과'classes' 같은 문제에 직면했습니다. 나는 'enum'의 경우를 해결할 수 있었다. 하지만 내 코드 커버리지는'package' 이름에서 다루지 않습니다. 어떤 제안이라도 도움이 될 것입니다. – Amolb

+0

@Amolb 가장 좋은 방법은 관련된 모든 세부 사항을 가진 새로운 질문을하는 것입니다. 이것은 명시 적으로'enum'에 관한 것이지'package'에 관한 것이 아닙니다. – deterb

2

컴파일러에서 values ​​()와 같은 열거 형의 메서드를 생성 할 때 일반적으로 테스트 코드에서 호출되지 않는 것과 비슷한 문제가 발생했습니다. 우리는 최종 보고서에서 열거 형 객체의 수를 필터링하여이 문제를 해결했습니다.

이것이 코드 커버리지를 완전성의 척도로 사용하는 것을 좋아하지 않는 이유입니다. 더 나은 측정 항목을 생각하면 알려 드리겠습니다. :)

+3

이것 좀 해보기 : 테스트 리포트의 노이즈를 없애기 위해 모든 열거 형을 취하고 고유의 메소드를 실행하는 일반적인 테스트 메소드를 작성할 수 있습니다. 조금 위험합니다. 모든 것을 다 해보면 100 % 테스트 커버리지와 테스트 가치는 없지만 고객의 요구 사항을 충족시킬 수있을 것입니다. –

+2

exerciseEnum (MyEnum.class)로 호출 할 수있는 values ​​() 및 valueOf()를 호출하는 일반적인 enum exerciser를 추가 할 수 있습니다. –

+1

피드백에 감사드립니다. 커버리지 차이에 대한 이유는 맞습니다.하지만 커버 리지 보고서에서 Enum을 무시하는 것이 올바른 방법이라고 생각하지 않습니다. –

9

나는 100 % 코드 범위가 잘못 될 수 있다는 다른 포스터에 동의합니다. 하지만 새롭게 작성된 핵심 코드에 100 % 적용되는 만족감을 인정해야합니다.

다행히도 모든 enum이 같은 '클래스'를 확장하므로 친구 반성에서 약간의 도움을 얻어 100 % 달성 할 수 있습니다.

[EnumTypeName] .class를 매개 변수로 사용하여 테스터가 호출 할 수있는 클래스에 다음 정적 메서드를 추가하기 만하면됩니다.

Shared.superficialEnumCodeCoverage(UserRole.class); 

핵심 단어는 '외면'는이 정적 기능을 가정

public static void superficialEnumCodeCoverage(Class<? extends Enum<?>> enumClass) { 
    try { 
     for (Object o : (Object[])enumClass.getMethod("values").invoke(null)) { 
     enumClass.getMethod("valueOf", String.class).invoke(null, o.toString()); 
     } 
    } 
    catch (Throwable e) { 
     throw new RuntimeException(e); 
    } 
    } 

는 "공유"라는 클래스에서 구현 된 경우 각 열거 동안이 줄을 포함해야합니다.

+5

반사는 최악의 친구입니다. 역습. –

+2

이것은 toString 메소드가 enum 클래스에서 대체되지 않는 경우에만 작동합니다. 이 경우'.name'을 대신 호출해야합니다 (열거 형 ('Enum ') 유형의 "o"가 필요합니다). –

+0

열거 형에 필드가없는 경우 , 적용 범위는 아직 불완전하다. – datahaki