自动化测试开发 - 引入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,只是为了测试某些类的工作情况是否正常而已