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/

时间: 2024-08-31 17:00:41

phpunit 单元测试案例--签到任务的相关文章

SpringMVC,MyBatis项目中兼容Oracle和MySql的解决方案及其项目环境搭建配置、web项目中的单元测试写法、HttpClient调用post请求等案例

 要搭建的项目的项目结构如下(使用的框架为:Spring.SpingMVC.MyBatis): 2.pom.xml中的配置如下(注意,本工程分为几个小的子工程,另外两个工程最终是jar包): 其中pom.xml中的内容如下,其中${ip}为ip地址: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"

Windows下安装PHP单元测试环境PHPUnit图文教程_php技巧

1.按照常规下载 php 的zip包和配置好 php.ini,这里的例子使用的是 E:\php 2.把你的 php 目录加入系统环境变量 path 中 3.开始 运行 输入 cmd,然后切换到你的 php 目录,我当前的就是 E:\php 4.输入 go-pear.bat 首先脚本会询问是把 pear 安装为系统范围的还是本地拷贝,这里我们默认选择系统,直接回车即可 5.这时显示当前的路径配置,并询问你是否修改,我们保持默认依然回车即可,回车后脚本就会开始自动安装 pear 库了 6.安装的时候

使用XDebug调试及单元测试覆盖率分析

今天我就就自己对XDebug使用的一些体验做一小段分享.XDebug也是因为需要是用来生成覆盖率分析文件才安装的,刚接触不久,平时用的也不是很频繁,但是这个的确是一个好工具,如果想要依赖它来分析程序的性能还是需要自己亲手去试试.具体它有多好,请听我一一道来. <?XML:NAMESPACE PREFIX = O /> <!--[if !supportLists]-->一.<!--[endif]-->安装篇(XDebug 和PHPUnit) A:安装XDebug: Xde

使用XDebug调试及单元测试覆盖率分析_php技巧

今天我就就自己对XDebug使用的一些体验做一小段分享.XDebug也是因为需要是用来生成覆盖率分析文件才安装的,刚接触不久,平时用的也不是很频繁,但是这个的确是一个好工具,如果想要依赖它来分析程序的性能还是需要自己亲手去试试.具体它有多好,请听我一一道来. <?XML:NAMESPACE PREFIX = O />   <!--[if !supportLists]-->一.<!--[endif]-->安装篇(XDebug 和PHPUnit) A:安装XDebug: X

玩转Node.js单元测试

代码部署之前,进行一定的单元测试是十分必要的,这样能够有效并且持续保证代码质量.而实践表明,高质量的单元测试还可以帮助我们完善自己的代码.这篇博客将通过一些简单的测试案例,介绍几款Node.js测试模块: Mocha和Should,SuperTest.本文侧重于解释原理,各个模块的详细使用案例以后单独再聊. 为啥需要单元测试? 所谓单元测试,就是对某个函数或者API进行正确性验证.来看个简单的例子add1.js: function add(a, b) { return a + b; } 没错,我

Junit实现Android单元测试

编写android业务代码的时候,我们需要测试其正确性,那就用进行各种测试,很多时候,我们都是用的 System.out.println("XXXXX") 来进行验证,但有时候,我们肉眼也不一定就能判断的准确,所以可以考虑用下junit. JUnit是个自动化单元测试工具,能够根据你需要测试的类及其接口自动生成该类的单元测试案例,你只要根据你的需要,就输入必要的测试数据就行了,系统运行后自动判断运行是否成功. 下面我来介绍下如何使用JUnit来测试android项目. 由于androi

搭建持续集成单元测试平台(Jenkins+Ant+Java+Junit+SVN)

一.环境准备 Jenkins: 到官网下载jenkins.war包:http://jenkins-ci.org/ 安装方法有两种: 把下载下来的jenkins.war包放到文件夹下,如C:\jenkins,然后打开命令行窗口并进到该目录下,执行java -jar jenkens.war命令,当提示:"Jenkins is fully up and running"时,表示启动成功,这时在浏览器窗口输入:http://localhost:8080/ 就可到jenkins的首页. 如果有t

gradle使用文档

1     基本介绍 1.1 前言 gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML. gradle能够完成构建.测试.发布和其他诸如软件打包.生成注释文档等等功能. 其特点包括: l  使用简单 l  支持多方式依赖管理 l  与ant.maven和ivy有良好的相容,支持轻松地从其他构建方式迁移到gradle上 l  支持局部构建 l  支持多工程的构建 l  免费开源  

PHP程序员的一生

人们对PHP其实很吝啬. 最近我拜读了一篇非常棒的文章--<How False Stereotypes Turn Into Technical "Truths">: 我们对编程语言的偏见不仅仅影响程序员辩论时的气势,还会对该编程语言的应聘和薪资产生重大影响. 这让我一下子想到了大家对PHP社区的看法. 今天我在JavaScript Jabber网站的节目上听到了Jenn Schiffer关于人们如何判断的精彩点评,感触良多,情不自禁地想与大家分享. 学习如何编程 虽然Jav