按特定顺序运行PHPUnit测试
有没有一种方法可以使测试在" 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')); ?>