Yii2项目中用Pest替代PHPUnit可提升测试简洁性与可读性,通过函数式风格、语法糖、生命周期钩子、Yii2集成及场景化组织实现高效测试。

Yii2 项目中用 Pest 替代 PHPUnit,能让测试代码更简洁、可读性更强、写起来更顺手。核心不是换工具,而是利用 Pest 的函数式风格和语法糖,减少样板代码,聚焦业务逻辑验证。
用 test() 替代 public function testXXX()
Pest 把每个测试用例变成一个独立的函数调用,不用再写类、方法名、$this->assertEquals() 等冗余结构。
对比:
- PHPUnit 写法(需继承 TestCase,方法命名受限,断言带 $this):
<?php
class UserTest extends \Codeception\Test\Unit
{
public function testUserCanLoginWithValidCredentials()
{
$user = new User(['email' => 'a@b.c', 'password' => '123']);
$this->assertTrue($user->validate());
}
} - Pest 写法(纯函数 + 描述性字符串 + 直接断言):
<?php
use App\Models\User;
test('user can login with valid credentials', function () {
$user = new User(['email' => 'a@b.c', 'password' => '123']);
expect($user->validate())->toBeTrue();
});
共享状态用 beforeEach() 和 uses()
Yii2 测试常要初始化应用、数据库连接或 mock 组件。Pest 提供轻量级生命周期钩子,比 PHPUnit 的 setUp() 更直观。
-
beforeEach():每次测试前执行,适合重置 DB、清缓存、重建测试用户 -
uses():批量复用 setup 逻辑,比如所有控制器测试都注入 Yii::$app
示例:
Yii::$app->user->login(User::find()->where(['id' => 1])->one());
});
test('returns 200 when accessing profile page')
->get('/profile')
->assertStatus(200);
Yii2 特有集成:轻松测路由、行为、验证规则
Pest 不是黑盒,它完全兼容 Yii2 的测试辅助类(如 TestCase、ActiveFixture),还能封装常用断言。
- 测路由:用
$this->get()/$this->post()(继承yii\codeception\TestCase后直接可用) - 测模型验证:结合
expect()+toBeValid()自定义扩展 - 测行为(Behavior):构造模型后 attach 行为,再验证其方法是否生效
小技巧:在 _bootstrap.php 中注册 Pest 辅助函数,比如:
expect($model->hasErrors())->toBeFalse();
}
// 使用:
test('user model validates email format')->expect(fn() => new User(['email' => 'invalid']))->toBeInvalid();
组织结构:按场景分组,不按类拆文件
放弃“一个 Model 对应一个 Test 文件”的机械映射。Pest 推荐按功能场景组织,比如:
-
auth/registration.php:覆盖注册流程所有分支(空字段、重复邮箱、密码强度等) -
api/v1/posts.php:包含权限、分页、搜索、软删除等 API 行为 -
console/export-command.php:专注命令行交互与输出格式
这样测试意图一目了然,改需求时也更容易定位相关用例,避免散落在十几个文件里找断言。


















