codeception 简介
Codeception 的主要概念之一是将测试表示为一个人的行为。我们有一个 UnitTester,他执行函数并测试代码;有一个 FunctionalTester,一个合格的测试员,他测试整个应用程序,并了解其内部结构;还有一个ApiTester,他能够测试应用程序的接口,断言接口返回数据;最后,我们有一个 AcceptanceTester,一个通过我们提供的界面使用我们的应用程序的用户;
UnitTester 单元测试
Codeception 是在PHPUnit之上创建的。如果有使用 PHPUnit 编写单元测试的经验,则可以继续这样做。Codeception 执行标准的 PHPUnit 测试没有问题,但是,Codeception 本身构建了一些执行的动作作为unitTester 来反应测试角色,整个过程非常直观;比如继承了php unit 的assertEquals,同事又封装了see*,dontsee*,grab 等方法
public function testSavingUser(\UnitTester $I)
{
$user = new Users();
$user->setName('Miles');
$user->setSurname('Davis');
$user->save();
$I->assertEquals('Miles Davis', $user->getFullName());
$I->seeRecord('users', [
'name' => 'Miles',
'surname' => 'Davis'
]);
}
执行测试命令
$ php vendor/bin/codecept run unit --steps
控制台输出
UserTestCest: Test saving user
Signature: models\UserTestCest:testSavingUser
Test: tests/unit/models/UserTestCest.php:testSavingUser
Scenario --
I assert equals "Miles Davis","Miles Davis"
I see record "app\models\Users",{"name":"Miles","surname":"Davis"}
PASSED
FunctionalTester 功能测试
功能测试可以模拟返回 HTML 响应的 Web 请求(
G
E
T
和
_GET和
G
E
T
和
_POST变量)。在测试中,您可以对响应进行断言,并且可以检查数据是否成功存储在数据库中;
功能测试可以让我们的测试功能运行的更快,但是也能详细的展现出异常;
$I->amOnPage('/');
$I->click('Sign Up');
$I->submitForm('#signup', ['username' => 'MilesDavis', 'email' => 'miles@davis.com']);
$I->see('Thank you for Signing Up!');
$I->seeEmailSent('miles@davis.com', 'Thank you for registration');
$I->seeInDatabase('users', ['email' => 'miles@davis.com']);
以上是官网的demo, 不管是amOnPage 还是amOnPage 都是指向前端的页面,对于分离的项目可能就不是很合适了;
ApiTester 接口测试
相比于功能测试,接口测试可能更适合前后端分离的项目,ApiTester的提交不设计前段页面的表单,可以直接通过post,get方法发送接口请求
Codeception 允许SOAP 和 REST 两种标准测试 Web 服务。
REST Web 服务是通过 HTTP 使用标准方法访问的:GET、POST、PUT、DELETE。它们允许用户从服务接收和操作实体。
SOAP Web 服务通常更复杂。您将需要配置了 SOAP 支持的PHP 。还需要具备良好的 XML 知识。SOAP模块使用特殊格式的 POST 请求连接到 WSDL Web 服务
访问 WebService 需要一个 HTTP 客户端,因此要使用它,您需要设置模块PhpBrowser或yii,laravel等框架模块之一
通常都是设置框架模块
配置模块api.suite.yml:
actor: ApiTester
modules:
enabled:
- REST:
url: /api/
depends: Yii2
eg:登录验证并访问首页
private $bearer;
private $tester;
//前置操作 登录用户
public function _before(\ApiTester $I)
{
$I->sendPost('/rest/login', [
'username' => 'admin',
'password' => 'admin'
]);
$token = $I->grabDataFromResponseByJsonPath('$.data.token');
return 'Bearer ' . $token[0];
}
// tests
public function testIndex()
{
$this->tester->haveHttpHeader('Content-Type', 'application/json');
$this->tester->haveHttpHeader('Authorization', $this->bearer);
$this->tester->sendGet('/index/index');
$this->tester->seeResponseCodeIs(HttpCode::OK);
}
AcceptanceTester 验收测试
通过打开浏览器、访问站点、单击链接、填写表格以及实际查看网页上的内容。他们不需要知道编程语言、框架、数据库、网络服务器,或者应用程序为什么会(或没有)按预期运行;
配置模块acceptance.suite.yml:
# acceptance.suite.yml
actor: AcceptanceTester
modules:
enabled:
- PhpBrowser:
url: http://www.example.com/
- \Helper\Acceptance
总结
1.codeception 对于开发来说可能需要关注的是UnitTester,ApiTester.因为前后端分离是主流思想
2.codeception自带的模块确实省略像phpbrowser 的安装配置
3.codeception封装方法很拟人化,简单又方便,即BDD的通用语言是一种近乎自然语言的描述软件的形式
UnitTester | FunctionalTester | ApiTester | AcceptanceTester | |
---|---|---|---|---|
测试范围 | 单个 PHP 类 | PHP 框架(路由、控制器等) | 接口 | 浏览器中的页面(Chrome、Firefox 或PhpBrowser) |
测试计算机需要访问项目的 PHP 文件 | Y | Y | depends: PhpBrowser 不需要 | N |
需要网络服务器 | N | N | depends: PhpBrowser 需要 | Y |
JavaScript | N | N | N | Y |
需要额外的软件 | N | N | N | Selenium 用于浏览器测试 |
速度 | 快 | 快 | 相对快 | 慢 |
配置文件 | unit.suite.yml | functional.suite.yml | api.suite.yml | acceptance.suite.yml |