gpt4 book ai didi

php - 用phpunit测试的时候做单例可以吗?

转载 作者:行者123 更新时间:2023-11-28 21:07:00 24 4
gpt4 key购买 nike

是否可以创建单个对象实例并将其存储在privatestatic 属性中?

我的意思是,大多数示例都会为每个测试创建一个实例。另一方面,这对我来说似乎是一种资源浪费。

这是一个例子:

use PHPUnit\Framework\TestCase;

class MyClassTest extends TestCase
{
private $obj;

public function testFoo()
{
$this->assertEquals($this->obj->foo(), 'something');
}


public function testBar()
{
$this->assertEquals($this->obj->bar(), 'something else');
}

public function __construct()
{
$this->obj = new MyClass();
}
}

这是否会被视为不良做法或导致任何意外行为(从测试的角度来看)?

最佳答案

通常这不是一个好的做法。您要避免的是单元测试由于从不同测试转移的状态而错误地通过或失败。

考虑这个人为的例子:

public function testSet()
{
$this->obj->setValue(4);
$this->assertEquals(4, $this->obj->getValue());
}

public function testAdd()
{
$this->obj->add(4);
$this->assertEquals(8, $this->obj->getValue());
}

无法保证 PHPUnit 会按特定顺序运行测试,因此如果它决定在 testSet 之前运行 testAdd,则会失败。

单元测试最好隔离设置它需要的所有状态,然后只测试被测试的特定情况。

有些东西您可以在测试用例中设置为共享资源,例如数据库连接,但这些通常是外部的,而不是被测系统的一部分。

关于php - 用phpunit测试的时候做单例可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56156217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com