通过扩展和定制 phpunit 框架,可解决原有框架无法满足需求的问题。扩展方面,包括自定义断言、matcher 和 dataprovider;定制方面,涉及创建自定义运行器、覆盖 bootstrapper。实际应用中,扩展断言可验证特殊字符,自定义 matcher 可验证列表元素,而覆盖 bootstrapper 则可增加执行超时限制。
PHP 单元测试框架的扩展与定制
单元测试能显著提高代码质量,但原生框架可能无法满足所有需求。扩展和定制框架可解决此问题。
扩展方法
1. 自定义断言
PHPUnit 提供断言方法,但有时需要自定义断言。使用 Assert
类创建新的断言方法:
class CustomAssertions extends PHPUnit_Framework_Assert
{
public static function assertTrueWithMessage($condition, string $message) {
self::assertTrue($condition, $message);
}
}
2. 自定义 Matcher
Matcher 验证值是否符合特定条件。使用 prophesize
库创建自定义 Matcher:
class CustomMatcher
{
public function isEven($value)
{
return $value % 2 == 0;
}
}
$propecy = $prophesize(new CustomMatcher());
$propecy->isEven(6)->shouldBeTrue();
3. 实现 DataProvider
DataProvider 为测试数据提供自定义来源。使用 PHPUnit_Extensions_DataProvider_ArrayDataProvider
创建自定义 DataProvider:
class CustomDataProvider
{
public static function provideData()
{
return [
['foo', 'bar'],
['baz', 'qux']
];
}
}
$dataProvider = new PHPUnit_Extensions_DataProvider_ArrayDataProvider(CustomDataProvider::provideData());
定制框架
1. 创建自定义运行器
运行器负责执行测试。使用 PHPUnit_Framework_TestSuite_DataProvider
创建自定义运行器:
class CustomTestRunner extends PHPUnit_Framework_TestSuite_DataProvider
{
protected function setUp(): void
{
// 自定义设置
}
protected function tearDown(): void
{
// 自定义清理
}
}
2. 覆盖 Bootstrapper
Bootstrapper 在测试运行之前设置测试运行环境。使用 PHPUnit_Util_Configuration
覆盖 Bootstrapper:
class CustomBootstrapper
{
public static function bootstrap()
{
// 自定义引导
PHPUnit_Util_Configuration::$defaultEnforceTimeLimit = 300;
}
}
PHPUnit_Util_Configuration::$bootstrap = 'CustomBootstrapper::bootstrap';
实战案例
扩展断言:验证特殊字符的存在:
CustomAssertions::assertTrueWithMessage(
strpos($string, "\t") !== false,
"String does not contain a tab character"
);
自定义 Matcher:验证列表包含元素:
$prophesize(new CustomMatcher())->contains(['foo', 'bar'])->shouldBeTrue();
覆盖 Bootstrapper:将执行超时限制增加到 300 秒:
CustomBootstrapper::bootstrap();
以上就是PHP 单元测试框架的扩展与定制的详细内容,更多请关注编程网其它相关文章!