Codeception 是一款现代、功能强大的 PHP 测试框架。
它以简洁、易读的方式帮助开发者编写单元测试(Unit)、功能测试(Functional) 和 验收测试(Acceptance)。其核心设计理念是让测试变得有趣且富有表达力,让你能以接近自然语言的方式描述测试场景,从而轻松覆盖应用的各个层面。
无论你是使用 Laravel、Symfony、Yii、WordPress 还是其他框架,Codeception 都能提供统一、连贯的测试体验。
Codeception 最强大的特性之一,就是可以同时管理三种不同粒度的测试:
测试类型 | 测试范围 | 是否需要访问项目 PHP 文件 | 是否需要 Web 服务器 | 是否支持 JavaScript | 执行速度 | 典型配置文件 |
|---|---|---|---|---|---|---|
单元测试 | 单个类或方法 | 是 | 否 | 否 | 极快 | Unit.suite.yml |
功能测试 | 应用内部逻辑(路由、数据库等) | 是 | 否 | 否 | 较快 | Functional.suite.yml |
验收测试 | 用户真实浏览器行为 | 否 | 是 | 是 | 较慢 | Acceptance.suite.yml |
从真实用户视角出发,在浏览器中模拟操作,验证整个页面流程是否正确。即使你的项目使用的是小众 CMS 或传统 PHP 系统,也能轻松覆盖。
示例代码:
public function trySignup(AcceptanceTester $I): void
{
$I->amOnPage('/');
$I->click('注册');
$I->submitForm('#signup', [
'username' => 'Tinywan',
'email' => 'tinywan@example.com'
]);
$I->see('注册成功,欢迎加入!');
}
无需启动真实浏览器和 Web 服务器,直接在 PHP 层面模拟 HTTP 请求。可以快速验证路由、表单处理、数据库操作等,同时获得详细的错误信息和更快的执行速度。
示例代码:
public function trySignup(FunctionalTester $I): void
{
$I->amOnPage('/');
$I->submitForm('#signup', [
'username' => 'Tinywan',
'email' => 'tinywan@example.com'
]);
$I->see('注册成功,欢迎加入!');
$I->seeInDatabase('users', ['email' => 'tinywan@example.com']);
}
专注于测试单个类或方法的内部逻辑。Codeception 基于 PHPUnit 构建,同时提供了更多人性化的辅助工具,让单元测试编写更加简洁清晰。
composer require "codeception/codeception" --dev
安装 Codeception 后,在项目根目录执行以下命令初始化:
php vendor/bin/codecept bootstrap
该命令会自动生成以下结构:
tests/ 目录下包含 Unit、Functional、Acceptance 三个测试套件.suite.yml 配置文件codeception.yml 全局配置文件Codeception 的方法命名非常直观,分为三类:
amOnPage()、click()、fillField()、submitForm() 等see()、seeElement()、dontSee() 等grabTextFrom()、grabAttributeFrom() 等,返回值供后续使用Codeception 将测试抽象为“某个人”的行为:
AcceptanceTester —— 真实用户FunctionalTester —— 了解应用内部的测试者UnitTester —— 开发者这些 Actor 类的方法来自启用的模块,定义在各自的 suite 配置文件中。修改配置后,运行以下命令重建 Actor 类:
php vendor/bin/codecept build
使用命令快速生成测试文件:
php vendor/bin/codecept generate:cest Acceptance Login
生成后的示例(推荐使用 final class):
<?php
namespace Tests\Acceptance;
use Tests\Support\AcceptanceTester;
finalclass LoginCest
{
publicfunction loginSuccessfully(AcceptanceTester $I): void
{
$I->amOnPage('/login');
$I->fillField('邮箱', 'tinywan@example.com');
$I->fillField('密码', 'secret123');
$I->click('登录');
$I->see('欢迎回来,Tinywan!');
}
}
在 tests/Acceptance.suite.yml 中配置网站地址:
actor: AcceptanceTester
modules:
enabled:
- PhpBrowser:
url: 'http://localhost:8000'
运行所有测试:
php vendor/bin/codecept run
运行指定套件并显示详细步骤:
php vendor/bin/codecept run Acceptance --steps
生成报告:
php vendor/bin/codecept run --html --xml
报告文件会保存在 tests/_output/ 目录中。
generate:cest —— 生成 Cest 测试generate:feature —— 生成 Gherkin(BDD)文件generate:pageobject —— 生成 Page Objectgenerate:stepobject —— 生成 Step Objectgenerate:helper —— 生成自定义 Helper