我在phpunit中运行一系列测试,这些测试存在于单独的测试套件中,其列表由phpunit配置文件控制。当单独运行测试(即不通过配置文件,因此一次只运行一个测试套件)时,测试通过,但是当一起运行时,测试失败。
经过仔细检查,问题在于这些测试套件每个都会加载框架(通过require_once),而该框架根据require_once时的设置进行一些内部配置。似乎在分别运行在phpunit配置文件中单独列出的测试套件之间,各种事物持续存在。在这种特殊情况下,该框架已被视为已加载。
那么,是否有一种方法可以让phpunit独立地执行一系列测试套件,即相当于一次只运行一个测试套件? (phpunit由CruiseControl在自动测试机上触发,在提交之前由开发人员在本地触发。)我尝试了诸如'--process-isolation'和'--no-globals-backup'等选项,但没有成功。
快速示例可说明问题的是一个“constant.php”文件:
经过仔细检查,问题在于这些测试套件每个都会加载框架(通过require_once),而该框架根据require_once时的设置进行一些内部配置。似乎在分别运行在phpunit配置文件中单独列出的测试套件之间,各种事物持续存在。在这种特殊情况下,该框架已被视为已加载。
那么,是否有一种方法可以让phpunit独立地执行一系列测试套件,即相当于一次只运行一个测试套件? (phpunit由CruiseControl在自动测试机上触发,在提交之前由开发人员在本地触发。)我尝试了诸如'--process-isolation'和'--no-globals-backup'等选项,但没有成功。
快速示例可说明问题的是一个“constant.php”文件:
<?php
if (defined('XYZZY')) define('TEST', 1);
else define('TEST', 2);
一个测试套件'TestOne.php':
<?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>
constant1.php1
和constant2.php
,它们都声明了相同的函数get_config()
。结果相同:每个单元测试单独运行时都完美运行,但当全部一起运行时,PHPUnit会抱怨get_config()
被声明了两次!@#$ ^%| $)和)@%^ * $)#@) 现在,我想知道是否有更好的设计模式来处理多个测试用例的配置。 - Frederic Bazin