加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

phpunit testuite独立性

发布时间:2020-12-13 17:34:54 所属栏目:PHP教程 来源:网络整理
导读:我正在phpunit中运行一系列测试,它们存在于单独的测试中,其列表由phpunit配置文件控制.当测试单独运行(即,不是通过配置文件,因此一次由于测试),它们通过,但是当一起运行时,我会失败. 仔细检查问题是,这些测试程序中的每一个都在框架中加载(通过require_once)
我正在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()这样的功能

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读