2012-02-16 2 views
3

을 말한다 나는 다음과 같은 기능이 있습니다이 기능코드 커버리지는 100 %, 실제로는하지

function foo($p) 
{ 
    if ($p == null) 
     throw new Exception('bla'); 
    if ($p == null) 
    { 
     throw new Exception('bla'); 
    } 
    [...] 
} 

내 테스트가 예외를 던지는 라인을 포함되지 않습니다. 하지만 PHPUnit은 첫 번째 throw 문이 coverd이고 두 번째 문이 coverd라고 말합니다. 어쩌면 첫 번째가 해석되지만 실행되지 않습니다.

그래서 100 %에 도달하지 못하면 '100 %'라는 메시지를 받고 싶지 않습니다.

xDebug에 버그가 있습니까? 아니면 xDebug/PHPUnit을 구성 할 수 있습니까?

답변

5

xDebug의 코드 범위 메트릭은 줄 기반이 아닌 명령문 기반입니다. 즉, 중괄호로 묶인 블록이없는 제어 구조는 단일 명령문으로 처리됩니다. xDebug가 if() 테스트와 별도로 throw 행을 보도록하려면 두 번째 명령문에서와 같이 중괄호로 묶습니다.

if ($p == null)     // statement 1 
    throw new Exception('bla'); // rest of statement 1 

if ($p == null) {     // statement 1 
    throw new Exception('bla'); // statement 2 
} 
+0

설명해 주셔서 감사합니다. xDebug가 분기 나 조건 같은 다른 커버리지 메소드를 지원하는지 알고 있습니까? – user1027167

+0

@ user1027167 xDebug는 명령문에서 작동하지만 라인 기본 적용 범위 정보 만 제공합니다 – edorian

+0

User1026176, 분기/조건 적용 범위를 추가 할 계획이 있지만 지금까지 시간이 없었습니다. – Derick

2

이 문장의 인식이 아니라 '선'과 아래 phpunit을 문서에 설명 된대로 Xdebug는이 더 나은 데이터를 제공 할 수 없기 때문에이 문제가 발생 :

Code coverage analysis - Edge Cases :

<?php 
// Due to how code coverage works internally these two lines are special. 
// This line will show up as non executable 
if(false) 
    // This line will show up as covered because it is actually the 
    // coverage of the if statement in the line above that gets shown here! 
    will_also_show_up_as_coveraged(); 

// To avoid this it is necessary that braces are used 
if(false) { 
    this_call_will_never_show_up_as_covered(); 
} 

같은이간다구조. 이 동작을 피하는 유일한 방법은 중괄호를 추가하는 것입니다.

-1

사용중인 도구의 결함을 극복하기 위해 소스를 수정해야 할 때 매우 나쁩니다.

PHP Test Coverage Tool에는이 문제가 없습니다.

또한 여러 줄을 같은 줄에 배치하면 각 줄을 개별적으로 추적합니다. 나는 XDebug가 라인의 첫 번째 문장의 어떤 부분이 포함되어 있다면 "라인"을 덮음으로 표시 할 것이라고 믿는다. 나는 심지어 다음이 작업을 수행합니다 믿고 :

if (...) { .... } 

그래서 당신은 얻을 것이다 "false"로 범위는 조건이 항상 false 경우에도 조건에 의해 제어 블록에 대해보고했다.

관련 문제