如果侦听器是在PHPUnit.xml中定义的,是否可以将PHP变量传递到PHPUnit的自定义侦听器中? 处境

如果侦听器是在PHPUnit.xml中定义的,是否可以将PHP变量传递到PHPUnit的自定义侦听器中? 处境,php,phpunit,Php,Phpunit,我可能没有使用传统意义上的PHPUnit。我正在使用PHPUnit和Selenium 2。我们的想法是记录Selenium以“复制步骤”的方式执行的操作。这意味着,如果我们调用Selenium来“单击”或“键入”,则会记录该操作。如果操作失败,也会记录该操作。我们不调用断言来设置类型操作。例如,如果我们正在测试一个页面以查看客户信息,但在我们进入该页面之前,我们需要登录,我们不会断言登录操作,而只在必须查看客户信息时断言最后一部分 现在,当我们最终执行断言时,我们还希望记录结果。我们创建了一个自

我可能没有使用传统意义上的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
config文件来定义自定义侦听器

查看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>
根据示例,看起来我可以传入一个对象。。。但它将是一个新实例化的对象,而不是预先存在的对象

此外,如果使用上面的示例,我们将在客户侦听器中去掉
setStepTracker()
,并通过客户侦听器的
\uu构造()传入action recorder对象

问题: 是否可以通过
phpunit.xml
通过自定义侦听器传入变量

我们还将定义一个引导来初始化动作记录器


如果不是,那么最好的操作过程是否会使action recorder对象在引导中成为全局对象,并让自定义侦听器以这种方式访问它?

由于
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
的问题。

我只做了大约一年的OOP(主要是php),还没有编写任何单例类型的类。如果stepStepTracker()是静态的,那么它是否会像QA_Listener::setStepTracker($stepTracker)那样直接调用它并得到相同的结果?在
bootstrap.php
之前,
phpunit.xml
中的自定义侦听器是否真的被处理过(实例化或挂接,无论需要做什么)?我的引导程序有
$QA\u STEP\u TRACKER=新的QA\u StepTracker()
,而QA\u侦听器的构造有
全局$QA\u STEP\u TRACKER
,并且能够按预期处理它。谢谢我刚刚做了一个快速测试,结果显示,虽然先处理
phpunit.xml
,但监听器是在执行
bootstrap.php
后创建的。因此,侦听器的构造函数实际上可以依赖于在
bootstrap.php
中创建的全局变量。
// bootstrap.php
$stepTracker = new QA_StepTracker();

// listener
class QA_Listener implements PHPUnit_Framework_TestListener
{
    public function __construct() {
        global $stepTracker;
        $this->stepTracker = $stepTracker;
        ...
    }
}