如何使用PHPUnit测试命令行程序?我从命令行看到使用PHPUnit的很多帮助,但是没有一个使用PHPUnit测试命令行程序本身。如何使用PHPUnit测试命令行程序?
这来了,因为我写在PHP和Joomla命令行程序,但是不明白的方式来测试它们的输出,特别是在发生错误时(因为你不能使用PHPUnit的的expectOutputString测试错误输出() )。
(编辑:请注意,我的代码的大部分是已经在由PHPUnit的测试类 - 我正在寻找一种方式来测试命令行(包装)程序的逻辑)
如何使用PHPUnit测试命令行程序?我从命令行看到使用PHPUnit的很多帮助,但是没有一个使用PHPUnit测试命令行程序本身。如何使用PHPUnit测试命令行程序?
这来了,因为我写在PHP和Joomla命令行程序,但是不明白的方式来测试它们的输出,特别是在发生错误时(因为你不能使用PHPUnit的的expectOutputString测试错误输出() )。
(编辑:请注意,我的代码的大部分是已经在由PHPUnit的测试类 - 我正在寻找一种方式来测试命令行(包装)程序的逻辑)
一种方法是使用反引号操作符(`)来捕获程序的输出,然后检查该输出。这适用于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?');
}
可以看到,标准输出和STDERR被抓获到$输出,然后正则表达式断言用于测试输出是否类似于正确的输出。
以与测试网页相同的方式进行测试,只需编写测试并针对您的代码执行测试即可。这假定您正在测试程序的对象,而不是从命令行程序返回代码。
您的代码包含执行和操作数据的类。只是没有生成网页。简单地为类,数据操作等编写相同的测试,因为您正在对代码片段运行测试,而不是完整的可执行文件。
我有一个类来解析实例的命令行选项,并允许代码遍历这些值。我编写了测试以将命令行传递给对象(不需要读取实际的参数,argv),然后可以测试它是否正确返回。
您可以将您的命令行脚本逻辑组合到函数/类中,然后测试这些函数和类 – dm03514