编写 PHPUnit 测试--数据供给器

测试方法可以接受任意参数。这些参数由数据供给器方法(在例 2.5中,是 additionProvider() 方法)提供。用 @dataProvider 标注来指定使用哪个数据供给器方法。

数据供给器方法必须声明为 public,其返回值要么是一个数组,其每个元素也是数组;要么是一个实现了 Iterator 接口的对象,在对它进行迭代时每步产生一个数组。每个数组都是测试数据集的一部分,将以它的内容作为参数来调用测试方法。

例 2.5: 使用返回数组的数组的数据供给器

<?php
class DataTest extends PHPUnit_Framework_TestCase{
   /**
    * @dataProvider additionProvider
    */
   public function testAdd($a, $b, $expected)
   {
       $this->assertEquals($expected, $a + $b);
   }  
    public function additionProvider()
   {
       return array(          array(0, 0, 0),          array(0, 1, 1),          array(1, 0, 1),          array(1, 1, 3)
       );
   }
}?>
phpunit DataTestPHPUnit 4.2.0 by Sebastian Bergmann.
...F
Time: 0 seconds, Memory: 5.75Mb
There was 1 failure:
1) DataTest::testAdd with data set #3 (1, 1, 3)
Failed asserting that 2 matches expected 3.
/home/sb/DataTest.php:9
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.

例 2.6: 使用返回迭代器对象的数据供给器

<?php
require 'CsvFileIterator.php';class DataTest extends PHPUnit_Framework_TestCase{
   /**
    * @dataProvider additionProvider
    */
   public function testAdd($a, $b, $expected)
   {
       $this->assertEquals($expected, $a + $b);
   }    
   public function additionProvider()
   {
       return new CsvFileIterator('data.csv');
   }
}?>
phpunit DataTestPHPUnit 4.2.0 by Sebastian Bergmann.
...F
Time: 0 seconds, Memory: 5.75Mb
There was 1 failure:
1) DataTest::testAdd with data set #3 ('1', '1', '3')
Failed asserting that 2 matches expected '3'.
/home/sb/DataTest.php:11
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.

例 2.7: CsvFileIterator 类

<?php
class CsvFileIterator implements Iterator {
   protected $file;    
   protected $key = 0;    
   protected $current;  
    public function __construct($file) {
       $this->file = fopen($file, 'r');
   }  
    public function __destruct() {
       fclose($this->file);
   }  
    public function rewind() {
       rewind($this->file);        $this->current = fgetcsv($this->file);        $this->key = 0;
   }  
    public function valid() {
       return !feof($this->file);
   }  
    public function key() {
       return $this->key;
   }    
   public function current() {
       return $this->current;
   }    
   public function next() {
       $this->current = fgetcsv($this->file);        $this->key++;
   }
}?>

如果测试同时从 @dataProvider 方法和一个或多个 @depends 测试接收数据,那么来自于数据供给器的参数将先于来自所依赖的测试的。来自于所依赖的测试的参数对于每个数据集都是一样的。参见例 2.8

例 2.8: 在同一个测试中组合使用 @depends 和 @dataProvider

<?php
class DependencyAndDataProviderComboTest extends PHPUnit_Framework_TestCase{
   public function provider()
   {
       return array(array('provider1'), array('provider2'));
   }  
    public function testProducerFirst()
   {
       $this->assertTrue(true);        return 'first';
   }  
    public function testProducerSecond()
   {
       $this->assertTrue(true);        return 'second';
   }  
    /**
    * @depends testProducerFirst
    * @depends testProducerSecond
    * @dataProvider provider
    */
   public function testConsumer()
   {
       $this->assertEquals(            array('provider1', 'first', 'second'),
           func_get_args()
       );
   }
}?>
phpunit --verbose DependencyAndDataProviderComboTestPHPUnit 4.2.0 by Sebastian Bergmann.
...F
Time: 0 seconds, Memory: 3.50Mb
There was 1 failure:
1) DependencyAndDataProviderComboTest::testConsumer with data set #1 ('provider2')
Failed asserting that two arrays are equal.
--- Expected
+++ Actual
@@ @@
Array (
-    0 => 'provider1'
+    0 => 'provider2'
1 => 'first'
2 => 'second'
)
/home/sb/DependencyAndDataProviderComboTest.php:31
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.

注意

当一个测试依赖于另外一个使用了数据供给器的测试时,仅当被依赖的测试至少能在一组数据上成功时,依赖于它的测试才会运行。使用了数据供给器的测试,其运行结果是无法注入到依赖于此测试的其他测试中的。

注意

所有的数据供给器方法的执行都是在对 setUpBeforeClass 静态方法的调用和第一次对 setUp 方法的调用之前完成的。因此,无法在数据供给器中使用创建于这两个方法内的变量。这是必须的,这样 PHPUnit 才能计算测试的总数量。

本文节选自PHPUnit手册,查看完整手册地址 : 

http://phpunit.de/manual/current/zh_cn/installation.html


版权及转载说明

本站原创、转载文章欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区

本站转载文章版权归原作者所有,如发现本站文章涉嫌侵权请点击「联系我们」反馈,本站将立即给予删除

转载请注明:文章转载自:全分享社区 「http://www.aweb.cc

本文标题:编写 PHPUnit 测试--数据供给器

本文地址:http://www.aweb.cc/Article/detail/id/152.html

编写PHPUnit测试之基本操作与依赖关 <<上一篇 下一篇>>编写 PHPUnit 测试--异常测试与