4

如何使用 PHPUnit 测试命令行程序?我看到很多关于从命令行使用 PHPUnit 的帮助,但没有看到关于使用 PHPUnit 测试命令行程序本身的帮助。

这是因为我在 PHP 和 Joomla 中编写命令行程序,但没有看到测试其输出的方法,尤其是在发生错误时(因为您无法使用 PHPUnit 的expectOutputString()测试错误输出)。

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

4

2 回答 2

3

一种方法是使用反引号运算符 (`) 来捕获程序的输出,然后检查该输出。这在 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,然后使用正则表达式断言来测试输出是否类似于正确的输出。

于 2013-07-17T13:08:12.967 回答
0

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

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

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

于 2013-07-17T15:25:33.237 回答