Yii單元測試 codeception-Fixture的使用

Fixture

本文主要是介紹關於Fixture,Specify的使用和遇到的坑
部分是根據源碼摸索,有差錯的部分望指出php

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.phpapp

return [
    'user1' => [
        'ID' => '1231231',
        'CNAME'=>'李時珍',
        'SEX'=>'1',
    ],
    'user2' => [
        'ID' => '12314231',
        'CNAME'=>'努爾哈赤',
        'SEX'=>'2',
    ],
];

你能夠給某行指定一個 alias 別名,這樣在你之後的測試中,你能夠經過別名來肯定某行。 在上面的例子中,這兩行指定別名爲 user1 和 user2。(若是不使用別名,直接使用數組的話可使用CusMain[0],CusMain[1]調用)yii

接着就可使用Fixture了,注意要繼承DbTestCase使用,繼承就要引用,這裏有個坑,在yii的文檔中引用的是單元測試

use yii\codeception\DbTestCase;

測試時會報錯測試

緣由是 他引用的是yii-codeception的,官方也已經中止維護,不推薦使用了,要使用codeception所帶的DbTestCasethis

use tests\codeception\backend\unit\DbTestCase;

經過fixtures方法導入數據spa

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的兩條特定數據 ;(會清空原有數據插入測試數據)3d

接下來的測試代碼中,發現不能在使用普通的斷言了,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';
    }

以上是對於單元測試的一段落的總結 不斷補充完善

相關文章
相關標籤/搜索