如何使用PHPUnit测试命令行程序?

如何使用PHPUnit测试命令行程序?,php,command-line,phpunit,Php,Command Line,Phpunit,如何使用PHPUnit测试命令行程序?从命令行使用PHPUnit有很多帮助,但对于使用PHPUnit测试命令行程序本身却没有帮助 出现这种情况是因为我正在用PHP和Joomla编写命令行程序,但看不到测试其输出的方法,尤其是在出现错误时(因为无法使用PHPUnit的expectOutputString()测试错误输出) (编辑:注意,我的大部分代码已经在PHPUnit测试过的类中——我正在寻找一种方法来测试命令行(包装器)程序的逻辑。)一种方法是使用backtick操作符(`)捕获程序的输出,然

如何使用PHPUnit测试命令行程序?从命令行使用PHPUnit有很多帮助,但对于使用PHPUnit测试命令行程序本身却没有帮助

出现这种情况是因为我正在用PHP和Joomla编写命令行程序,但看不到测试其输出的方法,尤其是在出现错误时(因为无法使用PHPUnit的expectOutputString()测试错误输出)


(编辑:注意,我的大部分代码已经在PHPUnit测试过的类中——我正在寻找一种方法来测试命令行(包装器)程序的逻辑。)

一种方法是使用backtick操作符(`)捕获程序的输出,然后检查该输出。这在Unix/Linux风格的操作系统下运行良好,因为您还可以捕获错误输出,如STDERR。(在Windows下更痛苦,但可以做到(尤其是使用Cygwin)。)

例如:

public function testHelp()
{
        $output = `./add-event --help 2>&1`;
        $this->assertRegExp(    '/^usage:/m',                $output, 'no help message?' );
        $this->assertRegExp(    '/where:/m',                 $output, 'no help message?' );
        $this->assertNotRegExp( '/where event types are:/m', $output, 'no help message?' );
}

您可以看到,STDOUT和STDERR都被捕获到$output中,然后使用regex断言来测试输出是否与正确的输出相似。

以与网页相同的方式进行测试,只需编写测试并根据代码执行它们。这是假设您正在测试程序的对象,而不是从命令行程序返回代码

您的代码包含执行和操作数据的类。只是没有一个网页正在生成。只需为类、数据操作等编写相同的测试。。。当您针对代码片段而不是完整的可执行文件运行测试时


例如,我有一个解析命令行选项的类,并允许代码在这些值上迭代。我编写测试将命令行传递给对象(不读取实际的args,argv),然后可以测试它是否正确返回。

您可以将命令行脚本逻辑分组到函数/类中,然后测试这些函数和类