yii2的单元测试

丶灬走出姿态 提交于 2020-02-11 02:58:52

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: ApiTesterpaths:    tests: tests    output: tests/_output    data: tests/_data    support: tests/_support    envs: tests/_envsactor_suffix: Testersettings:    bootstrap: _bootstrap.phpextensions:    enabled:        - Codeception\Extension\RunFailedconfig:    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的测试用例文件。

<?phpnamespace \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。

以下为可用的内容

<?phpdefined('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;

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!