卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章52750本站已运行3120

PHP 单元测试框架的扩展与定制

通过扩展和定制 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:

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();
卓越飞翔博客
上一篇: js中for in的用法
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