【问题标题】:PHPUnit test Command Line script with coveragePHPUnit 测试具有覆盖率的命令行脚本
【发布时间】:2018-03-30 18:40:59
【问题描述】:

我正在开发一个使用 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`;
    }
}

执行成功,但文件'Command.php'中没有任何内容。

首先,有可能吗? 那么,如果是,我该怎么做覆盖命令行脚本?

非常感谢大家。

最好的问候,

新生机。

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

【问题讨论】:

    标签: php command-line phpunit code-coverage


    【解决方案1】:

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

    您的测试脚本调用命令行,该命令行调用 php 解释器的第二个实例。对吧?

    现在你有两个解释器在运行,它们彼此完全分开,没有任何机会知道其他解释器现在在做什么。

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

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

    //Command.php
    class Command
    {
    }
    

    和你的命令的索引脚本:

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

    因此,您可以在测试套件中测试您的命令类,并将 command_index.php 排除在覆盖范围之外。

    【讨论】:

    • 嗨 Marv255,我的命令行脚本不是 PHP 类,但它使用了一个。请在此处找到相应的脚本:Command.php 没有完成,但也许是命令行界面的错误方式?所以不知道怎么玩下面这行(new Command($argv))->run()
    • 请查看your github。快乐hacktoberfest :)
    • 另外,我见过的为php创建命令行脚本的最好方法是symfony console。请点击链接阅读更多相关信息。
    • 如果没有您的第一反应的帮助,我永远不会单独成功。我将深入研究该操作,并在命令行中对我的其他工具进行同样的操作。我是一个自学成才的人,所以我不知道开发中的所有最佳实践。更多关于制作 CLI 工具的信息。非常感谢您的贡献。
    猜你喜欢
    • 1970-01-01
    • 2021-01-07
    • 2018-03-04
    • 2018-06-16
    • 2012-01-18
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    相关资源
    最近更新 更多