自动化测试开发 - 引入Yii2 ¶
作者:KK
发表日期:2016.11.20
在Yii项目里创建了tests目录并初始化了Codeception的测试项目,这时候这个tests还是一个很独立的项目,跟你的Yii项目没有一毛钱关系,接下来我们让它们拉上关系
创建测试用例 ¶
我们先定一个小目标吧:测试yii\validators\UrlValidator
这个类是否能正常工作,运行以下命令创建Url的单元测试用例:
%codecept% generate:test unit Url
然后再修改codeception\unit目录下的UrlTest
这个类(就是测试用例)
先在这个类里use yii\validators\UrlValidator;
然后在testMe
方法里写代码:
public function testMe(){
$urlValidator = new UrlValidator();
}
好了再运行单元测试:%codecept% run unit
结果会提示 Class 'yii\validators\UrlValidator' not found
这是因为整个测试项目还没跟Yii搭上任何关系,所以如果你企图使用Yii里的类,目前它是无法自动去加载的,也不知道往哪个目录去找文件加载
- 解决办法:引入Yii的aotuload实现自动加载Yii的东西就可以了
引入Yii的autoload ¶
我的Codeception系列文章中谈过,测试项目下的_bootstrap.php
是测试项目初始化时会调用的文件,我们可以在这里引入Yii的autoload
噢可是你实际上能找到很多个_bootstrap.php,用哪个好呢……这里有两个可以用,分别是测试项目下的,以及unit目录下的
咱们这里是做单元测试,先在unit/_bootstrap.php
里下手吧,在这个文件里加入这样的代码:
define('APP_PATH', '你的yii项目目录,比如E:\workspace\shop');
include(APP_PATH . '/vendor/autoload.php');
include(APP_PATH . '/vendor/yiisoft/yii2/Yii.php');
这样就引入了autoload以及基本的Yii
这个类了,接下来再运行一次单元测试用例,如果能自动加载UrlValidator类则说明引入Yii成功了
初始化Yii的app ¶
这个很重要,因为无论是框架自身还是我们写的业务代码,都会调用Yii::$app
这样的代码,那怎样才能有这个$app
?
并不是引入了Yii框架就会有的,我们要初始化App类(yii\web\Application或者yii\console\Application)
一般我们都针对web应用做测试,所以我们要初始化yii\web\Application
,把_bootstrap.php改成这样:
define('APP_PATH', '你的yii项目目录,比如E:\workspace\shop');
include(APP_PATH . '/vendor/autoload.php');
include(APP_PATH . '/vendor/yiisoft/yii2/Yii.php');
$config = include(APP_PATH . '/config/web.php'); //反正你得想办法把整个配置数组得到,效仿web/index.php的入口逻辑也行
(new \yii\web\Application($config))->init(); //但这里不要像web/index.php一样执行run方法,只能执行init
不要执行run方法的原因:
运行run方法的话Yii会通过请求网址路由到控制器和action,再调用相关的action得到运行结果并且返回给response输出
但这里是命令行运行,哪有请求网址这回事呢?所以这没法路由到控制器action
其实在单元测试里我们也没必要让它自动运行任何action,只是为了测试某些类的工作情况是否正常而已