博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
phpunit 单元测试案例--签到任务
阅读量:5879 次
发布时间:2019-06-19

本文共 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
,如需转载请自行联系原作者
你可能感兴趣的文章
SCDPM2012 R2实战一:基于SQL 2008 R2集群的SCDPM2012 R2的安装
查看>>
SQL SERVER中字段类型与C#数据类型的对应关系
查看>>
Linux lsof命令详解
查看>>
SVG path
查看>>
js判断checkbox是否选中
查看>>
多系统盘挂载
查看>>
MySQL函数怎么加锁_MYSQL 函数调用导致自动生成共享锁问题
查看>>
MR1和MR2的工作原理
查看>>
Eclipse中修改代码格式
查看>>
GRUB Legacy
查看>>
关于 error: LINK1123: failure during conversion to COFF: file invalid or corrupt 错误的解决方案...
查看>>
python实现链表
查看>>
java查找string1和string2是不是含有相同的字母种类和数量(string1是否是string2的重新组合)...
查看>>
Android TabActivity使用方法
查看>>
Eclipse的 window-->preferences里面没有Android选项
查看>>
央行下属的上海资信网络金融征信系统(NFCS)签约机构数量突破800家
查看>>
[转] Lazy evaluation
查看>>
常用查找算法总结
查看>>
被神话的大数据——从大数据(big data)到深度数据(deep data)思维转变
查看>>
修改校准申请遇到的问题
查看>>