[PHPUnit] 我尝试使用 DataProvider!

您好!
我是系统开发部的福井!

这次,我尝试使用名为 DataProvider 的注解(一种便捷的机制),它可以与 PHPUnit 配合使用。因此,我将介绍它的使用方法,以及我使用它的背景和缘由!
*本文不会解释注解本身(什么是注解)。

什么是数据提供者?

概述

简而言之,一种便捷的机制,允许您在 PHPUnit 测试方法中使用多个任意参数
*有关更详细的解释和注释,请参阅 PHPUnit 官方文档。

■ PHPUnit 官方文档
https://phpunit.de/documentation.html

■ 关于 DataProvider(注解)
https://docs.phpunit.de/en/11.0/annotations.html#dataprovider

何时使用

如上所述,您可以向测试方法传递多个参数,
在您想要为同一个测试方法使用多个不同的值时非常有用


具体来说,例如,假设有一个用户信息参数检查过程,并且“需要登录 ID”。

・空字符串和空值字符串将被视为异常而被拒绝
・响应参数相同(导致相同的错误响应)

本例中的
测试用例有所不同,但测试所需的区别在于
登录 ID 是“null”还是“空字符串”。我认为这在实现此类测试时会很有用。

由于仅凭文字很难理解,我将在下面尝试编写一些实际的测试代码。

如何使用

试着自己写一下。

目前,我使用 DataProvider 编写了一个简单的测试代码。

我想看看能否从测试方法的参数中获取 DataProvider 中设置的多个值(在本例中为空字符串和 null),以及测试是否至少能够通过。

namespace Tests\Feature; use Tests\TestCase; use Illuminate\Testing\Assert; class DataProviderSampleTest extends TestCase { /** * 异常情况:测试未指定登录 ID 的情况 * @param string $invalidLoginId * @dataProvider invalidLoginIds */ public function testInvalidLoginId($invalidLoginId): void { Assert::assertEmpty($invalidLoginId); } /** * 异常登录 ID 测试数据 * * @return array */ public static function invalidLoginIds(): array { return [ [''], [null], ];

实施要点如下:

  1. 您可以通过在测试方法上添加 @dataProvider 注解,将 invalidLoginIds() 用作数据提供程序。
  2. 虽然 invalidLoginIds() 返回一个数组,但数组中的元素也必须描述为一个数组(例如 [''] 和 [null])。
  3. testInvalidLoginId() 的参数是 $invalidLoginId,但您可以选择任何您喜欢的值(这并非指单数)。

查看测试结果

我确认测试已成功通过。

此外,当我们实际设置任意值“Beyond Inc.”并使用调试函数(dd())时,我们能够确认预期的字符串存储在 $invalidLoginId 中。

更多实际用途

到目前为止,我们已经使用 DataProvider 编写了最基本的测试代码。
但是,上述代码不够便捷,因此我们还将介绍一种更实际的用法。

以下是修改后的代码:

namespace Tests\Feature; use Tests\TestCase; use Illuminate\Testing\Assert; class DataProviderSampleTest extends TestCase { /** * 登录 ID 字符串验证测试 * @param string $loginId 登录 ID 字符串 * @param bool $isEmpty empty() 的预期值 * @dataProvider loginIds */ public function testLoginId($loginId, $isEmpty): void { Assert::assertSame($isEmpty, empty($loginId)); } /** * 登录 ID 字符串测试数据 * * @return array */ public static function loginIds(): array { return [ 'null 应该为空' => [null, true], '空字符串应该为空' => ['', true], 'testLoginId 不应该为空' => ['testLoginId', false], ]; }

主要变化如下:

  1. 为测试数据的每个元素指定一个键。(将测试用例或值指定为键可以更方便地查看执行结果。我们稍后会附上执行结果。)
  2. 在数组中指定多个元素(在上面的示例中,指定了登录 ID 字符串和断言执行时的预期值(布尔值))。
  3. 接受数据提供者指定的多个值作为测试方法的参数。

再次检查执行结果

让我们再次检查测试执行结果。

测试成功通过。
如前所述,通过指定键,现在可以更轻松地查看哪些测试通过了
此外,通过传递布尔值作为预期值,变得更加灵活,能够同时涵盖正常和异常情况

个人印象

坦白说,我认为这对编写 DRY(Don't Repeat Yourself,不要重复自己)代码来说是一个很有用的特性。
我认为它是编写更简洁、更小的测试代码的好方法,所以我希望在未来的实现中使用它。

另外,稍微跑题一下,我这次开始研究 DataProvider 的原因
是,我在另一个语言框架中遇到了一个问题:我需要“只修改测试中使用的值并运行一个循环”,这让我想到:“PHPUnit 肯定也有类似的功能吧……!” 这也让我
再次意识到,拓展跨语言和框架的实现方法是多么重要。
还有一些注解我还没用过,所以我会继续探索它们。

今天的文章就到这里啦!
感谢您阅读到最后!
下次再见!

用于网站系统/应用程序开发
(服务页面在此)

如果您觉得这篇文章有用,请点击【点赞】!
4
加载中...
4票,平均分:1.00/14
3,197
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

福井宏人

他于2020年6月加入Beyond,在系统开发部(横滨办公室)工作。他
的工作主要使用PHP,负责开发游戏API和Web系统,以及开发私有的Shopify应用。
他热爱音乐,尤其喜欢西方音乐,业余爱好是弹吉他。他最喜欢的电视剧是《侦探!夜探》和《广告街天堂》。