情况
我可能没有使用传统意义上的PHPUnit。我正在使用PHPUnit和Selenium 2。我们有这个想法来记录Selenium以"复制步骤"的方式执行的操作。这意味着,如果我们调用Selenium来"点击"或"键入",那么操作就会被记录下来。如果操作失败,也会记录下来。我们不是在调用断言来设置类型的操作。例如,如果我们正在测试一个页面来查看客户信息,但在我们到达需要登录的页面之前,我们不会断言登录操作,而是只在必须查看客户信息时断言最后一部分。
现在,当我们最终进行断言时,我们还想记录结果。我们创建了一个自定义侦听器来捕获结果。我们现在面临的问题是如何将结果发送回我们的行动记录仪。
我最初运行的PHPUnit测试是这样的:
class SandboxTest extends PHPUnit_Framework_TestCase { /* tests */ }
$stepTracker = new QA_StepTracker(); // Our custom action recorder
$suite = new PHPUnit_Framework_TestSuite();
$listener = new QA_Listener(); // Our customer listener
$listener->setStepTracker($stepTracker); // Passing the action recorder object to our customer listener
$result = new PHPUnit_Framework_TestResult();
$suite->addTestSuite('SandboxTest');
$result->addListener($listener);
$suite->run($result);
这正如我所期望的那样工作,尽管这样运行感觉像是在失去phpunit
命令所提供的许多功能。我想回到使用phpunit
命令,并使用phpunit.xml
配置文件来定义自定义侦听器。
通过查看PHPUnit文档,我注意到在phpunit.xml
中定义客户侦听器时可以传递参数。
<listeners>
<listener class="MyListener" file="/optional/path/to/MyListener.php">
<arguments>
<array>
<element key="0">
<string>Sebastian</string>
</element>
</array>
<integer>22</integer>
<string>April</string>
<double>19.78</double>
<null/>
<object class="stdClass"/>
</arguments>
</listener>
</listeners>
相当于
$listener = new MyListener(
array('Sebastian'),
22,
'April',
19.78,
NULL,
new stdClass
);
根据这个例子,看起来我可以通过一个物体。。。但它将是一个新实例化的对象,而不是预先存在的对象。
此外,如果我们使用上面的示例,我们将在客户侦听器中去掉setStepTracker()
,并通过客户侦听器的__construct()
传入动作记录器对象
问题
是否可以通过phpunit.xml
通过自定义侦听器传入变量?
我们还将定义一个引导程序来初始化动作记录器。
如果不是,那么最好的操作方案是在引导程序中使动作记录器对象全局化,并让自定义侦听器以这种方式访问它吗?
由于phpunit.xml
是在bootstrap.php
之前处理的,但侦听器是在之后创建的,因此可以在侦听器的构造函数中使用全局变量。
// bootstrap.php
$stepTracker = new QA_StepTracker();
// listener
class QA_Listener implements PHPUnit_Framework_TestListener
{
public function __construct() {
global $stepTracker;
$this->stepTracker = $stepTracker;
...
}
}
更新:修复了在创建侦听器之前执行bootstrap.php
的问题。