• Yii单元测试 codeception-Fixture的使用


    Fixture

    本文主要是介绍关于Fixture,Specify的使用和遇到的坑
    部分是根据源码摸索,有差错的部分望指出

    Fixture主要是用来提供测试环境下的数据特定的状态
    例如:测试中需要一条待评估的方案数据,使用fixture可在测试前自动将所用的特定状态的数据填充入数据库,不用每次重复做不必要的操作

    首先,定义用的Fixture CusMainFixture.php ($modelClass 指定你将要测试需要的表)

     namespace testscodeceptionackendunitfixtures;
    
     use yii	estActiveFixture;
    
     class CusMainFixture extends ActiveFixture
     {
         public $modelClass = 'backendmodelsCusMain';
     }
    

    然后将你本次测试所需要的特定数据,写入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 yiicodeceptionDbTestCase;
    

    测试时会报错

    原因是 他引用的是yii-codeception的,官方也已经停止维护,不推荐使用了,要使用codeception所带的DbTestCase

    use testscodeceptionackendunitDbTestCase;
    

    通过fixtures方法导入数据

    namespace  testscodeceptionackendunitmodels;
    
    use backendmodelsCusMain;
    use testscodeceptionackendunitDbTestCase;
    use testscodeceptionackendunitfixturesCusMainFixture;
    
    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 CodeceptionSpecify;
    ........
    //断言不成立的时候 返回语句
           $this->specify("ID should be 1231231", function() {
                 $row = $this->Cusmain['user1'];
                 $user = CusMain::findOne(['CNAME' => $row['CNAME']]);
                $this->assertNotEquals('1231231',  $user->ID);
            });
    

    关于specify和verify的具体用法可以在源码中查询
    vendorcodeceptionspecify estsSpecifyTest.php
    vendorcodeceptionverify estsVerifyTest.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';
        }
    

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

  • 相关阅读:
    什么是RUP
    oracle 导入导出
    jsp 标签
    java json 交互
    Spring MVC 学习过程遇到的问题
    Spring 与其他ORM 框架结合 作数据持久层解析 (转)
    Spring mvc 中快速获取request、reponse、session
    Spring 数据绑定
    spring mvc 请求对应控制器的解析策略配置
    spring 的几种注解
  • 原文地址:https://www.cnblogs.com/attitudeY/p/7088420.html
Copyright © 2020-2023  润新知