2011-09-11 9 views
1

ユースケース:私は、各テストケースを実行するユニットテストフレームワークの診断テストを作成しようとしていますが、まだパブリックメソッドのリストを返しています。テストケース。アイデアは、それぞれのパブリックメソッドが少なくとも1つの単体テストでテストされていることを確認することによってテストカバレッジを向上させることです。PHPで以前のメソッド呼び出しをトレースする

問題:クラスのメソッドが呼び出されたかどうかを検出できません。私はdebug_backtrace()関数を使ってみましたが、テストされているクラスメソッドではなく、テストフレームワークからの呼び出しのみを返します。私が実行されているメソッド名を取得できる唯一の方法は、テストクラスのメソッドにdebug_backtrace()関数を実際に配置することです。これは、すべてのクラスのすべてのパブリックメソッドにそれを持たなければならないため、容認できないオプションです。

テストされたクラスメソッドを取得するためにバックトレースを実行する別の方法はありますか?あるいは、少し異なるアプローチでは、呼び出されているすべてのメソッドを記録するリスナーを開始および停止する方法があります(私は属していないものを解析できます)。

擬似コード

runTest($testName){ 

    //run the test 
    //get all recent classes and methods used 
    //parse out test framework info 
    //compare used public methods to public method list for the tested class 

} 

または:

runTest($testName){ 

    //start listener 
    //run the test 
    //close listener, get all recent classes and methods used 
    //parse out test framework info 
    //compare used public methods to public method list for the tested class 

} 
+1

"考えられるのは、それぞれのパブリックメソッドが少なくとも1つの単体テストでテストされていることを確認することでテストカバレッジを向上させることです。 ---私はこのメトリックが有用な何かを表しているとは思わない。他の(phpunit)のテストフレームワークのようにxdebugを使用してみませんか? – zerkms

+0

@zerkms - メトリックが有用ではないと思われる理由を説明できますか?要点は、メソッドが少なくとも1つの単体テストを持つことによって完全にカバーされていることを意味するのではなく、どのパブリックメソッドが*どのカバレッジも持たないことを指摘することを意味します。 xdebugに関しては、私がする必要がなければ、ユーザーに追加の拡張機能をインストールさせたくないのです。 – VirtuosiMedia

+0

「任意の呼び出し」は私にとって有用な指標ではありません。メソッドの長さは100行ですが、1%でカバーされます( 'if($ bla)return;')。 – zerkms

答えて

2

があなたの問題に対処するためのいくつかの一般的な方法についてCode Coverage tools for PHPXdebug 2: Code Coverage AnalysisSebastian Bergmann's PHP_CodeCoverageを参照してください。

通常、外部からPHPを見ています。 debug_backtrace()を使用すると、あなたが本当にあなたのPHPスクリプトの動作を変更しないウォッチャー(例えば、バックトレースのテストメソッドを含む)を必要としているので、あなた自身が言ったように、速度が遅く、完全に信頼することはできません。

+0

答えてくれてありがとう、chelmertz。あなたはXdebugを使わないでそれをする方法を知っていますか? (それらのソリューションのすべてがそれを必要とするように見えます)。 – VirtuosiMedia

+0

@VirtuosiMedia:いいえ、申し訳ありません。私はxdebugに依存しますが、それは本当にしっかりしており、主流によって使用されています。「余分な」メトリックなので、xdebugの依存関係は問題ありませんが、私はあなたではありません:) – chelmertz

1

PHP Test Coverage Toolを参照してください。 xdebugを使用せずに、プログラムの実行中にテストカバレッジデータを収集します。これは、テストプロセスの期間など、コードに計測器を一時的に挿入することによって行われます。

テストカバレッジデータを表示し、コードに表示されているコードを素敵なUIに表示することで、何がカバーされているかを確認できます(メソッドが実行される可能性がありますが、また、コードの階層に一致するものが含まれていないことを示すレポートが返されます。そのXML版には、あなたが望む情報が含まれています:そのような、そしてそのような方法は、カバーされていませんでした。

+0

そのツールは素晴らしく見えますが、コードの目的が野生。あなたはそのアプローチを取ったので、PHPの中でこれを行う簡単な方法がないと感じましたか? – chelmertz

+0

@chlemertz:はい、いいえ。私たちは、一般的に、自己防衛からこの方法でツールを構築します。私たちが不可解な言語のデバッグインフラストラクチャに依存する必要がなければ、必要なものがそこにないときには立ち往生しません。 PHPの場合、Xdebugの存在はiffyです。サーバー上のコードを持つ人はそれを持っていないことが多く、サーバーマネージャーはそれをインストールしません。私たちのソリューションは、XDebugが存在するかどうかにかかわらず動作します。私はコードが "野生に放出されるなら依存関係"へのあなたの反対を理解しているかどうかはわかりません。私たちの機器は一時的です。それを保つか発送する必要はありません。元のコードを発送してください。 –

+0

あなたのツールは本当にうまく見えますが、(より良い言葉がないと)xdebugよりも入手が難しいようですが、それはWindowsのように思えますし、値札もあるからです。同様の理由で、 "xdebugはPHP Test Coverage Toolが存在するかどうかに関係なく動作します"。犯行はありません。+1 – chelmertz

関連する問題