PHPUnit测试类不同方法调用时类属性值被清空为null如何解决?
问题原因
这不是PHP语言本身的特性,是PHPUnit的内置隔离设计:每个测试方法执行前,框架都会全新实例化一次测试类,保证每个测试用例的独立性,避免不同测试方法互相干扰。所以你在方法a中给实例属性赋值,运行方法b时用的已经是另一个全新的类实例,自然拿不到之前存储的值。
可行解决方案
方案1:使用静态类属性存储共享值
静态属性属于类本身,不属于单个实例,所有测试类实例都可以访问到同一个值,改动最小:
class testing extends TestCase { // 将实例属性改为静态类属性 private static $listId; public function a(){ self::$listId = "some value"; print(self::$listId); // 输出 some value } public function b(){ print(self::$listId); // 输出 some value print(gettype(self::$listId)); // 输出 string } }
注意:需要保证测试方法的执行顺序符合预期,可以配合@depends注解显式声明方法依赖,避免b方法早于a执行拿不到值
方案2:用@depends注解声明测试依赖传递参数
符合PHPUnit的最佳实践,显式声明依赖关系,框架会自动保证前置方法先执行,并且把前置方法的返回值传递给依赖方法,不需要你手动改调用逻辑:
class testing extends TestCase { public function a(){ $listId = "some value"; print($listId); return $listId; } /** * @depends a */ public function b($listId){ print($listId); // 直接拿到a方法返回的listId print(gettype($listId)); } }
方案3:公共固定值放到setUp()方法初始化
如果这个值不需要在某个测试方法里动态生成,是全局通用的固定值,直接重写TestCase的setUp()方法即可,这个方法会在每个测试方法运行前自动执行:
class testing extends TestCase { private $listId; protected function setUp(): void { parent::setUp(); // 在这里统一初始化公共属性 $this->listId = "some value"; } public function a(){ print($this->listId); // 直接读取到初始化后的值 } public function b(){ print($this->listId); // 直接读取到初始化后的值 } }
内容的提问来源于stack exchange,提问作者Umar Sheikh Salem
相关产品推荐
相关产品推荐

