2017-10-18 10 views
1

PHPクラスを使用するコマンドラインツールを開発中です。 私はカバレッジのクラスをテストしました。PHPUnitテストカバレッジ付きコマンドラインスクリプト

今、コマンドラインで使用しているPHPスクリプトをテストしたいと思います。私は、コマンドラインスクリプトで実行された行をカバーすることができますどのように知っていただきたいと思い How do I test a command-line program with PHPUnit?

私は次のスレッドでコマンドラインをトリガする方法を発見しました。

私は、などのテストを作ってみました:

class CommandTest extends \PHPUnit_Framework_TestCase 
{ 
    protected static $command = './src/Command.php '; 
    protected static $testWorkingDir = 'tests/Command'; 

    public function testCLIInstall() 
    { 
     $command = self::$command . ' --help'; 
     $output = `$command`; 
    } 
} 

実行が正常に行われたが、何も「Command.php」ファイルでカバーされていません。

まず、可能ですか? それがそうであれば、coverコマンドラインスクリプトではどうしたらいいですか?

ありがとうございます。

最高のお礼、

Neoblaster

アップデート:私はGitHubの上で問題を開く:https://github.com/sebastianbergmann/phpunit/issues/2817

答えて

0

あなたが現在お使いのテストのスクリプトを処理しているPHPインタプリタのインスタンスを1つ持っているあなたのテストを開始すると。

あなたのテストスクリプトは、phpインタープリタの2番目のインスタンスを呼び出すコマンドラインを呼び出します。右?

今では、2つのインタープリタが動作していて、それらは完全に分離されており、他のインタープリタが現在何をしているのか知る気がありません。

あなたのテストのxdebugは、どのコード行がコマンドのスクリプトで使われたのか、そうでなかったのか分かりません。

私はあなたのための最善の解決策は、あなたのコマンドのクラスを分離することであると思う:

//Command.php 
class Command 
{ 
} 

とあなたのコマンドのインデックススクリプト:

//command_index.php 
(new Command($argv))->run(); 

ですから、あなたのテストスイートには、コマンドのクラスをテストすることができますし、カバレッジからcommand_index.phpを除外します。

+0

こんにちはMarv255、 私のコマンドラインスクリプトはPHPクラスではありませんが、それを使用しています。 対応するスクリプトを見つけてください:[Command.php](https://github.com/neooblaster/SY​​SLang/blob/master/src/Command.php?ts=3) これは完了していませんが、おそらくそれはコマンドラインインターフェイスを作成する間違った方法? 私は次の行をどうやって演奏するのか分かりません。 '(new Command($ argv)) - > run()' – Neoblaster

+0

さらに、私が今までに見たphp用のコマンドラインスクリプトを作成する最善の方法は、[symfony console](https:// symfony。com/doc/current/components/console.html)。詳しくはリンクをたどってください。 – marv255

関連する問題