2012-09-22 16 views
6

このコード(また、私は読みやすくするためのラインカウンタを追加して、Windows 7のx64の上ではXdebug 2.2.1とPHP 5.4を使用して):PHPのXdebugは何を返すのですか? PHP/Xdebugを持つ

1: xdebug_start_code_coverage(); 
2: 
3: for ($ii = 0; $ii < 3; ++$ii) 
4: $x = time(); 
5: 
6: if (false) 
7: echo "Never executed."; 
8: 
9: echo var_dump(xdebug_get_code_coverage()); 

..私(私が修正したこの出力を取得いくつかの値は、より読みやすくするために):

array (size=1) 
    '..\testpage.php' => 
    array (size=4) 
     3 => int 1 
     4 => int 1 
     7 => int 1 
     9 => int 1 

以上はXdebugのサイトでドキュメントは言う:

「要素の値は、上の実行ユニットの合計数を表しこの行は実行されました。

出典:http://www.xdebug.com/docs/code_coverage

だから明らかに出力が間違っています。 3行目と3行目は3回実行されていたはずですが、Xdebugは1回ずつ実行されていたはずです。 6行目は一度実行されていたはずですが、Xdebugには全く言い訳がありませんでした。 7行目はまだ実行されていないはずですが、Xdebugは1回実行したと言っています。出力は中括弧の有無にかかわらず同じであると言わなければならない。

以上、このURLで:(!7年前)http://xdebug.org/archives/xdebug-general/0377.html

.. Derick RethansはXdebugのが唯一-1、0または1を返し、何とかドキュメントが間違っているという(そしてまだそれがある)キャッチされますしかし、私の例が示すように、Xdebugは1をまっすぐに返し、装備されたカウンターは彼の選択を恣意的にしているようです。 Xdebugが-1、0、または1を返したとしても、それらの値が何を表しているのかわかりません。

だから、あなたのエリートコーダーの誰もがアイデアを持っていますか?ここでXdebugに重大な問題がある場合、Xdebugを使用するプロファイリングとコードカバレッジに使用される他のアプリケーションやプラグインを信頼できないということですか?私は一般的な結婚と思われるPhingとPHPUnitを考えています。

また、この問題についていくつか詳しく説明しています。 Xdebugに欠陥があり、そのようなものであれば、すべての依存アプリケーション、PHPのコードカバレッジレポートには何を使用しますか?

EDIT:私はxdebug_start_code_coverageに引数として引数XDEBUG_CC_UNUSED又はXDEBUG_CC_DEAD_CODEを送信する場合、同じコード例を使用して上記の出力は、不変です。私はXdebugが私のシステムではなくコードカバレッジのために全く機能しないと思っています。

+0

たぶんPHPパーサはまだそれが実行されない場合でも、それを読んで、それのためのネイティブコードを生成することがありますか? –

+0

コール、私はあなたが7行目を考えていると思います。はい、そうかもしれません。しかし、もしXdebugがそのようなことを説明できなければ、全く役に立たないのではないでしょうか?それでも、3行目、4行目、6行目の問題があります。 –

+1

私はXdebugを使ったことがないので、明確な回答はできませんが、(http://www.digipedia.pl/usenet/thread/15739/ 883 /)は、実際に行が実行されていると思われる回数を返さないようです。 – kennypu

答えて

4

インデント構文で条件文を使用する際に問題があることは知っています。

XDebugは「ステートメント」についてしか認識しておらず、それが表示され話されているにもかかわらず、実際には「ライン」を理解しません。

この:

1 <?php 
2 
3 xdebug_start_code_coverage(); 
4 
5 for ($ii = 0; $ii < 3; ++$ii) { 
6  $x = time(); 
7 } 
8 
9 if (false) { 
10 echo "Never executed."; 
11 } 
12 
13 echo var_dump(xdebug_get_code_coverage()); 

は生成します。

array(1) { 
    ["./test.php"]=> 
    array(5) { 
    [5] => int(1) 
    [6] => int(1) 
    [7] => int(1) 
    [9] => int(1) 
    [13] => int(1) 
    } 
} 

は、詳細については、以下を参照してください。Edge CasesをPHPUnitのマニュアル

およびその他のSOの質問に:

+0

Thankyou willoller、あなたのコメントは役に立ちましたか?しかし、今私はさらに混乱しています。私はあなたのコードを再現し、同じ出力を得ました。なぜ私はXdebugが行7と行11が実行されていない(または__statement__ 7と__statement__ 11ですか?)と言っているのでしょうか? –

+0

私のコードでは6が実行されているので、6が実行されます。 11は10ではないからではない。末尾の '}'は、100%のカバレッジを強くしている人にとっては痛手です。これに対処するために、phpUnitは '// @ codeCoverageIgnore'(?)を追加して、中括弧の後に置くことができるようにしました。'} // @ codeCoverageIgnore'。ブリーチ。 – willoller

関連する問題