phpunit testuite独立性

前端之家收集整理的这篇文章主要介绍了phpunit testuite独立性前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在PHPunit中运行一系列测试,它们存在于单独的测试中,其列表由PHPunit配置文件控制.当测试单独运行(即,不是通过配置文件,因此一次由于测试),它们通过,但是当一起运行时,我会失败.

仔细检查问题是,这些测试程序中的每一个都在框架中加载(通过require_once),该框架根据require_once时的设置执行一些内部配置.看来,在运行PHPunit配置文件中单独列出的测试项之间,各种事情都会持续存在.在这种特殊情况下,框架已被视为已加载.

那么 – 有没有办法让PHPunit独立地执行一系列的测试,也就是等同于一次在测试中运行PHPunit? (PHPunit在自动测试机器上由cruisecontrol触发,在提交之前由开发人员在本地触发.)我尝试过如“–process-isolation”和“–no-globals-backup”这样的选项,没有成功.

说明问题的一个简单例子将是一个’constant.PHP文件

<?PHP
if (defined('XYZZY')) define('TEST',1);
else define('TEST',2);

TestOne.PHP的testuite

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

一个类似的测试“TestTwo.PHP”:

<?PHP
require_once('constant.PHP');
class TestTwo extends PHPUnit_Framework_TestCase
{
   public function testTwo()
   {
      $this->assertEquals(TEST,2);
   }
}

PHPunit配置文件

<PHPunit>
  <testsuites>
    <testsuite name="First">
      <file>./TestOne.PHP</file>
    </testsuite>

    <testsuite name="Second">
      <file>./TestTwo.PHP</file>
    </testsuite>
  </testsuites>
</PHPunit>
我试图为您提供一些工作过程隔离的工作示例,而不是备份全局.

希望你能够让你的测试与那些工作.如果不是只给我一个评论,我会看到回到你.

我已经用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);
    }
}

并产生:

PHPunit –process-isolation processTest.PHP

PHPUnit @package_version@ by Sebastian Bergmann.

..

Time: 0 seconds,Memory: 1.25Mb

OK (2 tests,2 assertions)

因此,如果您将测试组合在测试套件中,或者您可以为每个测试用例运行安装程序(取决于它是多么昂贵),那么可以使用简单的方法

<?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);
    }

简而言之

确保您在输入测试(和过程隔离)之后运行您的设置代码

如果一切都失败,你/我们无法解决这个问题:

使用runkit扩展(即使是NEAR生产也不安全),可以调用runkit-constant-remove()这样的功能

希望这可以帮助一个人.如果没有:让我知道

原文链接:https://www.f2er.com/php/131404.html

猜你在找的PHP相关文章