💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 数据供给器 测试方法可以接受任意参数。这些参数由数据供给器方法(在 [Example 2.5, “使用返回数组的数组的数据供给器”](# "Example 2.5. 使用返回数组的数组的数据供给器")中,是 `additionProvider()` 方法)提供。用 `@dataProvider` 标注来指定使用哪个数据供给器方法。 数据供给器方法必须声明为 `public`,其返回值要么是一个数组,其每个元素也是数组;要么是一个实现了 `Iterator` 接口的对象,在对它进行迭代时每步产生一个数组。每个数组都是测试数据集的一部分,将以它的内容作为参数来调用测试方法。 **Example 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 DataTest PHPUnit 5.0.0 by Sebastian Bergmann and contributors. ...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. ~~~ 当使用到大量数据集时,最好逐个用字符串键名对其命名,避免用默认的数字键名。这样输出信息会更加详细些,其中将包含打断测试的数据集所对应的名称。 **Example 2.6. 使用带有命名数据集的数据供给器** ~~~ <?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( 'adding zeros' => array(0, 0, 0), 'zero plus one' => array(0, 1, 1), 'one plus zero' => array(1, 0, 1), 'one plus one' => array(1, 1, 3) ); } } ?> ~~~ ~~~ phpunit DataTest PHPUnit 5.0.0 by Sebastian Bergmann and contributors. ...F Time: 0 seconds, Memory: 5.75Mb There was 1 failure: 1) DataTest::testAdd with data set "one plus one" (1, 1, 3) Failed asserting that 2 matches expected 3. /home/sb/DataTest.php:9 FAILURES! Tests: 4, Assertions: 4, Failures: 1. ~~~ **Example 2.7. 使用返回迭代器对象的数据供给器** ~~~ <?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 DataTest PHPUnit 5.0.0 by Sebastian Bergmann and contributors. ...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. ~~~ **Example 2.8. 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` 测试接收数据,那么来自于数据供给器的参数将先于来自所依赖的测试的。来自于所依赖的测试的参数对于每个数据集都是一样的。参见[Example 2.9, “在同一个测试中组合使用 @depends 和 @dataProvider”](# "Example 2.9. 在同一个测试中组合使用 @depends 和 @dataProvider") **Example 2.9. 在同一个测试中组合使用 @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 DependencyAndDataProviderComboTest PHPUnit 5.0.0 by Sebastian Bergmann and contributors. ...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. ~~~ >[info] ### Note > 如果一个测试依赖于另外一个使用了数据供给器的测试,仅当被依赖的测试至少能在一组数据上成功时,依赖于它的测试才会运行。使用了数据供给器的测试,其运行结果是无法注入到依赖于此测试的其他测试中的。 > > 所有的数据供给器方法的执行都是在对 `setUpBeforeClass` 静态方法的调用和第一次对 `setUp` 方法的调用之前完成的。因此,无法在数据供给器中使用创建于这两个方法内的变量。这是必须的,这样 PHPUnit 才能计算测试的总数量。