使用phpunit测试时可以执行单个实例吗?

时间:2019-05-15 19:14:19

标签: php unit-testing testing phpunit

可以创建单个对象实例并将其存储在私有静态属性中吗?

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

这里是一个例子:

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();
    }
}

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

1 个答案:

答案 0 :(得分:2)

通常这不是一个好习惯。您要避免的是单元测试由于通过其他测试而导致的状态错误地通过或失败。

考虑这个人为的例子:

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,则会失败。

单元测试最好应该单独设置其所需的所有状态,然后仅测试要测试的特定情况。

在测试案例中,您可能会将某些内容设置为共享资源,例如数据库连接,但是这些通常是外部的,而不是被测系统的一部分。