项目中初试PHP单元测试
只能叫初试,前面虽然做了一些PHPUnit与团队所用框架的整合,但在整个团队还没有人可以主动推动这个事情,而作为Leader最重要的一种能力应该是“让正确的事情发生”,所以今天开始着手对现有代码的Model进行单元测试用例和代码的编写。
Db测试用例选择了MysqlDump工具生成Mysql专用xml格式文件存储,这样对开发人员来说应该是最方便的。生成的文件类似格式如下:
<?xml version="1.0"?>
<mysqldump xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<database name="bbg_mall">
<table_structure name="admin">
<field Field="id" Type="int(11) unsigned" Null="NO" Key="PRI" Extra="auto_increment" />
<field Field="username" Type="varchar(20)" Null="NO" Key="" Extra="" />
<field Field="password" Type="varchar(32)" Null="NO" Key="" Default="" Extra="" />
<field Field="login_time" Type="int(10)" Null="NO" Key="" Default="0" Extra="" />
<field Field="login_num" Type="int(11)" Null="NO" Key="" Default="0" Extra="" />
<field Field="pid" Type="smallint(6)" Null="YES" Key="" Default="0" Extra="" />
<key Table="admin" Non_unique="0" Key_name="PRIMARY" Seq_in_index="1" Column_name="id" Collation="A" Cardinality="21" Null="" Index_type="BTREE" Comment="" Index_comment="" />
<key Table="admin" Non_unique="1" Key_name="member_id" Seq_in_index="1" Column_name="id" Collation="A" Cardinality="21" Null="" Index_type="BTREE" Comment="" Index_comment="" />
<options Name="admin" Engine="InnoDB" Version="10" Row_format="Compact" Rows="21" Avg_row_length="780" Data_length="16384" Max_data_length="0" Index_length="16384" Data_free="0" Auto_increment="45" Create_time="2015-11-20 11:10:32" Collation="utf8_general_ci" Create_options="" Comment="" />
</table_structure>
<table_data name="admin">
<row>
<field name="id">1</field>
<field name="username">admin</field>
<field name="password">324d1907d9ca6733d399b87affe48c74</field>
<field name="login_time">1448011176</field>
<field name="login_num">1276</field>
<field name="pid">0</field>
</row>
</table_data>
</database>
</mysqldump>
相关命令:
mysqldump -uroot -p --xml your_db_name admin > test/data/Application/Admin/Model/admin.xml
测试什么呢?
无非是增删改查的各种场景,相对于常规框架如TP底层提供的“增删改”,在DbModel中封装过一次后,一般要求能过滤掉异常情况,确保按正常逻辑作用。
“查”则主要是判断各种复杂的sql查询及数据拼装后,与预期的结果是否相符。
php这种动态类型语言,最大的问题就是,很适合一个人开发,但一旦到团队环境中,基于数组的各种随机数据结构,是导致开发效率低下和维护成本上升的最大因素。
单元测试在这种场景下,更多的像是一种证明,告诉团队其他成员我的代码执行后要返回这个格式的结果,我可以证明这一点,具体返回的数据格式,你去找具体的测试用例一看便知。
测试代码
<?php
namespace Admin\Model;
/**
* Generated by PHPUnit_SkeletonGenerator on 2016-06-01 at 15:17:36.
*/
class AdminTest extends \TimeCheer\Test\Database\TestCase
{
/**
* @var Admin
*/
protected $object;
/**
* Sets up the fixture, for example, opens a network connection.
* This method is called before a test is executed.
*/
protected function setUp()
{
parent::setUp();
$this->object = new Admin;
}
protected function getDataSet()
{
return $this->createMySQLXMLDataSet(TEST_PATH . '/data/Application/Admin/Model/admin.xml');
}
/**
* @covers Admin\Model\Admin::getList
* @todo Implement testGetList().
*/
public function testGetList()
{
$this->assertEquals(1, $this->getConnection()->getRowCount('admin'), "Pre-Condition");
}
/**
* @covers Admin\Model\Admin::add
* @todo Implement testAdd().
*/
public function testAdd()
{
$this->assertFalse($this->object->add([]));
//TODO 更多条件测试
}
/**
* @covers Admin\Model\Admin::update
* @todo Implement testUpdate().
*/
public function testUpdate()
{
$this->assertFalse($this->object->update([]));
$result = $this->object->update(['id' => '-2']);
$this->assertFalse($result);
//TODO 更多条件测试
}
/**
* @covers Admin\Model\Admin::del
* @todo Implement testDel().
*/
public function testDel()
{
$this->assertTrue($this->object->del(1));
}
/**
* @covers Admin\Model\Admin::del
* @todo Implement testDel().
*/
public function testDel2()
{
$this->assertFalse($this->object->del(0));
}
测试的效果
- 完善每个方法的过滤机制,确保正确的事情发生、不正确的事情不会发生;
- 意外的发现DbModel框架底层update方法对执行结果的判断不足的bug,即当mysql未发生实际的数据更新时,sql语句本身还是返回true,但affected_rows为0,作为框架来说,必须能正确处理这种情况。
项目中初试PHP单元测试的更多相关文章
- 解决Resharper在Core项目中无法执行单元测试的问题
项目升级core了,resharper最近升级到2018.1版本,但是安装后还是无法直接运行单元测试,昨天小姐姐发了解决方法,贼有用.所以记录一下,给自己以后或者其他遇到此问题的小伙伴用. 解决Re ...
- 项目中创建单元测试—VS2012
我们在每个项目的开发过程中,开发完一个功能,自己首先需要测试一下,VS提供了很方便的测试功能,可以很容易的创建单元测试,但是在VS2012中类名上点击右键没有『创建单元测试』这个菜单,需要先进行设置一 ...
- 【IDEA】单元测试:项目中引入JUnit测试框架+Mock简单了解
一.Junit 使用和说明: 参考:单元测试第三弹--使用JUnit进行单元测试-HollisChuang's Blog http://www.hollischuang.com/archives/17 ...
- Python项目中的单元测试
引入 单元测试负责对最小的软件设计单元(模块)进行验证,unittest是Python自带的单元测试框架. 单元测试与功能测试都是日常开发中必不可少的部分,本文演示了Python中unittest单元 ...
- vue项目中添加单元测试
从网上找了很多例子关于单元测试,都是如何新建项目的时候的添加单元测试,用vue-cli中怎么添加,但是我的项目已经生成了,不能再一次重新初始化,这时如何添加单元测试,这里面遇到了好多坑,写在这里记录一 ...
- .NET 项目中的单元测试
.NET 项目中的单元测试 Intro "不会写单元测试的程序员不是合格的程序员,不写单元测试的程序员不是优秀的工程师." -- 一只想要成为一个优秀程序员的渣逼程序猿. 那么问题 ...
- 在项目中创建单元测试时junit的配置和使用
首先配置项目中AndroidMainfest.xml文件,加入 <instrumentation android:name="android.test.InstrumentationT ...
- 在Silverlight 5 项目中创建单元测试项目
下载安装Silverlight ToolKit:测试框架程序集路径:C:\Program Files (x86)\Microsoft SDKs\Silverlight\v5.0\Toolkit\dec ...
- Maven项目中使用JUnit进行单元测试
1.打开maven项目中的pom.xml,添加JUnit 的jar包 2.在src/test/java下右键新建JUnit Test Cast
随机推荐
- 暂停JS的深入学习
对于JS的掌握程度,已经满足中级前端工程师的需要了,现在需要入门一下后端的基础知识,如nginx服务器一类的知识,方便今后快速开发. 先来nginx,文章.
- GAMIT 10.50在Ubuntu 12.04系统下的安装
转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0225/162.html?1456480908 摘要:GAMIT/GLOBK是一套安装于Unix/L ...
- Atitit 泛型原理与理解attilax总结
Atitit 泛型原理与理解attilax总结 1. 泛型历史11.1.1. 由来11.2. 为什么需要泛型,类型安全21.3. 7.泛型的好处22. 泛型的机制编辑22.1.1. 机制32.1.2. ...
- qqzoneQQ空间漏洞扫描器的设计attilax总结
qqzoneQQ空间漏洞扫描器的设计attilax总结 1.1. 获取对方qq(第三方,以及其他机制)1 1.2. QQ空间的html流程1 1.3. 判断是否有权限1 1.4. 2015年度Web服 ...
- SQL Server排序函数row_number和rank的区别
SQL Server排序函数row_number和rank的区别 直接看测试结果 declare @table table(name varchar(100),amount int, memo var ...
- Django ORM - 001 - 外键表查询主表信息
开始用Django做web开发,我想大家都会遇到同样的问题,那就是如何高效快速的查询需要的数据,MVC都很简单,但是ORM折腾起来就有些费时间,我准备好好研究下Django ORM,所以会有一个系列的 ...
- 【WP开发】实现“摇一摇”功能
尽管我的微信是每八个月登录一次,但我相信各位玩得比我多.微信有一个“摇一摇”功能,这个功能其实是利用了加速度传感器来实现的,这个传感器,我估计再低端的手机都会有的,这是严重基本的传感器. 重力加速度既 ...
- Windows 系统下Git安装图解
简单来说Git是一个免费的.开源的版本控制软件,从功能上讲,跟我们比较熟悉的Subversion(SVN)这类版本控制软件没什么两样.由于工作的需求,需要在WinXP下安装git配合团队完成相应的工作 ...
- .NET面试题解析(05)-常量、字段、属性、特性与委托
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 弱小和无知不是生存的障碍,傲慢才是!——<三体> 常见面试题目: 1. const和reado ...
- javascript类型系统——undefined和null
× 目录 [1]原因 [2]undefined [3]null 前面的话 一般的程序语言,表示空的只有null,但javascript的设计者Brendan Eich却设计了一个undefined,这 ...