本文主要是介紹關於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 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'; }
以上是對於單元測試的一段落的總結 不斷補充完善