yii2的单元测试
1.什么是单元测试
单元测试其实就是一种代码级别的测试,主要用于判断自己写的代码是否是自己想要的。其实一般情况下单元测试用于跨部门,高耦合,多人参与的项目。
2.如何进行单元测试
很简单,就是使用。比如如果你想测试一个方法,直接运行方法,打印结果进行判断就可以了。只不过这样并不能完全表示它的准确性。也不够逼格,所以就运用而生了标准和工具。引申的说一下,其实世间万物都是个性化的,但是个性化并不能让别人准确的理解这个事物(或者理解需要花费时间和精力),所以就定了各种标准。个人感觉标准就是为给平凡而准备的等级,超凡的事物,从来不屑于遵循标准,因为它本身做的就比标准多很多。
3.yii2的单元测试
基于codecopt在做开发测试,这是一个测试工具,他可以做单元测试,功能测试,验收测试,api接口测试等,这里主要介绍下单元测试,其他没有几样没有做,只是进行猜测
详细介绍可以参考官网推荐https://codeception.com/for/yii
下面说说我自己的简单单元测试的过程,首先你需要初始化codecopt的配置。这个使用命令行进行自动生成的。
我用的wampserver,没有win下开发的,没有添加环境变量,也就是不能直接在命令行执行php,所以直接在命令行外执行的。
1)首先查找codecept文件的位置,由于我的yii2是其他人弄了5年的基础版本,搞了什么不知道,我现找的在网站根目录\vendor\codeception\codecept
文件内容为:
<?php
/**
* Codeception CLI
*/
require_once __DIR__ . '/autoload.php';
use Codeception\Application;
$app = new Application('Codeception', Codeception\Codecept::VERSION);
$app->add(new Codeception\Command\Build('build'));
$app->add(new Codeception\Command\Run('run'));
$app->add(new Codeception\Command\Init('init'));
$app->add(new Codeception\Command\Console('console'));
$app->add(new Codeception\Command\Bootstrap('bootstrap'));
$app->add(new Codeception\Command\GenerateCept('generate:cept'));
$app->add(new Codeception\Command\GenerateCest('generate:cest'));
$app->add(new Codeception\Command\GenerateTest('generate:test'));
$app->add(new Codeception\Command\GenerateSuite('generate:suite'));
$app->add(new Codeception\Command\GenerateHelper('generate:helper'));
$app->add(new Codeception\Command\GenerateScenarios('generate:scenarios'));
$app->add(new Codeception\Command\Clean('clean'));
$app->add(new Codeception\Command\GenerateGroup('generate:groupobject'));
$app->add(new Codeception\Command\GeneratePageObject('generate:pageobject'));
$app->add(new Codeception\Command\GenerateStepObject('generate:stepobject'));
$app->add(new Codeception\Command\GenerateEnvironment('generate:environment'));
$app->add(new Codeception\Command\GenerateFeature('generate:feature'));
$app->add(new Codeception\Command\GherkinSnippets('gherkin:snippets'));
$app->add(new Codeception\Command\GherkinSteps('gherkin:steps'));
$app->add(new Codeception\Command\DryRun('dry-run'));
$app->add(new Codeception\Command\ConfigValidate('config:validate'));
$app->add(new Codeception\Command\Completion());
$app->registerCustomCommands();
$app->run();
2)在命令行中执行初始化,在此之前,需要在网站根目录手动创建一个tests的文件夹
cd d:/wampserver/www/网站根目录
d:/wamp64/bin/php/php7.0.0/php.exe vendor\codeception\codeception\codecept init unit
应该会在tests下生成两个目录_output和__support
3)修改codeception.yml文件,
直接上改过的吧,对比修改,多的不用删,少的补上
suites:
unit:
path: unit
actor: UnitTester
api: #这个是api测试用的,可以不用配置
path: api
actor: ApiTester
paths:
tests: tests
output: tests/_output
data: tests/_data
support: tests/_support
envs: tests/_envs
actor_suffix: Tester
settings:
bootstrap: _bootstrap.php
extensions:
enabled:
- Codeception\Extension\RunFailed
config:
Yii2:
configFile:config/test.php
# the entry script URL (with host info) for functional and acceptance tests,主要是功能测试合验收测试,这个不用配
# PLEASE ADJUST IT TO THE ACTUAL ENTRY SCRIPT URL
test_entry_url: http://localhost/网站根目录/web/index.php
4)构建测试相关系统文件,依然使用命令行
d:/wamp64/bin/php/php7.0.0/php.exe vendor\codeception\codeception\codecept build
执行成功后,会在test生成一些新文件
这些生成好后就可以执行进行单元测试了这里用user做个例子
1)命令行执行
d:/wamp64/bin/php/php7.0.0/php.exe vendor\codeception\codeception\codecept generate:test unit /models/User
会生成一个测试用例文件在/tests/unit/UserTest.php的测试用例文件。
<?php
namespace \models;
use app\models\User;
class UserTest extends \Codeception\Test\Unit
{
/**
* @var \UnitTester
*/
protected $tester;
//这个方法是在执行测试之前要做的事情,或者说你的测试可能会有一些前置条件
protected function _before()
{
}
//这个方法是在执行测试之后要做的事情
protected function _after()
{
}
// tests这个就是测试,我写到下面来了,可以注释掉
public function testSomeFeature()
{
}
//这个方法是就是我的单元测试了,用来测试user类中的findindentity()方法。
public function testFindIdentity(){
$user = User::findIdentity(1);
//在数据库中有id为1的用户,那么我就预言$user不可能为false,如果是false就是函数错误
$this->assertFalse(!$user);
}
}
d:/wamp64/bin/php/php7.0.0/php.exe vendor\codeception\codeception\codecept run unit \models\UserTest 进行测试,得出下来就ok。
中间会遇到一些问题,中包括
[Error] Class 'app\models\User' not found,就是引用的被测试类不能引用,
[yii\base\InvalidConfigException]
Unable to determine the entry script URL. 找不到入口文件
以上这些都是配置文件中定义的入口文件不够干净的原因配置项为,办法就是删删删里面的没用的内容,文件位置为tests/unit/_bootstrip.php。
以下为可用的内容
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'test');
require_once(__DIR__ . '/../../vendor/autoload.php');
require_once(__DIR__ . '/../../vendor/yiisoft/yii2/Yii.php');
$config = require(__DIR__ . '/../../config/console.php');
defined('ASSET_SERVER') || define('ASSET_SERVER', '/assets/');
(new yii\web\Application($config));//->run();
在左后说下预言。何为预言呢?就是方法的结果验证。
比如刚刚的用户,如果id为一个数据库不存在的。那么预言他应该是空或者false;
预言其实就是普通测试下输入各种值或者情(老测试直觉会弄些极限值出来)应该获取到的结果。一个测试方法里面可能有很多预言。