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
expectinstead 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 编写测试代码,简化开发与最大化稳定性和可维 ...
随机推荐
- python之微信公众号开发(基本配置和校验)
前言 最近有微信公众号开发的业务,以前没有用python做过微信公众号开发,记录一下自己的学习和开发历程,共勉! 公众号类型 订阅号 普通订阅号 认证订阅号 服务号 普通服务号 认证服务号 服务方式 ...
- 判断Selenium加载完成
How do you make Selenium 2.0 wait for the page to load? You can also check pageloaded using followin ...
- python3.X和python2.7的区别
1.python3.X将thread模块修改为_thread
- [ python ] 软件开发规范
在python开发中,我们建议采用如下规范: soft/ ├── bin # 程序执行文件目录 │ ├── __init__.py │ └── start.py # 程序开始执行脚本文件 ├─ ...
- java中常见异常汇总(根据自己遇到的异常不定时更新)
1.java.lang.ArrayIndexOutOfBoundsException:N(数组索引越界异常.如果访问数组元素时指定的索引值小于0,或者大于等于数组的长度,编译程序不会出现任何错误,但运 ...
- poj 1041(字典序输出欧拉回路)
John's trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8641 Accepted: 2893 Spe ...
- 解决IE的背景颜色透明子元素不透明问题
假设背景为黑色,70%半透明,对需要半透明的层用如下CSS background-color: #000000; /* background color for IE */ filter: alpha ...
- Maven_pom文件常用
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- DOM的查找与操作
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- js求连个数之间的数字
整理出自项目中一个需求,求两个数之间的数字. const week = function(arr,arr2){ let a=parseInt(arr); let b=parseInt(arr2); l ...