awaken

博客园 首页 新随笔 联系 订阅 管理

Test Dependencies

单元测试主要是为了帮助开发者确认和修复BUG,为了重构代码或作为单元测试的文档。为了达到这些目的,
理想的单元测试应该覆盖程序中所有可能的路径。一个单元测试用例通常覆盖函数或方法中一个特定的路径。
然而一个测试方法不一定是独立包装的实体。通常它们与那些方法必然是依赖的,这隐藏在一个测试的执行场景中。

---Adrian Kuhn et. al.

 

 PHPUnit支持测试方法间明确依赖的声名。这些依赖并不决定它们执行的顺序,而是允许返回对象由测试的“生产者”制造并传递给依赖的“消费者”。
*生产者是一个test method,它在测试中生产一个值并返回。
*消费者是一个test method,它依赖于一个或多个生产者的返回值。
下例说明了如何使用@depends来表示方法间的依赖

代码
 1<?php
 2class StackTest extends PHPUnit_Framework_TestCase
 3{
 4    public function testEmpty()
 5    {
 6        $stack = array();
 7        $this->assertTrue(empty($stack));
 8 
 9        return $stack;
10    }
11 
12    /**
13     * @depends testEmpty
14     */
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 testPush
26     */
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.

代码
 1<?php
 2class DependencyFailureTest extends PHPUnit_Framework_TestCase
 3{
 4    public function testOne()
 5    {
 6        $this->assertTrue(FALSE);
 7    }
 8 
 9    /**
10     * @depends testOne
11     */
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在它之前。

posted on 2009-11-27 10:19  awaken  阅读(868)  评论(0)    收藏  举报