phpunit testsuite independent

bor*_*ble 10 php phpunit cruisecontrol

我在phpunit中运行一系列测试,这些测试存在于单独的测试套件中,其列表由phpunit配置文件控制.当测试单独运行时(即不是通过配置文件运行,因此一次运行测试套件)它们通过但是,当一起运行时,我会失败.

仔细研究一下,问题是每个测试套件都在框架中加载(通过require_once),并且该框架根据require_once时的设置进行一些内部配置.看来,在运行phpunit配置文件中单独列出的测试套件之间,各种各样的事情仍然存在.在这种特殊情况下,框架已被视为已加载.

那么 - 有没有办法让phpunit独立执行一系列测试套件,即等同于在测试套件上一次运行一个phpunit? (phpunit正在由autotest机器上的cruisecontrol触发,并且在提交之前由开发人员在本地触发.)我尝试了诸如'--process-isolation'和'--no-globals-backup'之类的选项但没有成功.

一个说明问题的简单例子是'constant.php'文件:

<?php
if (defined('XYZZY')) define('TEST', 1);
else define('TEST', 2);
Run Code Online (Sandbox Code Playgroud)

testuite'TestOne.php':

<?php
define('XYZZY', "");
require_once('constant.php');
class TestOne extends PHPUnit_Framework_TestCase
{
   public function testOne()
   {
      $this->assertEquals(TEST, 1);
   }
}
Run Code Online (Sandbox Code Playgroud)

一个类似的测试套件'TestTwo.php':

<?php
require_once('constant.php');
class TestTwo extends PHPUnit_Framework_TestCase
{
   public function testTwo()
   {
      $this->assertEquals(TEST, 2);
   }
}
Run Code Online (Sandbox Code Playgroud)

和一个phpunit配置文件:

<phpunit>
  <testsuites>
    <testsuite name="First">
      <file>./TestOne.php</file>
    </testsuite>

    <testsuite name="Second">
      <file>./TestTwo.php</file>
    </testsuite>
  </testsuites>
</phpunit>
Run Code Online (Sandbox Code Playgroud)

edo*_*ian 1

我试图为您提供一些 --process-isolation 和无全局备份的工作示例。

希望您能够使您的测试与这些一起工作。如果没有,请给我留言,我会尽快回复您。

我已经使用 3.4.15 测试了大部分内容,并且全部针对 HEAD(预计 3.5.x 也可以工作)

最简单的方法是:

<?php
class Test extends PHPUnit_Framework_TestCase
{
    public function testOne()
    {
        define('FOO', 'BAR');
        $this->assertEquals('BAR', FOO);
    }

    public function testTwo()
    {
        define('FOO', 'BAZ');
        $this->assertEquals('BAZ', FOO);
    }
}
Run Code Online (Sandbox Code Playgroud)

并产生:

phpunit --进程隔离 processTest.php

PHPUnit @package_version@ ​​由 Sebastian Bergmann 编写。

..

时间:0秒,内存:1.25Mb

好的(2 个测试,2 个断言)

因此,如果您将测试分组在测试套件中,或者可以为每个测试用例运行设置(取决于它的成本),那么您可以使用以下简单的方法进行构建:

<?php
class Test extends PHPUnit_Framework_TestCase
{
    public function setUp() 
    {
        // your bootstrap for testsuite X
        // Maybe put this in a baseclass for that suite ?
    }

    public function testOne()
    {
        $this->assertEquals('BAR', FOO);
    }
Run Code Online (Sandbox Code Playgroud)

简而言之

确保在进入测试(和进程隔离)后运行设置代码

如果其他一切都失败并且您/我们无法解决此问题:

通过runkit扩展(即使是近生产环境,对任何东西都不安全,作为最后的手段使用),您可以调用类似的函数runkit-constant-remove()


希望这会有所帮助。如果没有:请告诉我