这需要一些重构,但我建议从测试方法中去掉数据提供程序,而是在实际测试中对数据提供程序方法进行方法调用。
正如您已经从 PHPUnit 手册中了解到的:
所有数据提供程序都在调用 setUpBeforeClass 静态方法和第一次调用 setUp 方法之前执行。因此,您无法访问从数据提供程序中创建的任何变量。这是 PHPUnit 能够计算测试总数所必需的。
相反,您应该将这些数据提供者放入测试方法可以临时调用的哑类中。
所以而不是
/**
* @dataProvider additionProvider
*/
public function testAdd($a, $b, $expected)
{
$this->assertEquals($expected, $a + $b);
}
/**
* As you know this will be executed before any tests, as will all of them
*/
public function additionProvider()
{
return [
[0, 0, 0],
[0, 1, 1],
[1, 0, 1],
[1, 1, 3]
];
}
在扩展的测试基类中定义您的数据提供者PHPUnit\Framework\TestCase
,将它们组织成逻辑组,并从这些组中扩展您的测试类。
class SomeDataProviderClass extends TestCase
{
public function provideSomeData()
{
return [
[0, 0, 0],
[0, 1, 1],
[1, 0, 1],
[1, 1, 3]
];
}
}
class AnActualTest extends SomeDataProviderClass
{
public function testThatDependsOnSomeDataBeingProvided()
{
$data = $this->provideSomeData()
// Use the data and do your test
}
}
显然,考虑到您有多少测试,这并不理想,但与到处都有大量 @dataProvider 注释相比,这种方式组织得更好(大概是;因为您没有给出任何我无法告诉的代码)。所有数据提供者方法都将以逻辑方式组织并且更易于维护,当然这应该使测试运行得更快。
唯一可能的缺点是,如果您的数据提供程序从数据库等获取内容(同样,因为您没有发布代码,我不知道),因为多次调用相同的提供程序函数将每次都是数据库往返。但是,您可以轻松缓存此类方法调用的返回值。