
发表日期: 2021-04-26 15:27:39 浏览次数:148
泰兴网站推广【泰兴办理400电话】泰兴SEO优化、泰兴微信公众号APP客户端小程序开发、泰兴网站托管、泰兴APP开发
泰兴市位于江苏省中部、长江下游北岸。北纬31°58′12"~32°23′05",东经119°54′05"~120°21′56",是江苏省泰州市下辖市,是江苏省直管县三个试点之一,享有部分地级市职权。东接如皋市;南接靖江市;西濒长江,与扬中市、常州市新北区隔江相望;北邻泰州市姜堰区,东北与南通市海安市接壤;西北与泰州市高港区毗连。 [1-2]
泰兴置县于南唐升元元年(公元937年),寓意“国泰民安,百业兴旺”,有“教育之乡” [3] 、“银杏之乡” [4] 、“建筑之乡” [5] 、“提琴之乡” [6] 、“减速机之乡” [7] 之称。 [2]
2018年,泰兴市实现地区生产总值1040亿元。一般公共预算收入74.5亿元,增长18.1%,税占比84.1%,总量列全省县市第7位、增幅列第1位。财政管理工作连续两年获得国务院表彰奖励。固定资产投资增长14%,其中产业投资增长13%。实现社会消费品零售总额257亿元,增长7%。城乡居民人均可支配收入增长9.2%。全国县域经济基本竞争力排名前移至第29位。 [8-9]
泰兴属长江三角洲冲积平原,行政区划面积1172平方公里,泰兴东西最大直线距离为47.0千米,南北最大直线距离为43.5千米。2017年末户籍总人口118.56万人,比上年减少0.75万人。年末常住人口107.80万人。 [10] 2018年11月,入选中国工业百强县(市)。 [11] 2018年12月,入选全国县域经济综合竞争力100强、 [12] 投资潜力100强,中国最佳县级城市30强,2019全国营商环境百强县。2020年12月,社科院发布《全国县域经济综合竞争力100强》,泰兴排名第37 [13] 。
到目前为止,在单元测试的指引下,我们完成了发布日历事件最小化的代码开发。这时再次执行单元测试,会发现已经通过了!
WeTime$ phpunit ./Fun/Tests/Api/Api_Event_Test.php ... ...OK (3 tests, 1 assertion)复制代码
访问数据库,可以在wt_event表中看到刚成功发布的事件信息。
表5-6 通过单元测试新增的日历事件数据
id | uid | title | content | location | createtime | state | tousers |
|---|---|---|---|---|---|---|---|
1 | 1 | 测试事件 | 这是一个测试事件 | 2017-05-29 09:29:07 | 1 | 1 |
就这样,我们第一个接口服务就已经初步开发完成了!
前面讲到,在Domain_Event类中存在一个魔法字符串,相关的代码片段是:
$newEvent['state'] = '1';复制代码
要重构这行代码很简单,只需用常量来标识对应的state表字段的枚举值即可。重构后的代码片段如下所示:
// WeTime$ vim ./Fun/Domain/Event.phpclass Domain_Event {
// 0:已删除;1:未完成;2:已完成
const STATE_DELETED = '0';
const STATE_ACTIVE = '1';
const STATE_DONE = '2';
public function post($newEvent) {
$newEvent['state'] = self::STATE_ACTIVE;
... ...复制代码每次重构后,执行一次单元测试,确保原来的功能不受影响。
日历事件领域业务类Domain_Event的逻辑规则非常简单,使用phalapi-buildtest创建测试骨架后参考上面的测试用例场景补充相应的测试用例即可。而对于数据模型类Model_Event,则更为简单,因为它只是单纯继承父类,没有其他的实现代码,所以可暂时不补充其单元测试。
由于是首次开发接口服务,原来还没有任何接口服务代码,因此也就不存在旧的单元测试。但这时也依然可以执行一下全部的单元测试,以便发现有没其他的问题还待解决。结果发现,添加了必须的sign接口参数后,会导致默认的接口服务在测试时出现“缺少必要参数sign”的异常。根据错误提示信息,调整相应测试用例的场景数据即可。
日历事件发布接口不具备幂等性,因为每次成功调用它都会发布一个新的日历事件,在数据库表中添加一条新的数据纪录。而将要开发的查看日历事件列表接口,则相对具有幂等性。有没有日历事件更新的前提下,每次所查看到的事件列表应该是一样的。很明显,在这个接口服务中,需要根据一定的条件和规则进行筛选,返回满足要求的事件列表,并需要支持分页操作。遵循TDD下的开发步骤,可以如法炮制快速开发此查看日历事件列表接口服务。由于开发过程类似,下面将简明介绍,省略重复部分的讲解。
同样,在开始开发查看日历事件列表接口服务前,有一些前置条件。假设Aevit已关注了用户Angle,并且这两位用户在一段很长的时间内均已发布了大量的日历事件。在关注数据库中,下面这条纪录表示Aevit(用户ID为1)关注了Angle(用户ID为2)。
INSERT INTO `wt_follow` (`id`, `gid`, `uid`, `touid`, `createtime`) VALUES ('1', '0', '1', '2', '2017-05-29 10:55:01');复制代码首先,对查看日历事件列表,补充完善的测试用例,使之测试失败。通过事先编写单元测试,有助于迫使我们一开始就关注高层的概念和业务需求,而非一头就扎进实现的细节和纠结于使用何种技术。
public function testSpace()
{
// Step 1. 构建
$url = 'service=Event.Space&client=ios&version=1.0.1&user_id=1&sign=';
$params = array(
'perpage' => 5,
'page' => 1,
'createtime' => '2017-05-29 59:59:59',
);
// Step 2. 执行
$rs = PhalApi_Helper_TestRunner::go($url, $params);
// Step 3. 验证
$this->assertGreaterThan(0, $rs['total']);
$this->assertEquals(5, $rs['perpage']);
$this->assertEquals(1, $rs['page']);
$this->assertNotEmpty($rs['list']);
$this->assertLessThanOrEqual(5, count($rs['list']));
foreach ($rs['list'] as $item) {
$this->assertArrayHasKey('id', $item);
$this->assertArrayHasKey('uid', $item);
$this->assertArrayHasKey('user', $item);
$this->assertArrayHasKey('title', $item);
$this->assertArrayHasKey('content', $item);
$this->assertArrayHasKey('createtime', $item);
$this->assertArrayHasKey('avatar', $item['user']); //用户头像
}
$allUid = array();
foreach ($rs['list'] as $item) {
$allUid[] = $item['uid'];
}
$this->assertContains('1', $allUid); //1为Aevit
$this->assertContains('2', $allUid); //2为Angle
}复制代码此时,为了只执行这个测试用例,而不执行前面发布日历事件的测试用例,可以使用phpunit的--filter参数,即:
WeTime$ phpunit --filter testSpace ./Fun/Tests/Api/Api_Event_Test.php复制代码
还记得吗?我们在WeTime项目中开启了简单的MD5签名验证服务,因此会提示“签名错误”这样的异常。为了解决在单元测试时签名验证这个问题,可以有两种方案,一种是针对每次测试用例中根据控制台的日记信息,把正确的签名手动更新到测试用例中的sign参数。例如在控制台看到:
2017-05-29 10:41:00|DEBUG|Wrong Sign|{"needSign":"9897a2670cc329ce8c49a65118ff7287"}复制代码即可把“9897a2670cc329ce8c49a65118ff7287”更新到sign参数。
$url = 'service=Event.Space&client=ios&version=1.0.1&user_id=1&sign=9897a2670cc329ce8c49a65118ff7287';复制代码
再来分析下这里的测试用例最后的断言部分。查看接口与前面的发布接口不一样,显然里面的业务规则更为复杂,牵涉的数据更广。断言部分表明了最终客户端需要哪些业务数据,而这些数据包括:
列表分页的相关数据,如总数量total,透传返回的分页数量perpage和当前是第几页;
在list字段中返回列表的精制数据;
在列表的条目中,返回日历事件的相关数据,包括事件ID、发布者的用户ID、事件标题和内容以及发布的时间;
在列表条目中附上发布者对应的用户信息,例如用户头像;
最后的断言,确保用户既可以看到自己发布的事件,还可以看到所关注的用户发布的事件。
接下来,以失败的单元测试作为指导,继续我们的编码开发。

服务热线
顶部
备案号: 苏ICP备11067224号
CopyRight © 2011 书生商友信息科技 All Right Reserved
24小时服务热线:400-111-6878 E-MAIL:1120768800@qq.com QQ:1120768800
网址: http://www.768800.com 网站建设:上往建站
关键词: 网站建设| 域名邮箱| 服务器空间| 网站推广| 上往建站| 网站制作| 网站设计| 域名注册| 网络营销| 网站维护|
企业邮箱| 虚拟主机| 网络建站| 网站服务| 网页设计| 网店美工设计| 网站定制| 企业建站| 网站设计制作| 网页制作公司|
400电话办理| 书生商友软件| 葬花网| 调温纤维| 海洋馆运营维护| 北京保安公司| 殡仪馆服务| 殡葬服务| 苏州殡葬一条龙| 朝阳殡葬| 苏州殡葬服务|
欢迎您免费咨询,请填写以下信息,我们收到后会尽快与您联系
服务热线:400-111-6878