前面有了解了数据供给器dataProvider以及普通的依赖depends。
那么如果这两种依赖的生产者都被依赖了会是怎样的呢?
DependencyAndDataProviderComboTest.php:
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;
final class DependencyAndDataProviderComboTest extends TestCase
{
public function provider(): array
{
return [['provider1'], ['provider2']];
}
public function testProducerFirst(): String
{
$this->assertTrue(true);
return 'first';
}
public function testProducerSecond(): String
{
$this->assertTrue(true);
return 'second';
}
/**
* @depends testProducerFirst
* @depends testProducerSecond
* @dataProvider provider
*/
public function testConsumer(): void
{
var_dump(func_get_args());
echo "--------------华丽的分割线----------\r\n";
$this->assertSame(
['provider1', 'first', 'second'],
func_get_args()
);
}
}
运行结果如:
C:\Users\Administrator>D:\phpstudy_pro\Extensions\php\php7.3.4nts\php.exe D:\phpstudy_pro\Extensions\php\php7.3.4nts\phpunit-9.5.8.phar C:\Users\Administrator\PhpstormProjects\untitled\DependencyAndDataProviderComboTest.php
PHPUnit 9.5.8 by Sebastian Bergmann and contributors.
...C:\Users\Administrator\PhpstormProjects\untitled\DependencyAndDataProviderComboTest.php:32:
array(3) {
[0] =>
string(9) "provider1"
[1] =>
string(5) "first"
[2] =>
string(6) "second"
}
--------------华丽的分割线----------
F 4 / 4 (100%)C:\Users\Administrator\PhpstormProjects\untitled\DependencyAndDataProviderComboTest.php:32:
array(3) {
[0] =>
string(9) "provider2"
[1] =>
string(5) "first"
[2] =>
string(6) "second"
}
--------------华丽的分割线----------
Time: 00:00.006, Memory: 20.00 MB
There was 1 failure:
1) DependencyAndDataProviderComboTest::testConsumer with data set #1 ('provider2')
Failed asserting that two arrays are identical.
--- Expected
+++ Actual
@@ @@
Array &0 (
- 0 => 'provider1'
+ 0 => 'provider2'
1 => 'first'
2 => 'second'
)
C:\Users\Administrator\PhpstormProjects\untitled\DependencyAndDataProviderComboTest.php:36
FAILURES!
Tests: 4, Assertions: 4, Failures: 1.
从执行结果可以看到testConsumer方法被执行了多次。并且每次func_get_args获取的参数列表只有第一个参数不同,另外两个参数相同呢?
事情是这样的,当dataProvider与depends共存时候,dataProvider优先,depends次之。
那么运行流程是这样的:
遍历dataProvider由于这里dataProvider有两条数据,所以testConsumer执行了两次。
第一轮:
第一次执行的时候传递的是dataProvider中的provider1这个值做为testConsumer接收的第一个参数,然后次优先级的depends的testProducerFirst返回值就做为testConsumer的第二个接收参数了,然后接下来就是depends的testProducerSecond返回值做为testConsumer的第三个接收参数了。
第二轮:
第一次执行的时候传递的是dataProvider中的provider2这个值做为testConsumer接收的第一个参数,然后次优先级的depends的testProducerFirst返回值就做为testConsumer的第二个接收参数了, 然后接下来就是depends的testProducerSecond返回值做为testConsumer的第三个接收参数了。
那么如果数据供给器还有更多数据,则以此类推。
那么这里有个问,为什么每次数据供给器之后的depends执行时候就先执行testProducerFirst后执行testProducerSecond,这两个的顺序除了只是字面上直译的顺序外还有什么其它因素吗?
这个原因正好就是:
这里最后的那个疑问,当时没有搞明白,其实的确就是语法顺序,只是这里语法顺序官方说的太简单,很容易让人误解成depends指定的方法所定义于代码中的语法顺序,而实则是引用depends时候的语法顺序,也就是:
/**
* @depends testProducerSecond
* @depends testProducerFirst
* @dataProvider provider
*/
public function testConsumer(): void
{
var_dump(func_get_args());
echo "--------------华丽的分割线----------\r\n";
$this->assertSame(
['provider1', 'first', 'second'],
func_get_args()
);
}
像是这样则就是testProducerSecond优先于testProducerFirst了。
运行效果如:
C:\Users\Administrator>D:\phpstudy_pro\Extensions\php\php7.3.4nts\php.exe D:\phpstudy_pro\Extensions\php\php7.3.4nts\phpunit-9.5.8.phar C:\Users\Administrator\PhpstormProjects\untitled\DependencyAndDataProviderComboTest.php
PHPUnit 9.5.8 by Sebastian Bergmann and contributors.
..FC:\Users\Administrator\PhpstormProjects\untitled\DependencyAndDataProviderComboTest.php:32:
array(3) {
[0] =>
string(9) "provider1"
[1] =>
string(6) "second"
[2] =>
string(5) "first"
}
--------------华丽的分割线----------
F 4 / 4 (100%)C:\Users\Administrator\PhpstormProjects\untitled\DependencyAndDataProviderComboTest.php:32:
array(3) {
[0] =>
string(9) "provider2"
[1] =>
string(6) "second"
[2] =>
string(5) "first"
}
--------------华丽的分割线----------
Time: 00:00.005, Memory: 20.00 MB
There were 2 failures:
1) DependencyAndDataProviderComboTest::testConsumer with data set #0 ('provider1')
Failed asserting that two arrays are identical.
--- Expected
+++ Actual
@@ @@
Array &0 (
0 => 'provider1'
- 1 => 'first'
- 2 => 'second'
+ 1 => 'second'
+ 2 => 'first'
)
C:\Users\Administrator\PhpstormProjects\untitled\DependencyAndDataProviderComboTest.php:36
2) DependencyAndDataProviderComboTest::testConsumer with data set #1 ('provider2')
Failed asserting that two arrays are identical.
--- Expected
+++ Actual
@@ @@
Array &0 (
- 0 => 'provider1'
- 1 => 'first'
- 2 => 'second'
+ 0 => 'provider2'
+ 1 => 'second'
+ 2 => 'first'
)
C:\Users\Administrator\PhpstormProjects\untitled\DependencyAndDataProviderComboTest.php:36
FAILURES!
Tests: 4, Assertions: 4, Failures: 2.
这里就为官方正了“PHPUnit 不会更改测试的运行顺序,因此你需要自行保证某个测试所依赖的所有测试均出现于这个测试之前。”