2012-02-16 61 views
3

我有以下功能:的XDebug和PHPUnit的代碼覆蓋率說100%,其實它不是

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

我給這家功能測試不覆蓋拋出異常的行。但是PHPUnit告訴我,第一個'throw'語句被覆蓋,第二個不是。也許第一個被解釋,但它不被執行。

因此,如果我沒有達到100%,我不想得到'100%'的消息。

這是xDebug中的錯誤還是我可以配置xDebug/PHPUnit?

回答

5

xDebug的代碼覆蓋率度量是基於語句而不是基於行的。這意味着沒有用大括號括起來的控制結構被視爲單個語句。要讓xDebug將throw行與if()測試分開,請將其與第二個語句中的括號括起來。

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 2012-02-16 09:27:55

+0

@ user1027167 xDebug在語句上工作,但僅提供線條基本覆蓋信息 – edorian 2012-02-16 09:50:11

+0

User1026176,我計劃添加分支/條件覆蓋,但目前爲止還沒有時間。 – Derick 2012-02-17 10:06:23

2

這是因爲XDebug的不能提供更好的數據,因爲它是隻知道聲明的,而不是「行」和下PHPUnit文檔中記載:

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(); 
} 

這同樣適用於該$x ? $y : $z;構造。避免這種行爲的唯一方法是添加花括號。

-1

當您必須修改源代碼以克服您正在使用的工具的缺陷時,它非常糟糕。我們的PHP Test Coverage Tool不存在這個問題。

此外,如果您在同一行放置多個語句,我們將單獨跟蹤它們。我相信,如果覆蓋該行中第一條語句的任何部分,XDebug會將「行」標記爲覆蓋。我相信它甚至會爲以下這樣做:

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

所以你會得到「假」報道報道了通過控制條件塊,即使條件始終爲false。