Yii单元测试 codeception-Fixture的使用
2017-06-28 10:01
399 查看
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 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'; }
以上是对于单元测试的一段落的总结
不断补充完善
相关文章推荐
- Yii框架的单元测试中使用Fixtures详解
- Google C++单元测试框架GoogleTest---TestFixture使用
- 使用NUnit进行单元测试
- 使用CsUnit进行单元测试(一)
- 单元测试使用工具Nunit2.1
- 使用NUnit在.Net编程中进行单元测试
- 使用NUnit在.Net编程中进行单元测试(转)
- 使用CppUnit进行单元测试
- Eclipse学习4-在Eclipse中使用JUnit进行单元测试(上)
- 在.NET环境中使用单元测试工具NUnit
- 在.NET环境中使用单元测试工具NUnit
- 在.NET环境中使用单元测试工具NUnit
- 怎样使用Junit Framework进行单元测试的编写
- 怎样使用Junit Framework进行单元测试的编写
- 使用NUnit在.Net编程中进行单元测试
- 在.NET环境中使用单元测试工具NUnit
- 使用jMock辅助单元测试
- 利用 Ant 和 JUnit 进行增量开发-使用单元测试来逐步改进代码
- Eclipse学习4-在Eclipse中使用JUnit进行单元测试(下)
- 使用NUnit进行单元测试,读配置文件的问题