Yii2和CodeCeption

CodeCeption是一个全栈的PHP测试框架,关于CodeCeption的介绍见:CodeCeption官方文档

Yii2官方增加了对CodeCeption的支持,这里主要讲解Yii2里如何基于CodeCeption进行单元测试和功能测试。

知识准备

执行后面操作的前提是本地已经正确安装配置composer。

通过脚手架开始一个Yii2项目

通过Composer,我们可以很简单的在本地基于脚手架创建一个Yii2项目:

  • 进入一个可以通过web服务器访问的目录:cd <webroot>
  • 执行:composer global require "fxp/composer-asset-plugin:~1.0.0" 命令验证必须插件是否全局安装
  • 执行:composer create-project yiisoft/yii2-app-basic basic 命令在当前目录的basic目录创建一个”yiisoft/yii2-app/basic”脚手架项目。注意,如果是本地开发环境,你也可以增加--prefer-dist --stability=dev选项,参考stability选项,这样,composer会到github上拉取最新的开发包下来。

通过以上操作,你的本地目录应该大致如下:

webroot/basic
|--- assets/
|--- commands/
|--- config/
|--- controllers/
|--- mail/
|--- models/
|--- runtime/
|--- tests/
|--- vendor/
|--- views/
|--- web/
|--- .gitignore
|--- composer.json
|--- composer.lock
...

其中,tests就是框架默认创建的测试代码目录,里面有框架提供的一些测试的例子,你可以按如下步骤测试一下:

  • cd basic/tests/ 进入CodeCeption测试用例所在目录
  • codecept build 将构建测试用例(根据cept生成tester)
  • codecept run 运行测试用例

如果你终端提示codecept命令未知,请执行以下命令安装codeception扩展:

composer global require "codeception/codeception=2.0.*"
composer global require "codeception/specify=*"
composer global require "codeception/verify=*"
composer require --dev yiisoft/yii2-faker:*

正常安装后,再执行codecept run时,如果看到类似如下的报错:

1) Failed to ensure that about works in [1mAboutCept[22m (D:\php\basic\tests\codeception\acceptance\AboutCept.php)
Can't be on page "/index-test.php?r=site%2Fabout":
GuzzleHttp\Exception\ConnectException: cURL error 7: Failed to connect to localhost port 8080: Connection refused

提示在xx端口连接拒绝,这里,我们需要修改一下配置文件:

  • 修改basic/tests/codeception.yml里面的config/test_entry_url配置,为你实际的项目入口地址
  • 修改basic/tests/codeception/acceptance.suite.yml里面的modules/config/PhpBrowser配置为你实际的地址

完成后,再执行codecept run,你应该可以看到终端没有报错了。

我们来看看tests目录的结构:

webroot/basic/tests
|--- codeception/
| |--- _output/
| |--- _pages/
| |--- acceptance/
| |--- bin/
| |--- config/
| |--- fixtures/
| |--- functional/
| |--- templates/
| |--- unit
| |--- _bootstrap.php
| |--- acceptance.suite.yml
| |--- functional.suite.yml
| |--- unit.suite.yml
|--- codeception.yml

其实,这里acceptance、functional、unit是Yii2默认为我们创建的三个suite,顾名思义,分别用于验收,功能,单元测试。

而执行codecept run时,会依次将codeception目录的所有suite运行,故,你可以通过codecept run suitename的方式制定执行某个suite;同理,可以执行codecept run suitename testname的方式执行某个test。

你可以仿照functional,unit,acceptance里面的例子写你自己的测试用例。

注:通过脚手架创建的Yii2项目会自动增加gitignore,将vendor中的内容从版本库中忽略,如果你需要提交,请手动修改gitignore文件。

从已有的Yii2项目开始CodeCeption

对于一个已有的Yii2项目,我们需要遵循如下几步来配置CodeCeption。

  • 在项目根目录执行composer init来初始化composer。
  • 执行如下指令确保codeception的扩展包已经全局安装
    • composer global require "codeception/codeception=2.0.*"
    • composer global require "codeception/specify=*"
    • composer global require "codeception/verify=*"
    • composer require --dev yiisoft/yii2-faker:*
  • 在项目合适的目录创建一个codeception目录作为codeception的测试代码目录
  • 进入codeception目录,执行codecept bootstrap来初始化生成测试代码脚手架。
  • 仿照yii2-app-basic,修改codeception.yml
  • 仿照yii2-app-basic,修改codeception/tests/_bootstrap.php文件
  • 仿照yii2-app-basic,修改codeception/tests/*.suite.yml
  • 增加一个codeception/tests/config目录,以存储配置文件。仿照yii2-app-basic的形式增加config.php,common.php

具体的配置内容依实际情况而定,具体可以参考yii2-app-basic提供的例子。

附:如何基于yii2-app-basic按照module来组织项目代码

前面所述,通过脚手架创建yii2-app-basic开发环境后,我们的代码目录结构为:

webroot/basic
|--- assets/
|--- commands/
|--- config/
|--- controllers/
|--- mail/
|--- models/
|--- runtime/
|--- tests/
|--- vendor/
|--- views/
|--- web/
|--- .gitignore
|--- composer.json
|--- composer.lock
...

这个结构是Yii2默认创建的目录,我们可以看到它并没有安装module进行划分。我们可以对其进行调整:

  • 新建一个modules目录,假设默认的module为demo
  • 在modules目录下面新建demo目录作为demo模块代码存放目录
  • 将上面的controllers,models,views三个目录移到demo目录下面
  • 在demo目录下新建一个Module.php,新建一个类继承自[[\yii\base\Module]],代码见后。
  • 在config目录下面增加一个modules.php,增加对demo目录的配置
  • 修改web.php,增加对modules.php的引用
  • 修改index.php,增加@modules的别名
  • 对应调整modules/demo/里面的namespace

按照以上步骤调整后的路径如下:

webroot/basic
|--- assets/
|--- commands/
|--- config/
|--- modules/
| |--- demo/
| | |--- controllers/
| | |--- views/
| | |--- models/
| |--- ...
|--- mail/
|--- runtime/
|--- tests/
|--- vendor/
|--- web/
|--- .gitignore
|--- composer.json
|--- composer.lock
...

各文件的内容如下:

basic/modules/demo/Module.php

<?php
/**
* Module.php
*
* @author fangliang
* @create_time 2015-06-16
*/ namespace modules\demo; class Module extends \yii\base\Module
{
public $layout = "main";
public $controllerNamespace = 'modules\demo\controllers'; public function init()
{
parent::init();
//do something init here
}
}

basic/web/index.php

<?php

// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev'); require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); $config = require(__DIR__ . '/../config/web.php'); Yii::setAlias("@modules",dirname(__DIR__) .'/modules' ); (new yii\web\Application($config))->run();

basic/config/web.php

<?php

$params = require(__DIR__ . '/params.php');

$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' => '0_wkmOLxql9rlIaqjYNPFL3pYDfLNuLk',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'modules\demo\models\User',
'enableAutoLogin' => true,
],
'errorHandler' => [
'errorAction' => 'demo/site/error',
],
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'db' => require(__DIR__ . '/db.php'),
],
'params' => $params,
'modules'=> require(__DIR__.'/modules.php'),
]; if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = 'yii\debug\Module'; $config['bootstrap'][] = 'gii';
$config['modules']['gii'] = 'yii\gii\Module';
} return $config;

