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;

测试时会报错

1091061-20170628101700258-1871445206.png

原因是 他引用的是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 of verify. 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';
    }

以上是对于单元测试的一段落的总结
不断补充完善

转载于:https://www.cnblogs.com/attitudeY/p/7088420.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值