문제

저는 최근에 코드 적용 도구(특히 Emma 및 EclEmma)를 사용하기 시작했는데, 이 도구를 통해 단위 테스트의 완전성을 확인할 수 있다는 점과 단위 테스트가 코드의 어떤 영역에 해당하는지 확인할 수 있는 기능이 정말 마음에 들었습니다. 전혀 안 때려요.저는 현재 단위 테스트를 많이 하지 않는 조직에서 일하고 있으며 모든 사람이 단위 테스트, 코드 적용 범위 및 TDD를 수행하도록 독려하고 조직을 전환할 계획입니다.

이 주제에 대해 확신할 수 없는 한 가지 문제는 코드 적용 범위를 정확히 어느 정도까지 적용해야 하는가입니다.예를 들어, 다음과 같은 수업이 있다면:

//this class is meant as a pseudo-enum - I'm stuck on Java 1.4 for time being
public final class BillingUnit {

    public final static BillingUnit MONTH = new BillingUnit("month");
    public final static BillingUnit YEAR = new BillingUnit("year");

    private String value;

    private BillingUnit(String value) {
        this.value = value;
    }

    public String getValue() {
        return this.value;
    }

    public boolean equals(Object obj) {
        return value.equals(((BillingUnit) obj).getValue());

    }

    public int hashCode() {
        return value.hashCode();
    }
}

나는 이를 확인하기 위해 몇 가지 간단한 단위 테스트를 작성했습니다. equals() 올바르게 작동합니다. getValue() 내가 기대했던 것을 반환합니다.하지만 EclEmma의 시각적 특성 덕분에 hashcode() 메서드는 "테스트되지 않음"을 의미하는 밝은 빨간색으로 표시됩니다.

귀찮게 테스트해볼 가치도 있나요? hashCode(), 이 예에서 구현이 얼마나 간단한지 고려하면 어떨까요?단순히 코드 적용 범위를 늘리고 EclEmma가 이 줄에 추가하는 눈부신 빨간색 강조 표시를 제거하기 위해 이 메서드에 대한 단위 테스트를 추가하고 싶은 생각이 듭니다.

제가 신경증적이고 OCD와 같은 것일 수도 있지만, EclEmma와 같은 것을 사용하면 테스트되지 않은 내용을 쉽게 확인할 수 있습니다. 플러그인은 소스 코드를 빨간색으로 강조 표시하고, 가려진 코드는 녹색으로 강조 표시합니다. 많은 이점을 추가하지 않더라도 가능한 한 많은 클래스를 100% 친환경으로 만들기 위해 노력하세요.

도움이 되었습니까?

해결책

코드 적용 범위를 사용하여 불완전한 테스트 세트가있을 수있는 장소에 대한 힌트를 제공합니다. 예를 들어, 주어진 기능에 대한 테스트를 작성한 다음 해당 기능을 충족하는 코드를 개발할 수 있지만 그렇게하면 실제로는 예상보다 더 많은 코드를 작성합니다. 대체 케이스에서 예외가 발생할 수 있다고 말합니다. 시험이 운동하지 않는다. 적용 범위 분석기를 사용하면 관련 테스트가없는 코드를 도입했음을 알 수 있습니다. 충분한 테스트를 작성하지 않은시기를 아는 데 도움이됩니다.

반면에, 적용 범위 분석은 허위 보안으로 이어질 수 있습니다. 모든 코드를 보장한다고해서 충분한 테스트가 있음을 의미하지는 않습니다. 코드가 무엇을 해야하는지에 대한 관점에서 테스트에 대해 생각하고 테스트를 작성하여 테스트를 작성해야합니다. 바람직하게는 테스트를 먼저 작성하여. 코드가 완전히 덮여 있다고해서 코드가 수행해야 할 일을한다는 의미는 아닙니다.

당신의 예에서, 나는 코드를 작성하기 전에 메소드의 기능이 무엇을하는지 정의하기 위해 해시 코드 테스트를 작성했을 것입니다. 그러므로 나는 그것을 덮을 것입니다. 그렇다고 항상 100% 적용 범위가 있다는 의미는 아닙니다. 예를 들어 간단한 접근자에 대한 테스트 작성에 대해 지나치게 열심이 아닙니다. 또한 다른 사람들의 코드를 테스트 할 필요가 없기 때문에 프레임 워크에서 상속되는 모기 클래스에서 방법을 테스트 할 수 없습니다.

다른 팁

특정 종류의 진술을 무시하도록 선택할 수있는 도서관을 사용하는 것이 가치가 있다고 생각합니다. 예를 들어, 많은 경우 :

if(logger.isDebugEnabled()) {
    logger.debug("something");
}

이러한 종류의 라인에 대한 적용 범위 계산을 끄면 유용합니다. 또한 사소한 게터 및 세터에 대한 커버리지 계산을 끄는 것이 (다른 점검이나 부작용없이 단순히 멤버 변수를 설정하거나 반환하는 것)를 끄는 것이 (의심 할 여지없이) 유효 할 수 있습니다. 그러나 당신이 재정의 된 경우, 해시 코드와 해시 코드를 테스트해야한다고 생각합니다. 사소한 기능을 추가했으며 테스트해야합니다.

