前段时间的一个项目中,由于开发工程师时间比较紧,没时间进行单元测试。所以我临时替补作单元测试。个人对phpunit了解不是很深入,本文只是对phpunit框架做简要介绍并写一些使用的体验。有误之处还请多多指证。
和其他的Xunit测试框架一样,phpunit框架主要分为以下部分:
TestCase --测试用例
TestSuite --测试套件(我习惯称其为测试用例集)
Assert--断言(我习惯称其为验证方式)
TestResult--测试结果
对于testcase,phpunit中除了一般的testcase,还包含了Incompletetestcase(未完成的)和skiptestcase(跳过的测试用例)。
testcase是单元测试的基本组成部分,每个testcase均包含以下部分:
Setup()---测试前的初始化,执行每个testMethod前均会执行
Teardown()--测试完成后恢复,执行完每个testMethod后均会执行
testMethod()--测试方法(测试点)
写phpunit测试脚本时,可以通过phpunit Skeleton 生成单元测试的脚本结构,然后在结构中填写测试用例。
如果不用skeleton生成,自己写也很方便。
phpunit的测试文件包含以下部分:
引入必要的文件
require 'x.php'--被测试的php文件
rquire 'phpunitpathphpunitframework'--- phpunit的framewok文件
创建一个从phpunit frame继承的类
class XXtest extends PHPUnit_Framework_TestCase
[初始化公共的参数]
public $para1='';
public $para2='';
写setup和teardown函数
public function setUp() {}
public function tearDown() {}
注意,每运行一个test的函数,均会首先运行setup,每运行完一个函数,均会运行teardown. 写这2个函数时需要注意。
下一步是写测试函数了,比如测试
public function sum(a,b)
{return a+b;}
写测试函数时和测试用例是对应的,我们首先测试正常情况下求和是否正确,testXX函数可以如下:
public function testSumNormal ()
{
coding....
assertSame(expectresult,actualcode,message)
}
所有的测试函数均已test开头,一般通过assert..验证结果是否正确。
写完单元测试脚本后,下一步是执行测试,简单的命令是:phpunit xxx.php 更加详细的命令如下: phpunit --log-xml(log 文件格式) 文件路径/文件名 --coverage-html(代码覆盖文件格式) 文件路径/文件名 单元测试用例类 单元测试文件 如:phpunit --log-xml path/createAlbumlog --coverage-html path/logs/ createAlbumtest createAlbum.php 命令执行过程中,.--表示成功,e--代表error, f--代表失败, 执行完成后会显示测试用例成功、失败和出错情况。也可以通过查看log查看测试情况,coverage文件可以查看单元测试脚本对测试文件代码覆盖率情况。
自己感觉单元测试过程中需注意以下几个方面:
1、各测试用例(testXXX)的数据耦合度要低。如果耦合度较高的话,如果前一个测试用例失败的话,之后的测试用例会出现error,无法继续。
2、测试用例尽量覆盖各逻辑分支,保证测试覆盖率。
3、测试用例设计和非单元测试的用例设计方法一致,针对一个方法测试需包含:正常测试、异常测试和边界测试等。
4、合理的利用setUp合tearDown, 每执行一个testXX时,都首先运行setUP,执行完testXX后,都会运行tearDown, 因此可以把各个测试用例开始都需要初始化且初始化值一样的参数放到setUP中,而执行完后需要unset的参数放到tearDown函数中。
5、用phpunit skelon 生成测试框架时,只有.php文件才可以,测试其他格式的文件如 inc格式文件无法生成的。可以修改文件名后在生成。