如何使用PHPUnit测试命令行程序?我看到从命令行使用PHPUnit有很多帮助,但没有用于使用PHPUnit测试命令行程序本身。
这是因为我在PHP和Joomla中编写命令行程序,但是没有看到测试输出的方法,特别是在发生错误时(因为你无法使用PHPUnit的 expectOutputString()测试错误输出) )。
(编辑:请注意,我的大部分代码已经在PHPUnit测试的类中 - 我正在寻找一种方法来测试命令行(包装器)程序的逻辑。)
答案 0 :(得分:2)
一种方法是使用反引号运算符(`)来捕获程序的输出,然后检查该输出。这在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 ,然后使用正则表达式断言来测试输出是否与正确的输出相似。
答案 1 :(得分:0)
以与网页相同的方式进行测试,只需编写测试并针对您的代码执行测试。这假设您正在测试程序的对象,而不是从命令行程序返回代码。
您的代码包含执行和操作数据的类。只是没有生成网页。只需为类,数据操作等编写相同的测试......当您对代码片段而不是完整的可执行文件运行测试时。
我有一个解析命令行选项的类,并允许代码迭代值。我编写测试来将命令行传递给对象(不读取实际的args,argv),然后可以测试它是否正确返回。