PHPUnit 在测试类上存储属性

2022-08-31 00:41:33

我是PHPUnit的初学者。

这是我创建的示例测试类:

class NewTest extends PHPUnit_Framework_TestCase
{
    protected $foo;

    function testFirst ()
    {
        $this->foo = true;
        $this->assertTrue($this->foo);
    }

    /**
     * @depends testFirst
     */
    function testSecond ()
    {
        $this->assertTrue($this->foo);
    }
}

当 testSecond 执行时,它会引发一个错误,指出 “”。Undefined property NewTest::$foo

为什么会发生这种情况?PHPUnit 是否在每次执行测试后清除新属性?有没有办法在测试中设置属性,以便在同一测试类的其他测试中可以访问它?


答案 1

您正在方法中设置 foo 属性。PHPUnit 将在测试之间重置环境/为每个测试方法创建一个新的“NewTest”实例(如果它们没有@depends注释),因此,如果要设置为,则必须在依赖测试中重新创建该状态或使用该方法。testFirst()footruesetup()

使用(文档):setup()

class NewTest extends PHPUnit_Framework_TestCase
{
    protected $foo;
    protected function setup()
    {
        $this->foo = TRUE;
    }
    function testFirst ()
    {
        $this->assertTrue($this->foo);
    }
    /**
     * @depends testFirst
     */
    function testSecond ()
    {
        $this->assertTrue($this->foo);
    }
}

使用(文档):@depends

class NewTest extends PHPUnit_Framework_TestCase
{
    protected $foo;
    function testFirst ()
    {
        $this->foo = TRUE;
        $this->assertTrue($this->foo);
        return $this->foo;
    }
    /**
     * @depends testFirst
     */
    function testSecond($foo)
    {
        $this->foo = $foo;
        $this->assertTrue($this->foo);
    }
}

以上所有内容都应通过。

编辑必须删除@backupGlobals解决方案。这显然是错误的。


答案 2

通常,您希望避免一个测试影响另一个测试。这确保了测试是干净的并且始终有效,而不是在 test1 创建的某些边缘情况下。


推荐