Yii单元测试 codeception-Fixture的使用
Fixture
本文主要是介绍关于Fixture,Specify的使用和遇到的坑
部分是根据源码摸索,有差错的部分望指出
Fixture主要是用来提供测试环境下的数据特定的状态
例如:测试中需要一条待评估的方案数据,使用fixture可在测试前自动将所用的特定状态的数据填充入数据库,不用每次重复做不必要的操作
首先,定义用的Fixture CusMainFixture.php ($modelClass 指定你将要测试需要的表)
namespace tests\codeception\backend\unit\fixtures;
use yii\test\ActiveFixture;
class CusMainFixture extends ActiveFixture
{
public $modelClass = 'backend\models\CusMain';
}
然后将你本次测试所需要的特定数据,写入fixture下的data目录下,名为 表名.php--CusMain.php
return [
'user1' => [
'ID' => '1231231',
'CNAME'=>'李时珍',
'SEX'=>'1',
],
'user2' => [
'ID' => '12314231',
'CNAME'=>'努尔哈赤',
'SEX'=>'2',
],
];
你可以给某行指定一个 alias 别名,这样在你以后的测试中,你可以通过别名来确定某行。 在上面的例子中,这两行指定别名为 user1 和 user2。(如果不使用别名,直接使用数组的话可以使用CusMain[0],CusMain[1]调用)
接着就可以使用Fixture了,注意要继承DbTestCase使用,继承就要引用,这里有个坑,在yii的文档中引用的是
use yii\codeception\DbTestCase;
测试时会报错
原因是 他引用的是yii-codeception的,官方也已经停止维护,不推荐使用了,要使用codeception所带的DbTestCase
use tests\codeception\backend\unit\DbTestCase;
通过fixtures方法导入数据
namespace tests\codeception\backend\unit\models;
use backend\models\CusMain;
use tests\codeception\backend\unit\DbTestCase;
use tests\codeception\backend\unit\fixtures\CusMainFixture;
class CusMainTest extends DbTestCase
{
public function fixtures()
{
return [
'Cusmain' => [
'class' => CusMainFixture::className(),
'dataFile' => '@tests/codeception/backend/unit/fixtures/data/CusMain.php'
],
//如果测试同时对多张表进行操作,可以在此继续添加fixture,流程与创建cusmian过程相同
];
}
}
运行测试,可以看到数据库中只有预先fixture的两条特定数据 ;(会清空原有数据插入测试数据)
接下来的测试代码中,发现不能在使用普通的断言了,codeception提供了verify,expect的方法,两者基本等价的
官方介绍
If you follow TDD/BDD you'd rather use
expect
instead ofverify
. Which are just an alias functions:
$row = $this->Cusmain['user1']; //取fixture值
$user = CusMain::findOne(['CNAME' => $row['CNAME']]);
$user ->CNAME = 'wewewe';
//判断是否返回true 或false
verify('false', $user ->save())->true();
//verify(‘返回错误提示’,判断内容)->期望值
// 12314231
//包含 只要是子集就可以
expect('ID is wrong', $user ->ID)->contains('123');
verify('ID is wrong', $user ->ID)->contains('123');
//是否相同
expect('ID is wrong Num', $user ->ID)->equals('1231231');
verify('ID is wrong Num', $user ->ID)->equals('1231231');
如果想使用断言的话,可以使用specify方法
use Codeception\Specify;
........
//断言不成立的时候 返回语句
$this->specify("ID should be 1231231", function() {
$row = $this->Cusmain['user1'];
$user = CusMain::findOne(['CNAME' => $row['CNAME']]);
$this->assertNotEquals('1231231', $user->ID);
});
关于specify和verify的具体用法可以在源码中查询
vendor\codeception\specify\tests\SpecifyTest.php
vendor\codeception\verify\tests\VerifyTest.php
PS:如果报错表不存在,有两种解决方案
1.需要将配置文件db指向所测试的库
2.如果操作跨库多表的情况,将model中代码
public static function tableName()
{
return 'cus_main';
}
public static function getDb()
{
return Yii::$app->get('qmcus');
}
修改成 codeception只获取到tablename的方法
public static function tableName()
{
return 'qmcus.cus_main';
}
以上是对于单元测试的一段落的总结
不断补充完善
Yii单元测试 codeception-Fixture的使用的更多相关文章
- Selenium自动化测试,接口自动化测试开发,性能测试从入门到精通
Selenium自动化测试,接口自动化测试开发,性能测试从入门到精通Selenium接口性能自动化测试基础部分:分层自动化思想Slenium介绍Selenium1.0/2.0/3.0Slenium R ...
- Pytest单元测试框架之FixTure基本使用
前言: 在单元测试框架中,主要分为:测试固件,测试用例,测试套件,测试执行及测试报告: 测试固件不难理解,也就是我们在执行测试用例前需要做的动作和测试执行后的需要做的事情: 比如在UI自动化测试中,我 ...
- python单元测试框架pytest——fixture函数(类似unitest的setup和teardown)
pytest的setup和teardown函数(曾被一家云计算面试官问到过). pytest提供了fixture函数用以在测试执行前和执行后进行必要的准备和清理工作.与python自带的unitest ...
- 基于PhpStorm对Yii框架进行的单元测试一【PhpUnit环境搭建】
1.下载phpunit.phar 2.在phpstorm中配置phpunit库 3.不同版本phpunit 需要依赖的php解释器也不一样,如果运行时报错 可以适当调整php解释器的版本 至此进行ph ...
- Yii 1.1.x 单元测试
代码若不整洁,只会越来越糟糕:代码写不好,公司要黄是迟早. Yii 的应用有两种,下面记录这两种应用的单元测试方法 webApplication consoleApplication 在protect ...
- Pytest单元测试框架之FixTure内置临时文件tmpdir操作
1.前言:某些接口需要引用上个接口返回的值,作为下个接口的入参,但笔者又不想在本地维护及创建此文件,此时引出fixture内置函数中的临时文件存储tmpdir 2.首先下面的源码是使用flask框架写 ...
- unittest单元测试框架之测试环境的初始化与还原(fixture)(五)
1.方法一:针对每条测试用例进行初始化与还原 import unittest from UnittestDemo.mathfunc import * class TestMathFunc(unitte ...
- Yii2中如何使用CodeCeption
Yii2和CodeCeption CodeCeption是一个全栈的PHP测试框架,关于CodeCeption的介绍见:CodeCeption官方文档. Yii2官方增加了对CodeCeption的支 ...
- Codeception 实战
Codeception 测试 Php 代码 一.一句话概述 使用 cc 进行单元测试,保证现有代码质量,为以后维护与重构提供支撑. 二.目标 安装配置 cc 编写测试代码,简化开发与最大化稳定性和可维 ...
随机推荐
- VC字体对话框的初始化
本代码需要先添加类成员 LOGFONT lf; void CMyDlg::OnButton3() { // TODO: Add your control notification handler c ...
- TP中搜索条件
- scandir函数的研究【笔记】
以下是本人的学习笔记,代码并非原创,均摘自官方源码,贴出来仅供学习记录用 scandir 的使用要注意内存泄漏的问题 scandir函数实现: vi ./uClibc-0.9.33.2/libc/mi ...
- PHP用imageTtfText函数在图片上写入汉字
https://blog.csdn.net/smstong/article/details/43955705 PHP绘图,imageString()这个函数并不支持汉字的绘制.这往往会给入门者当头一棒 ...
- curl基于URL的文件传输工具
简介 cURL是一款开源的基于URL的文件传输工具,支持HTTP.HTTPS.FTP等协议,支持POST.cookie.认证.扩展头部.限速等特性. curl命令用途广泛,比如下载.发送http请求. ...
- java基础2 判断语句:if ... else 语句和 switch 语句
一.if ... else 判断语句 1.if ... else 判断语句的格式 1.1.格式一 if(判断条件){ 执行不满足条件的语句 } 1.2.格式二 if(判断语句){ 满足条件的语句 }e ...
- mac下docker中安装nodejs
一.首先下载docker并安装 https://download.docker.com/mac/stable/Docker.dmg 然后启动docker, 二.获取node最新镜像 输入来着node版 ...
- Windows内核读书笔记——SEH结构化异常处理
SEH是对windows系统中的异常分发和处理机制的总称,其实现分布在很多不同的模块中. SEH提供了终结处理和异常处理两种功能. 终结处理保证终结处理块中的程序一定会被执行 __try { //要保 ...
- ORA-12537: TNS:connection closed错误处理过程
https://blog.csdn.net/mchdba/article/details/50018571
- GUC-2 原子性
import java.util.concurrent.atomic.AtomicInteger; /* * 一.i++ 的原子性问题:i++ 的操作实际上分为三个步骤“读-改-写” * int i ...