通过扩展和定制 phpunit 框架,可解决原有框架无法满足需求的问题。扩展方面,包括自定义断言、matcher 和 dataprovider;定制方面,涉及创建自定义运行器、覆盖 bootstrapper。实际应用中,扩展断言可验证特殊字符,自定义 matcher 可验证列表元素,而覆盖 bootstrapper 则可增加执行超时限制。

PHP 单元测试框架的扩展与定制
单元测试能显著提高代码质量,但原生框架可能无法满足所有需求。扩展和定制框架可解决此问题。
扩展方法
立即学习“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:
BEESSHOW小程序商品展示预约,PHP+MYSQL,Yii2框架。原生微信小程序,电脑端,手机端,管理后台使用VUE element-ui。 一键引导安装,支持虚拟主机、服务器、本地测试。内置演示数据。 主要功能: 商品或服务功能 会员功能 预约订单功能 可以自定义小程序模板,自定义不同的模板页面 适合个人、商家、企业,提供商品展示和服务类微信
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();