basic/config/modules.php

<?php

return [
'demo' =>[
'class'=>'modules\demo\Module',
]
];

在完成以上的配置后,基本的配置就完成了。

如果是一个全新的项目,你可以直接fork我的这个脚手架:Yii2模块化Web应用脚手架

文章来源摘自:http://hustnaive.github.io/php/2015/06/16/work-with-yii-and-codeception.html

Yii2中如何使用CodeCeption的更多相关文章

  1. yii2中如何使用modal弹窗之基本使用

    作者:白狼 出处:http://www.manks.top/yii2_modal_baseuse.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, ...

  2. Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order      (id  order_name ...

  3. PHP在yii2中封装SuperSlide 幻灯片编写自己的SuperSlideWidget的例子

    因为近期给朋友公司做个门户网站,把荒置了6.7年的PHP又重新拾起,发现PHP这些年兴旺多了,很多新的东西看的不明不白,研究了几个框架ZendFramework.thinkphp.Symfony.yi ...

  4. [moka同学笔记]Yii2中多表关联查询(join、joinwith) (摘录)

    表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_name       cu ...

  5. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)(转)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  6. Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)

    我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_ ...

  7. yii2中的url美化

    在yii2中,如果想实现类似于post/1,post/update/1之类的效果,官方文档已经有明确的说明 但是如果想把所有的controller都实现,这里采用yii1的方法 'rules' =&g ...

  8. js生成的cookie在yii2中获取不到的解决办法

    在js中创建的cookie,默认用yii2中自带的方法Yii::$app->request->cookies->get('abc')获取不到,而用$_COOKIE['abc']又是能 ...

  9. 解决Yii2中刷新网页时验证码不刷新的问题

    解决Yii2中刷新网页时验证码不刷新的问题 [ 2.0 版本 ] ljfrocky  2015-05-30 19:39:00  1304次浏览 5条评论 10110 在Yii2框架中,如果在表单中使用 ...

随机推荐

  1. 示例:Netty 处理 TCP数据分包协议

    一个.Netty解决TCP协议的数据分包的想法 我们知道通过TCP协议发送接收数据时,假设数据过大.接收到的数据会是分包的.比方:                                   ...

  2. Eclipse+Maven创webapp工程

    1.开启eclipse,右键new-->other,例如以下图找到maven project. 选择maven project,点击next 2.选择maven project后.显示创建mav ...

  3. 减少iPhone手机系统版本号

    要减少移动版本号,本号,或者到"威风"站点或其他能够下载到iPhone固件的站点上下载固件,然后打开iTunes,进入到 然后按着(alt),同一时候用鼠标点击(更新button) ...

  4. C++在设计和使用智能指针

    为一个C++用户的.使用指针可以算的上是常态,但在使用过程中.多的时间,可能是由于new要么malloc对象,上次忘记的释放结束(我会犯这样一个错误).内存泄露. 而此时智能指针可能能够帮助我去解决问 ...

  5. svn常见错误汇总

    comment中的换行.把换行去掉就可以了

  6. Android定调的发展

    首先,介绍一下Android系统支持的铃声格式. 有下面几种: 64赫兹Midi,AAC.AAC+.AMR.WAV.MP3.Real Audio.WMA.OGG等格式. 将音频文件设置成铃声非常eas ...

  7. 百度地图 Android SDK - 个性化地图

    什么是百度个性化地图Android SDK? 百度个性化地图Android SDK是一套基于Android 2.2及以上版本号设备的应用程序接口,您能够通过该套接口实现主要的地图功能,而且能够定制地图 ...

  8. 在WIN7笔记本电脑系统的建立WIFI热点

        成功的关键是,你在运行秩序:       前置条件:右键"我的电脑"--"属性"--"设备管理器"--"网络适配器&quo ...

  9. 解决opengl计算顶点的法线问题

    因为需要的论文,最近开始学习OpenGL.由于刚入门的初学者有这么总会遇到很多问题,. 这些天,好不容易才OpenGL个问题弄明确了. 几点迷惑: 在网上百度.发现非常多求平面法向量的介绍以及程序.后 ...

  10. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...