2017-10-18 1 views
1

Ich entwickle ein Befehlszeilenprogramm, das PHP-Klasse verwendet. Ich machte Tests für meine Klassen mit Abdeckung.PHPUnit-Test Befehlszeilenskript mit Abdeckung

Jetzt möchte ich mein PHP Script testen, das in der Befehlszeile verwendet wurde.

fand ich, wie Kommandozeile mit dem folgende Threads auslösen: How do I test a command-line program with PHPUnit?

Ich mag würde wissen, wie ich Zeilen in dem Befehlszeile-Skript ausgeführt abdecken kann.

Ich versuchte Test als wie zu machen:

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`; 
    } 
} 

Die Ausführung erfolgt erfolgreich, aber nichts ist Abdeckung in der Datei 'Command.php'.

Erstens, ist es möglich? Dann, wenn es ist, wie kann ich für Deckblatt-Skript tun?

Vielen Dank für alles.

Mit freundlichen Grüßen,

Neoblaster.

Update: Ich öffne ein Problem auf GitHub: https://github.com/sebastianbergmann/phpunit/issues/2817

Antwort

0

Wenn Sie Ihre Tests starten Sie eine Instanz der PHP-Interpreter haben, die zur Zeit Skripte Ihrer Tests' verarbeitet.

Ihr Testskript ruft die Befehlszeile auf, die die zweite Instanz des PHP-Interpreters aufruft. Recht?

Jetzt haben Sie zwei Interpreter laufen und sie sind völlig voneinander getrennt und haben keine chanes zu wissen, was andere Interpreter jetzt tut.

Also xdebug von Ihrem Test weiß nicht, welche Codezeilen in Ihrem Skript des Befehls verwendet wurden und welche nicht.

Ich denke, die beste Lösung für Sie ist Ihr Befehl Klasse zu trennen:

//Command.php 
class Command 
{ 
} 

und Index-Skript Ihres Befehl:

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

So können Sie Ihren Befehl Klasse in Ihrer Testsuite getestet und Schließen Sie command_index.php von der Berichterstattung aus.

+0

Hallo Marv255, Mein Befehlszeilenskript ist keine PHP-Klasse, aber es verwendet eine. Hier finden Sie das entsprechende Skript: [Command.php] (https://github.com/neooblaster/SYSLang/blob/master/src/Command.php?ts=3) Es ist nicht fertig, aber vielleicht ist es das falsche Art, Befehlszeilenschnittstelle zu machen? So kann ich nicht die folgende Zeile spielen '(neue Befehl ($ argv)) -> run()' – Neoblaster

+0

Außerdem ist der beste Weg, um Kommandozeilenskripte für PHP zu erstellen, die ich je gesehen habe, [Symfony Console] (https: // symfony.com/doc/current/komponenten/console.html). Bitte folgen Sie dem Link, um mehr darüber zu erfahren. – marv255

Verwandte Themen