backupGlobals标注用于可选地允许在每个测试之前备份所有全局与超全局变量,并在每个测试结束后还原这些备份。
怎么一个意思呢?
首先看看下面这个实例:
MyTest.php:
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;
$GLOBALS['z']="z";
$_SERVER["a"]="a";
final class MyTest extends TestCase
{
public function testOne(): void
{
var_dump(__METHOD__."全局:".$GLOBALS['z']);
var_dump(__METHOD__."超全局:".$_SERVER["a"]);
$GLOBALS['z']="zz";
$_SERVER["a"]="aa";
$this->assertTrue(true);
}
public function testTwo(): void
{
var_dump(__METHOD__."全局:".$GLOBALS['z']);
var_dump(__METHOD__."超全局:".$_SERVER["a"]);
$this->assertTrue(true);
}
}
可以看到这里我们有两个测试方法,第一个测试方法中输出了全局变量和超全局变量后同时又修改了全局变量和超全局变量的值。
那么运行结果自然是在第二个测试方法中输出的全局变量和超全局变量都是第一个测试方法中修改过后的全局变量和超全局变量了。
C:\Users\Administrator>D:\phpstudy_pro\Extensions\php\php7.4.3nts\php.exe C:\Users\Administrator\PhpstormProjects\untitled\vendor\phpunit\phpunit\phpunit -c C:\Users\Administrator\PhpstormProjects\untitled\organizing\phpunit.xml C:\Users\Administrator\PhpstormProjects\untitled\organizing\tests\MyTest.php
PHPUnit 9.5.8 by Sebastian Bergmann and contributors.
.string(23) "MyTest::testOne全局:z"
string(26) "MyTest::testOne超全局:a"
. 2 / 2 (100%)string(24) "MyTest::testTwo全局:zz"
string(27) "MyTest::testTwo超全局:aa"
Time: 00:00.007, Memory: 4.00 MB
OK (2 tests, 2 assertions)
那么我们如果将实例的源代码修改如:
MyTest.php:
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;
$GLOBALS['z']="z";
$_SERVER["a"]="a";
/**
* @backupGlobals enabled
*/
final class MyTest extends TestCase
{
public function testOne(): void
{
var_dump(__METHOD__."全局:".$GLOBALS['z']);
var_dump(__METHOD__."超全局:".$_SERVER["a"]);
$GLOBALS['z']="zz";
$_SERVER["a"]="aa";
$this->assertTrue(true);
}
public function testTwo(): void
{
var_dump(__METHOD__."全局:".$GLOBALS['z']);
var_dump(__METHOD__."超全局:".$_SERVER["a"]);
$this->assertTrue(true);
}
}
那么运行结果:
C:\Users\Administrator>D:\phpstudy_pro\Extensions\php\php7.4.3nts\php.exe C:\Users\Administrator\PhpstormProjects\untitled\vendor\phpunit\phpunit\phpunit -c C:\Users\Administrator\PhpstormProjects\untitled\organizing\phpunit.xml C:\Users\Administrator\PhpstormProjects\untitled\organizing\tests\MyTest.php
PHPUnit 9.5.8 by Sebastian Bergmann and contributors.
.string(23) "MyTest::testOne全局:z"
string(26) "MyTest::testOne超全局:a"
. 2 / 2 (100%)string(23) "MyTest::testTwo全局:z"
string(26) "MyTest::testTwo超全局:a"
Time: 00:00.009, Memory: 6.00 MB
可以看到在类级别添加上backupGlobals标注后级别第一个测试方法修改了全局以及超全局变量,那么进入第二个测试方法中仍旧用的是最早的那个全局变量和超全局变量,因为第一个测试方法修改后由于有backupGlobals标注,所以就备份了最早的全局和超全局变量,直到第二个测试方法执行前就通过备份的全局和超全局变量进行了恢复当前修改的全局变量和超全局为已经备份的全局变量和超全局变量了。