参数化测试的数据提供器
使用 dataProvider,让同一个测试运行于多个输入之上。
参数化测试的数据提供器 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。
什么是数据提供程序?
数据提供程序是一个返回一组测试输入的方法。PHPUnit 会针对每个数据集调用一次测试方法,因此无需重复代码,就可以轻松测试多种输入组合。
基本数据提供程序
数据提供程序返回一个二维数组。每个子数组对应一次测试方法调用。
<?php
public static function additionProvider(): array
{
return [
"two positives" => [2, 3, 5],
"negative" => [-1, 1, 0],
"zeros" => [0, 0, 0],
];
}使用属性关联(PHPUnit 10+)
使用 #[DataProvider] 属性将测试与其数据提供程序关联起来。
<?php
use PHPUnit\Framework\Attributes\DataProvider;
#[DataProvider("additionProvider")]
public function test_add(int $a, int $b, int $expected): void
{
$this->assertSame($expected, (new Calculator())->add($a, $b));
}命名数据集
在数据提供程序数组中使用关联键,为每个数据集指定描述性名称——这些名称会显示在测试输出中。
<?php
public static function emailProvider(): array
{
return [
"valid email" => ["user@example.com", true],
"missing @" => ["userexample.com", false],
"missing domain" => ["user@", false],
"international" => ["用户@例子.com", true],
];
}返回生成器
数据提供程序可以返回 Generator,而不是数组,从而惰性生成数据集;这对于非常大的数据集很有用。
<?php
public static function largeProvider(): Generator
{
for ($i = 1; $i <= 1000; $i++) {
yield "case $i" => [$i, $i * 2];
}
}外部数据源
在数据提供程序方法中从 CSV、JSON 或数据库加载测试数据,以使用真实场景中的数据驱动测试。
<?php
public static function csvProvider(): array
{
$rows = array_map("str_getcsv", file("tests/fixtures/data.csv"));
return array_map(fn($r) => [$r[0], (int)$r[1], (int)$r[2]], $rows);
}多个数据提供程序
测试方法可以通过叠加多个属性来引用多个数据提供程序。
数据提供程序必须是静态的
数据提供程序方法必须声明为 static,因为 PHPUnit 会在实例化测试类之前调用它们。
测试边界情况
使用数据提供程序系统地覆盖以下情况:零、负数、空字符串、null、最大整数值——凡是可能出现边界情况并暴露错误的地方都应覆盖。
数据提供程序输出
失败信息会显示数据集名称:CalculatorTest::test_add with data set "negative" ([-1, 1, 0]),因此可以轻松定位失败的情况。
将数据提供程序与 setUp 结合使用
数据提供程序可以与 setUp 结合使用。setUp 会在每次迭代之前运行,为每个数据集提供一个全新的被测试对象。
性能注意事项
数据提供程序会在测试套件加载时运行。避免在数据提供程序中执行开销较大的操作(HTTP 调用、数据库查询),应优先使用工厂和固定装置。
总结
数据提供程序可以消除重复的测试代码。使用关联键生成描述性失败消息。将数据提供程序标记为 static,并使用 #[DataProvider] 属性将其关联起来。
快速检查
数据提供程序必须使用哪种可见性修饰符?
常见问题解答
「参数化测试的数据提供器」课时是免费的吗?
是的 — 「参数化测试的数据提供器」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。
「参数化测试的数据提供器」这节课中我会学到什么?
使用 dataProvider,让同一个测试运行于多个输入之上。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 PHP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「参数化测试的数据提供器」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 PHP Academy 课中编写并运行代码吗?
能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- PHPUnit 设置与第一个测试
- 断言与测试方法
- 参数化测试的数据提供器
- 使用 PHPUnit 模拟依赖