Test Dependencies
单元测试主要是为了帮助开发者确认和修复BUG,为了重构代码或作为单元测试的文档。为了达到这些目的,理想的单元测试应该覆盖程序中所有可能的路径。一个单元测试用例通常覆盖函数或方法中一个特定的路径。
然而一个测试方法不一定是独立包装的实体。通常它们与那些方法必然是依赖的,这隐藏在一个测试的执行场景中。
---Adrian Kuhn et. al.
PHPUnit支持测试方法间明确依赖的声名。这些依赖并不决定它们执行的顺序,而是允许返回对象由测试的“生产者”制造并传递给依赖的“消费者”。
*生产者是一个test method,它在测试中生产一个值并返回。
*消费者是一个test method,它依赖于一个或多个生产者的返回值。
下例说明了如何使用@depends来表示方法间的依赖
代码
<?php2
class StackTest extends PHPUnit_Framework_TestCase3
{4
public function testEmpty()5
{6
$stack = array();7
$this->assertTrue(empty($stack));8
9
return $stack;10
}11
12
/**13
* @depends testEmpty14
*/15
public function testPush(array $stack)16
{17
array_push($stack, 'foo');18
$this->assertEquals('foo', $stack[count($stack)-1]);19
$this->assertFalse(empty($stack));20
21
return $stack;22
}23
24
/**25
* @depends testPush26
*/27
public function testPop(array $stack)28
{29
$this->assertEquals('foo', array_pop($stack));30
$this->assertTrue(empty($stack));31
}32
}33
?>
在这个例子中,第一个test,testEmpty(),创建了一个新的数组并断言它是空,并且返回这个数组。
第二个test,testPush(),依赖于testEmpty()的返回值作为它的参数,同理testPop依赖testPush.
为了快速定位defect,我们需要把我们的注意力定位到最近失败的test上。所以PHPUnit在一个依赖测试失败时
就退出执行。通过搜索这些tests直接的依赖可以定位defect.
代码
<?php2
class DependencyFailureTest extends PHPUnit_Framework_TestCase3
{4
public function testOne()5
{6
$this->assertTrue(FALSE);7
}8
9
/**10
* @depends testOne11
*/12
public function testTwo()13
{14
}15
}16
?>
phpunit --verbose DependencyFailureTest
PHPUnit 3.4.2 by Sebastian Bergmann.
DependencyFailureTest
FS
Time: 0 seconds
There was 1 failure:
1) testOne(DependencyFailureTest)
Failed asserting that <boolean:false> is true.
/home/sb/DependencyFailureTest.php:6
There was 1 skipped test:
1) testTwo(DependencyFailureTest)
This test depends on "DependencyFailureTest::testOne" to pass.
FAILURES!
Tests: 2, Assertions: 1, Failures: 1, Skipped: 1.
上例中,testOne失败,因为testTwo声明了依赖testOne:@depends testOne.所以直接中止执行。
一个test可能有不止一个@depends声明。PHPUnit不改变tests执行的顺序,你必须自己确保该test依赖的tests在它之前。

浙公网安备 33010602011771号