代码之家  ›  专栏  ›  技术社区  ›  Neoblaster

具有覆盖率的PHPUnit测试命令行脚本

  •  1
  • Neoblaster  · 技术社区  · 8 年前

    我正在开发一个使用PHP类的命令行工具。

    现在我想测试我在命令行中使用的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`;
        }
    }
    

    执行成功,但文件命令中未包含任何内容。php’。

    首先,这可能吗? 然后,如果是,我该如何处理cover命令行脚本?

    非常感谢大家。

    顺致敬意,

    Neoblaster。

    更新:我在GitHub上发布了一个问题: https://github.com/sebastianbergmann/phpunit/issues/2817

    1 回复  |  直到 8 年前
        1
  •  0
  •   marv255    8 年前

    当您开始测试时,您有一个php解释器实例,它当前正在处理您的测试脚本。

    测试脚本调用命令行,该命令行调用php解释器的第二个实例。正当

    现在你有两个口译员在运行,他们彼此完全分离,没有任何机会知道其他口译员现在在做什么。

    因此,测试中的xdebug不知道命令脚本中使用了哪些代码行,哪些没有。

    我认为最好的解决方案是分离命令的类:

    //Command.php
    class Command
    {
    }
    

    以及命令的索引脚本:

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

    因此,您可以在测试套件中测试命令的类,并排除command\u索引。php来自coverage。

    推荐文章