odota/odota

用于系统测试的交互式程序对话,用PHP编写

dev-develop 2016-09-23 15:15 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:53:04 UTC


README

o‧do‧ta — 芬兰语 odottaa 的命令形式: 等待,期待,预期,预期

使用PHP 5.6、PHP 7.x和HHVM的系统测试交互式程序对话。用PHP编写,可以轻松集成到您选择的测试框架中。

安装

$ composer require --dev odota/odota

API

示例解释一切。

use function Odota\Odota\spawn;

// Programmed dialogue with an interactive program.
spawn('echo -n " > "; read name; sleep 2; echo "Hello, $name!"')
    ->expect(' > ')
    ->sendln('Bob')
    ->timeoutAfter(3)
    ->expect('Hello, Bob!')
    ->expectExitCode(0);

// Expectation time-outs default to 100ms, but can be adjusted.
spawn('sleep 2; echo OK')
    ->timeoutAfter(1)
    ->expect('OK');
// Odota\Odota\ExpectationTimedOutException

// Expect programs to fail.
spawn('test -e non-existent-file')
    ->expectExitCode(1);

// Expect output on standard error
spawn('echo LOG >&2')
    ->expectError('LOG');

限制

目前,与被测试系统的通信通过管道进行。程序可能会确定它们的输入不是来自终端——或者伪终端——并禁用交互性。其他实现方法也值得考虑,这些方法可能在未来作为不同的驱动器实现。

  • 使用pty描述符的 proc_open() 而不是管道。然而,PHP中的伪终端支持是未记录的,并且在撰写本文时(2016年9月)Travis不支持。
  • 将脚本写入 expect 二进制的STDIN。
  • 使用 empty 命令。

在测试Symfony CLI应用程序时,将 SHELL_INTERACTIVE 环境变量设置为true,以强制交互性。

注意事项

要将测试调用者的环境变量传递给被测试系统,必须将 variables_order 的ini设置包括 E 以填充 $_ENV 超全局变量。一个简单的修复方法是在调用您的测试框架时在命令行上包含此ini设置。

$ php -d variables_order=EGPCS vendor/bin/phpunit

平台支持

Odota已在Ubuntu-like系统上的PHP 5.6、7.x和HHVM 3.6上进行了测试。它应在常见的Unixy系统上工作,包括Mac OS。Windows不受支持,因为在Windows下,由 proc_open() 返回的文件描述符上的 stream_select() 将失败

为什么...

...不针对用户空间的PHP CLI应用程序进行测试?

测试PHP CLI应用程序的一个更简单的方法是在与测试相同的执行上下文中启动应用程序,并可能模拟抽象交互性的单元,例如提问。测试最终可执行文件有几个原因。让我们从Nat Price的评论开始

系统测试对整个系统进行端到端测试,通过其发布的远程接口和用户界面驱动系统。它们还测试了系统的打包、部署和启动。(来源,截至2016年9月17日)

因此,测试最终可执行文件(“生产”可执行文件),您将更接近应用程序的“生产”状态,即作为从shell调用的PHP脚本。当您将应用程序打包为 Phar 时,这种差异甚至更大。

...当有像 expectempty 这样的工具时,还要创建PHP库?

  • 为了使用更熟悉的语言PHP进行测试,expect 使用Tcl。
  • 为了使用您最喜欢的PHP测试框架进行测试。
  • 为了提供一个测试API,而不仅仅是交互式对话。
  • 为了允许在相同的测试上下文中测试您的被测试系统的副作用,如文件系统更改。