仔细检查问题是,这些测试程序中的每一个都在框架中加载(通过require_once),该框架根据require_once时的设置执行一些内部配置.看来,在运行PHPunit配置文件中单独列出的测试项之间,各种事情都会持续存在.在这种特殊情况下,框架已被视为已加载.@H_403_2@
那么 – 有没有办法让PHPunit独立地执行一系列的测试,也就是等同于一次在测试中运行PHPunit? (PHPunit在自动测试机器上由cruisecontrol触发,在提交之前由开发人员在本地触发.)我尝试过如“–process-isolation”和“–no-globals-backup”这样的选项,没有成功.@H_403_2@
说明问题的一个简单例子将是一个’constant.PHP’文件:@H_403_2@
<?PHP if (defined('XYZZY')) define('TEST',1); else define('TEST',2);
<?PHP define('XYZZY',""); require_once('constant.PHP'); class TestOne extends PHPUnit_Framework_TestCase { public function testOne() { $this->assertEquals(TEST,1); } }
一个类似的测试“TestTwo.PHP”:@H_403_2@
<?PHP require_once('constant.PHP'); class TestTwo extends PHPUnit_Framework_TestCase { public function testTwo() { $this->assertEquals(TEST,2); } }
<PHPunit> <testsuites> <testsuite name="First"> <file>./TestOne.PHP</file> </testsuite> <testsuite name="Second"> <file>./TestTwo.PHP</file> </testsuite> </testsuites> </PHPunit>
希望你能够让你的测试与那些工作.如果不是只给我一个评论,我会看到回到你.@H_403_2@
我已经用3.4.15测试了大部分内容,所有这些都与HEAD(3.5.x预计也会工作)@H_403_2@
最简单的做法是:@H_403_2@
<?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); } }
并产生:@H_403_2@
PHPunit –process-isolation processTest.PHP@H_403_2@
PHPUnit @package_version@ by Sebastian Bergmann.@H_403_2@
..@H_403_2@
Time: 0 seconds,Memory: 1.25Mb@H_403_2@
OK (2 tests,2 assertions)@H_403_2@
因此,如果您将测试组合在测试套件中,或者您可以为每个测试用例运行安装程序(取决于它是多么昂贵),那么可以使用简单的方法:@H_403_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); }
简而言之@H_403_2@
确保您在输入测试(和过程隔离)之后运行您的设置代码@H_403_2@
如果一切都失败,你/我们无法解决这个问题:@H_403_2@
使用runkit
扩展(即使是NEAR生产也不安全),可以调用像runkit-constant-remove()
这样的功能@H_403_2@
希望这可以帮助一个人.如果没有:让我知道@H_403_2@