[PHPUnit] 我尝试使用 DataProvider!
你好!
我是系统开发部的福井!
这次,我尝试使用一个名为DataProvider的注解(一个有用的机制),可以与PHPUnit一起使用,所以我想介绍一下如何使用它以及导致它使用的背景和背景!
*本文中,我们将省略对注解本身的解释(什么是注解)。
什么是数据提供者?
概述
简而言之,一种方便的机制,允许您在 PHPUnit 测试方法中使用多个任意参数。
*如果您想要更详细的解释或者注解的解释,请参考PHPUnit官方文档。
■ PHPUnit 官方文档
https://phpunit.de/documentation.html
■ 关于DataProvider(注释)
https://docs.phpunit.de/en/11.0/annotations.html#dataprovider
何时使用
如上所述,您可以将多个参数传递给一个测试方法,
当您想对同一个测试方法使用多个不同的值时,这非常有用。
具体来说,假设有一个过程检查用户信息的参数,并且“需要登录ID”。
此时
・Null 和空字符串被视为异常
・响应参数相同(相同的错误响应)
这种情况下,
严格来说,测试用例是分开的,但测试所需的区别在于
登录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 [ [ ''], [无效的], ]; } }
实施要点如下。
- 您可以通过在测试方法中添加 @dataProvider 注释来使用 invalidLoginIds() 作为 DataProvider。
- invalidLoginIds() 返回一个数组,但数组中的元素也必须写为数组(如 [''] 和 [null])
- 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 的期望值() * @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], ];
主要变化如下。
- 为测试数据的每个元素指定一个key(为key指定一个测试用例或一个值可以更容易看到执行结果。稍后我会附上执行结果。)
- 指定数组中的多个元素(上面的示例指定了登录ID字符串和执行断言时的期望值(bool)。)
- 在测试方法参数中接收数据提供者指定的多个值
再次查看执行结果
再次检查测试执行结果。
测试顺利通过。
我之前介绍的我认为可以
更容易地理解哪些测试通过了此外,通过传递 bool 作为期望值,具有高度通用性,包括正常和异常系统
个人印象
坦率地说,我认为这是编写 DRY 代码的一个有用功能。
我觉得这是一种更简单、少量地编写测试代码的好方法,所以我想在以后的实现中使用它。
另外,有点题外话,但这次我研究 DataProvider 的原因
是当我想通过仅更改另一种语言的框架中用于测试的值来运行循环时,我想,``然后,PHPUnit也有类似的功能吧?''...!有一个背景让我产生了这个想法。
这是一个很好的机会,可以重申增加超越语言和框架的实现方法和工具的数量是极其有益的。
还有其他的注解我还没有接触过,所以我会继续尝试一下。
这就是本文的全部内容!
感谢您阅读到最后!
再见!