hello,word

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;

预言其实就是普通测试下输入各种值或者情(老测试直觉会弄些极限值出来)应该获取到的结果。一个测试方法里面可能有很多预言。

posted @ 2019-05-09 17:39  tying  阅读(1114)  评论(0编辑  收藏  举报