분명히, 위의 상황을 보장에서 제외해야한다고 생각하는 이유는 다음과 같습니다.

  • 기능을 테스트하지 않아도 괜찮습니다. 로깅 라이브러리가 각 로깅 레벨로 설정된 상태에서 전체 테스트 제품군 전체를 5 번 실행할 필요는 없습니다.
  • 위의 작업을 수행하면 다른 방식으로 커버리지를 기울입니다. 지점의 90% 인 경우 if(log.isDebugEnabled()), 그리고 당신은 다른 지점을 제외한 모든 것을 테스트하지 않으면 90%의 분기 적용 범위 (양호)가있는 것처럼 보일 것입니다.

코드 적용 범위와 테스트 범위 간에는 다릅니다. 코드가 100% 코드 커버리지가 아닌 적절하게 테스트되도록 시도해야합니다.

다음 코드를 고려하십시오.

public float reciprocal (float ex)
{
    return (1.0 / ex) ;
}

1.0의 값으로 통과 한 하나의 테스트를 실행하면 모든 패스로 100% 코드 커버리지 (Branch 및 Statement)를 얻게됩니다. 코드는 분명히 결함이 있습니다.

테스트 범위를 측정하는 것은 더 어렵고 더 나은 개발자와 테스터가되는 것입니다.

특히 해시 코드와 관련하여, 트루리스트는 해당 방법에 대한 별도의 단위 테스트가 있어야한다고 말할 것입니다. 나는 개인적으로 하나 이상의 단위 통합 테스트에 포함되며 각 액세서/수정자를 직접 테스트하지 않도록합니다. 투자 수익은 종종 노력을 정당화하기에는 너무 낮습니다. 이것은 당신이 올바른 해시 코드를 생성하는 것을 보장하는 단위 테스트를 하신다고 가정합니다.

100% 코드 커버리지 달성 의미있는 테스트는 더 이상 노력할 가치가 없을 수 있으며, 앞서 언급했듯이 100% 코드 적용 범위가 반드시 애플리케이션의 가능한 모든 조건을 테스트했다는 의미는 아닙니다.

테스트에 관해서는 equals, hashCode 그리고 다른 것 계약 기반 같은 인터페이스 Comparable 그리고 Serializable, 나는 그 테스트를 포함합니다.중요한 것은 equals/hashCode 계약이 올바르게 구현되었습니다. equals/Comparable.

보다 JUnit 애드온, 특히

지금은 너무 복잡하지 않을 수 있지만, 방법이 수정되면 나중에 예상대로 작동하는지 확인하는 간단한 점검은 나중에 매우 유용 할 수 있습니다.

수표는 정말 쉽게 작성해야하므로 왜 그렇게하지 않습니까? 통계에 도움이되며 나중에 파손되는 경우를 대비하여 확인하는 데 도움이됩니다.

또한 TDD의 경우 100% 적용 범위를 원합니다. 그러면 리팩터링 할 때 아무것도 깨뜨리지 않을 것이라고 확신 할 수 있습니다.

동료 프로그래머가 Old Java1.4에서 나처럼 붙어있었습니다.)

내 말대로 이전 답변, 코드 커버는 코드 테스트가 아닙니다. 그리고 결론은 다음과 같습니다. 특정 시점에서 코드 범위를 개선하는 유일한 방법은 ... 코드를 삭제하는 것입니다!

이제 해시 코드와 관련하여 예상되는 분류 메커니즘이 존중되는지 확인하기 위해 단위 테스트 설계로 덮는 것이 흥미 롭습니다 (하나 이상의 기능을 다루는 것이 아닙니다).

내가 다른 곳에서 말했듯이, 코드 커버가 낮은 문제는 문제이지만, 높은 코드 커버리지는 순수한 금을 쓰는 것을 의미하지는 않습니다.

코드 커버리지에 대해 걱정하지 않았다면 테스트가 필요할 것을 제안합니다. equals() 그리고 getValue() - 방법과 위치에 따라 hashCode() 사용 중입니다 (죄송합니다, 저는 C# 개발자입니다) ~할 것 같다 그것을 테스트하고 싶습니다.

가장 중요한 부분은 테스트를 통해 올바른 코드를 작성하고 코드가 예상대로 작동한다는 확신을 갖게된다는 것입니다.

이 특별한 경우, 나는 당신이 평등 방법을 테스트하고 있기 때문에, 동일한 객체에 동일한 해시 코드가 있음을 테스트 할 수도 있다고 말합니다.

그것은 당신에게 코드 적용 범위를 줄 것이며, 거래에 따라 해시 코드가 실제로 계약을 충족시킬 수 있다는 확신을 줄 것입니다 :-)

스트링의 해시 코드 방법을 신뢰할 수 있고이 클래스를 바꿀 것으로 기대하지 않는다는 점을 감안할 때 그것은 거의 가치가 있습니다. 그러나 당신이 그것을 테스트 할 수있는 평등 방법을 충분히 의심한다면, 그것을 테스트 할만 큼 의심 스러워야하고 해시 코드는 일관성을 유지해야합니다. 그리고 당신은 항상 당신이 앞으로 당신이 전에 한 일에 대해 엉망으로 만들고 싶지 않은 가정을 의심해야합니다. 예를 들어, 누군가가 포인터 평등 점검을 추가하여 누군가가 와서 '최적화'로 결정한 경우, 수정 된 코드를 실행할 수있는 전체 테스트 세트가있을 수 있습니다. 그렇지 않으면 그들은 당신이 한 것과 같은 걱정에 시간을 낭비 할 것입니다. 코드 커버리지가 없어도 괜찮습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top