2017-10-18 51 views
1

Je développe un outil de ligne de commande qui utilise PHP Class. J'ai fait des tests pour mes classes avec couverture.Test PHPUnit Script de ligne de commande avec couverture

Maintenant, je voudrais tester mon script PHP utilisé en ligne de commande.

J'ai trouvé comment déclencher la ligne de commande avec le fil suivant: How do I test a command-line program with PHPUnit?

Je voudrais savoir comment puis-je couvrir les lignes exécutées dans le script de ligne de commande.

J'ai essayé de faire test comme:

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

L'exécution fait avec succès, mais rien est couvert dans le fichier « command.php ».

D'abord, est-ce possible? Ensuite, si c'est le cas, comment puis-je faire pour couvrir le script de ligne de commande?

Merci beaucoup pour tous.

Meilleures salutations,

Neoblaster.

Mise à jour: J'ouvre une question sur GitHub: https://github.com/sebastianbergmann/phpunit/issues/2817

Répondre

0

Lorsque vous démarrez vos tests que vous avez une instance de l'interpréteur PHP qui gère actuellement les scripts de vos tests.

Votre script de test appelle la ligne de commande, qui appelle la deuxième instance de l'interpréteur php. Droite?

Maintenant vous avez deux interprètes en cours d'exécution et ils sont totalement séparés les uns des autres et n'ont pas de changements pour savoir ce que l'autre interprète est en train de faire. Donc, xdebug de votre test ne sait pas quelles lignes de code ont été utilisées dans le script de votre commande et lesquelles ne l'ont pas été.

Je pense que la meilleure solution pour vous est de séparer votre classe de commande:

//Command.php 
class Command 
{ 
} 

et le script d'index de votre commande:

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

Vous pouvez donc tester la classe de votre commande dans votre suite de tests et exclure command_index.php de la couverture.

+0

Bonjour Marv255, Mon script de ligne de commande n'est pas une classe PHP, mais il en utilise un. Veuillez trouver ici le script correspondant: [Command.php] (https://github.com/neooblaster/SYSLang/blob/master/src/Command.php?ts=3) Ce n'est pas fini, mais c'est peut-être le mauvaise façon de faire l'interface de ligne de commande? Je ne sais pas comment lire la ligne suivante '(nouvelle commande ($ argv)) -> run()' – Neoblaster

+0

En outre, la meilleure façon de créer des scripts de ligne de commande pour php que j'ai jamais vu est [console symfony] (https: // symfony.com/doc/current/components/console.html). S'il vous plaît suivez le lien pour en savoir plus à ce sujet. – marv255