phpunit 单元测试案例--签到任务

简介:
工作需要,最近要写 单元测试了,这里算是一个记录的过程吧,慢慢记录,慢慢 学习,慢慢总结,早点把这块的信息熟悉起来~~
  之前也写过简单的单元测试的一些小的说明,但是现在的是比较具体的例子了!
   这里要列举的一个例子是如下的描述:
  名称:签到任务,领金币。
   规则:
  1、可以每天签到,签到一天领取一个金币,连续3天或者7天有额外的几个金币。
  2、某一段时间内可以做一起签到任务,连续签到3天,可以额外给50金币,每个用户只能做一次。
  首先简单介绍下表结构,这里用的是MongoDB:
  第一个表就是每天签到的表里面很重要的2个字段是:
"last_time" : 1385545551,#最后签到时间
"sign_time" : [
1385545551  #连续签到天数,数组,存放连续签到的时间
],
  第二张表是任务表,每个用户对应一条记录,这条记录里包括不同的任务执行状态:
"sign" : { #sign代表签到任务
"last_time" : 1385545357,#最后一次更新时间
"status" : 4 #1第一天签到,2第二天,3第三天 4已领奖
}

 单元测试中会有一些调用方法,这里我不列出具体代码,只解释方法的作用:
<?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']);
}
}


最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章
|
3月前
|
测试技术 程序员 C++
C++单元测试GoogleTest和GoogleMock十分钟快速上手(gtest&gmock)
gtest是Google开源的一个跨平台的(Liunx、Mac OS X、Windows等)的 C++ 单元测试框架,可以帮助程序员测试 C++ 程序的结果预期。它提供了丰富的断言、致命和非致命判断、参数化、”死亡测试”等等。另一方面,gmock并不是一个独立的测试框架,而是gtest的辅助框架,主要用于模拟没有实现的类的操作,以便在没有完整类的情况下进行测试。通过配合使用gtest和gmock,开发者可以编写出更为复杂且健壮的C++单元测试。
97 0
|
4月前
|
监控 前端开发 JavaScript
如何测试前端代码? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
如何测试前端代码? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
74 0
|
测试技术 PHP 数据库
ThinkPHP6.0使用PHPUnit进行单元测试
ThinkPHP6.0使用PHPUnit进行单元测试
357 0
ThinkPHP6.0使用PHPUnit进行单元测试
|
9月前
|
敏捷开发 IDE 测试技术
单元测试PHPUnit初体验之安装与示例
啥?你是程序员没写过单元测试?呃,好吧。小马这次也是需要支持CI/CD才刚开始强制自我实行。
94 0
单元测试PHPUnit初体验之安装与示例
|
9月前
|
IDE Java 测试技术
单元测试PHPUnit入门三板斧
什么,你是程序员?什么你从来没写过单元测试用例?嗯,不要惊讶,这在国内正常的啦。有的觉得写这个玩意太耗时间了,有的干脆就不知道单元测试用例是怎么玩的。说来惭愧,小马也是在CICD的“胁迫”下开始正式涉足。
73 0
单元测试PHPUnit入门三板斧
|
测试技术
sonar代码扫描 覆盖率为0 单元测试不显示
sonar代码扫描 覆盖率为0 单元测试不显示
sonar代码扫描 覆盖率为0 单元测试不显示
【HttpRunner v3.x】笔记 ——5. 测试用例-config
【HttpRunner v3.x】笔记 ——5. 测试用例-config
【HttpRunner v3.x】笔记 ——5. 测试用例-config
|
测试技术
Cypress系列(9)- Cypress 编写和组织测试用例篇 之 .skip() 和 .only() 的详细使用
Cypress系列(9)- Cypress 编写和组织测试用例篇 之 .skip() 和 .only() 的详细使用
146 0
Cypress系列(9)- Cypress 编写和组织测试用例篇 之 .skip() 和 .only() 的详细使用