按特定顺序运行PHPUnit测试

时间:2020-03-05 18:39:27  来源:igfitidea点击:

有没有一种方法可以使测试在" TestCase"内部以特定顺序运行?例如,我想将一个对象的生命周期从创建到使用到销毁之间分开,但是我需要确保在运行其他测试之前首先设置该对象。

解决方案

回答

测试中可能存在设计问题。

通常,每个测试都不得依赖任何其他测试,因此它们可以按任何顺序运行。

每个测试都需要实例化并销毁它需要运行的所有内容,这将是一种完美的方法,我们永远不应在测试之间共享对象和状态。

我们能否更具体地说明为什么需要N个测试使用同一对象?

回答

如果测试需要按特定顺序运行,则确实存在问题。每个测试应该完全独立于其他测试:它可以进行缺陷定位,并让我们获得可重复(因此可调试)的结果。

在此站点上查看有关思想/信息的全部内容,以及有关如何以避免此类问题的方式来考虑测试的信息。

回答

如果我们想让测试共享各种辅助对象和设置,则可以使用setUp(),tearDown()来添加到sharedFixture属性中。

回答

PHPUnit通过@depends批注支持测试依赖项。

这是文档中的一个示例,其中将以满足依赖关系的顺序运行测试,每个依赖测试将参数传递给下一个:

class StackTest extends PHPUnit_Framework_TestCase
{
    public function testEmpty()
    {
        $stack = array();
        $this->assertEmpty($stack);

        return $stack;
    }

    /**
     * @depends testEmpty
     */
    public function testPush(array $stack)
    {
        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertNotEmpty($stack);

        return $stack;
    }

    /**
     * @depends testPush
     */
    public function testPop(array $stack)
    {
        $this->assertEquals('foo', array_pop($stack));
        $this->assertEmpty($stack);
    }
}

但是,请务必注意,将不会执行具有未解决依赖性的测试(这是所希望的,因为这会迅速引起失败测试的注意)。因此,在使用依赖项时必须密切注意。

回答

PHPUnit允许使用" @depends"注释,该注释指定相关的测试用例,并允许在相关的测试用例之间传递参数。

回答

我认为,在以下情况下,我需要测试特定资源的创建和销毁。

最初,我有两种方法。 testCreateResource和b。 testDestroyResource

一种。 testCreateResource

<?php
$app->createResource('resource');
$this->assertTrue($app->hasResource('resource'));
?>

b。 testDestroyResource

<?php
$app->destroyResource('resource');
$this->assertFalse($app->hasResource('resource'));
?>

我认为这是个坏主意,因为testDestroyResource依赖于testCreateResource。更好的做法是

一种。 testCreateResource

<?php
$app->createResource('resource');
$this->assertTrue($app->hasResource('resource'));
$app->deleteResource('resource');
?>

b。 testDestroyResource

<?php
$app->createResource('resource');
$app->destroyResource('resource');
$this->assertFalse($app->hasResource('resource'));
?>