本文共 3036 字,大约阅读时间需要 10 分钟。
因工作需要,最近要写单元测试了,这里算是一个记录的过程吧,慢慢记录,慢慢学习,慢慢总结,早点把这块的信息熟悉起来~~
之前也写过简单的单元测试的一些小的说明,但是现在的是比较具体的例子了!
这里要列举的一个例子是如下的描述:
名称:签到任务,领金币。
规则:
1、可以每天签到,签到一天领取一个金币,连续3天或者7天有额外的几个金币。
2、某一段时间内可以做一起签到任务,连续签到3天,可以额外给50金币,每个用户只能做一次。
首先简单介绍下表结构,这里用的是MongoDB:
第一个表就是每天签到的表里面很重要的2个字段是:
1 2 3 4 | "last_time" : 1385545551, #最后签到时间 "sign_time" : [ 1385545551 #连续签到天数,数组,存放连续签到的时间 ], |
第二张表是任务表,每个用户对应一条记录,这条记录里包括不同的任务执行状态:
1 2 3 4 | "sign" : { #sign代表签到任务 "last_time" : 1385545357, #最后一次更新时间 "status" : 4 #1第一天签到,2第二天,3第三天 4已领奖 } |
单元测试中会有一些调用方法,这里我不列出具体代码,只解释方法的作用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | <?php /** * 签到任务单元测试 * * @author shayang88 * @since 2013-11-27 * @copyright Copyright (c) 2005-2012 Inc. * @desc * */ require_once dirname( __FILE__ ) . '/../../webroot/bootstrap.php' ; class test_sign_task extends PHPUnit_Framework_TestCase { public $testUid = 5888882; //这个是测试的用户id /** * 这个函数主要用来清除用户在2个表中的任务状态,重置为下面做准备 */ public function testClear(){ //清除现有表签到任务,主要是任务的状态归零 $taskModel = new GuaziTaskModel(); $taskModel ->clearTask( $this ->testUid, 'sign' ); //清除签到表,清除用户的连续签到天和最后签到时间 $signModel = new GuaziSignModel(); $signModel ->getCollection()->update( array ( 'uid' => $this ->testUid ), array ( '$unset' => array ( 'last_time' => 1, 'sign_time' => 1))); } /** * 这个函数用来断言上一步清除任务状态是否完成 */ public function testEmpty(){ //断言是否任务状态已清空 $objSignTask = Task_Factory::factory( 'sign' ); $signStatus = $objSignTask ->getStatus( $this ->testUid); //清除完成,则任务状态归零,所以用0来断言 $this ->assertEquals(0, $signStatus ); //断言是否任务已清空 $signModel = new GuaziSignModel(); $arrsign = $signModel ->getSignByUid( $this ->testUid); //这里因为清空是直接清除了字段,所以用NULL来断言 $this ->assertNull( $arrsign [ 'n_t' ]); $this ->assertNull( $arrsign [ 't' ]); } /** * 这个函数是签到数据的供给器,主要是为了模拟签到连续的天数,为下面的testSign提供数据,这里 * 需要了解数据供给器的用法@dataProvider * @return array */ public function dataProducer() { //提供签到数据 //第1个参数是签到时间,第2个是连续签到的天数,第3个是任务的完成状态 return array ( array ( '2013-11-25 19:30' , 1, 1), array ( '2013-11-26 18:30' , 2, 2), array ( '2013-11-27 10:30' , 3, 3), array ( '2013-11-28 23:59' , 4, 4), array ( '2013-11-29 22:59' , 5, 4), ); } /** * @dataProvider dataProducer */ public function testSign( $nowTime , $signCount , $taskStatus ) { //循环接收dataProducer给的值开始执行任务,3个参数就是上面数组的个数 $now = strtotime ( $nowTime ); $signModel = new GuaziSignModel(); //更新任务表状态并断言 $objSignTask = Task_Factory::factory( 'sign' ); //更新任务状态,当然内部会区分每一步不同的操作 $doTaskRes = $objSignTask ->doTaskForPhpunit( $this ->testUid, $now ); //断言执行结果 $this ->assertEquals(1, $doTaskRes ); //获取任务状态 $signStatus = $objSignTask ->getStatus( $this ->testUid); //断言任务状态 $this ->assertEquals( $taskStatus , $signStatus ); //更新签到表并断言 $ret = $signModel ->updateLastSign( $this ->testUid, $now ); //断言连续签到天数 $this ->assertCount( $signCount , $ret [ 't' ]); } } 本文转自shayang8851CTO博客,原文链接: http://blog.51cto.com/janephp/1332575 ,如需转载请自行联系原作者 |