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;
预言其实就是普通测试下输入各种值或者情(老测试直觉会弄些极限值出来)应该获取到的结果。一个测试方法里面可能有很多预言。
来源:https://www.cnblogs.com/tying/p/10839900.html