一、phpunit和单元测试
单元测试是对单独的代码对象进行测试的过程,比如对函数、类、方法进行测试。单元测试可以使用任意一段已经写好的测试代码,也可以使用一些已经存在的测试框架,比如phpunit,单元测试框架提供了一系列共同、有用的功能来帮助人们编写自动化的检测单元,例如检查一个实际的值是否符合我们期望的值的断言。单元测试框架经常会包含每个测试的报告,以及给出你已经覆盖到的代码覆盖率。
搞单元测试的大概步骤是:编写待测试类,编写测试用例类,编写测试类,测试。
二、phpunit安裝
安装方法简单,参考官网。
三、基本使用示例
1.编写待测试类,假如有简单例子:用户登录,花费金币。类代码如
<?php
class User
{
private $user_array;
public function __construct()
{
$this->user_array = array(
1 => array('name' => 'tjj', 'psw' => '123456', 'rc_coins' => 100),
2 => array('name' => 'rc', 'psw' => '789', 'rc_coins' => 10)
);
}
public function login()
{
$ret = $this->check($_POST['name'], $_POST['pwd']);
$_SESSION['uid'] = $ret ? $ret : null;
return $ret;
}
public function check($name = '', $psw = '')
{
$ret = false; /*print($psw);*/
if (!$name || !$psw) {
return $ret;
}
if ($name == 'tjj' && $psw == '123456') {
$ret = 1;
}
return $ret;
}
public function get_user_info($uid = '')
{
$ret = false;
if (!$uid) {
return $ret;
}
return json_encode($this->user_array[$uid]);
}
public function check_user_pay($user_info, $cost)
{
$ret = false;
if (empty($user_info) || !$cost) {
return $ret;
}
return intval($user_info['rc_coins']) - intval($cost);
}
}
2.针对待测类编写测试类
<?php
class UserTest extends PHPUnit_Framework_TestCase
{
private $u;
public function setUp()
{
$this->u = new User();
$_POST['name'] = 'tjj';
$_POST['pwd'] = '123456';
}
public function tearDown()
{
unset($this->u);
}
public function testLogin()
{
$ret = $this->u->login();
$this->assertEquals(true, $ret !== false);// Assert
return $ret;
}
/**
* @depends testLogin
*/
public function testGetUser($uid)//testGetUser依赖方法testLogin获取用户信息后回传
{
$ret = $this->u->get_user_info($uid);
$this->assertEquals(true, $ret !== false);// Assert
return $ret;
}
/**
* @depends testGetUser
* @dataProvider additionProvider
*/
public function testCheckUserPay($expect, $money, $user_info) //testCheckUserPay依赖方法testGetUser获取用户信息,数据供给器提供测试期望值和消费值
{
$user_info = json_decode($user_info, true);
$ret = $this->u->check_user_pay($user_info, $money);
$this->assertEquals($expect, $ret);// Assert
}
//数据供给器
public function additionProvider()
{
return array(
't1' => array(0, 100),//t1为名称,0为断言期望值,100为耗掉的金币值
't2' => array(10, 90),
't3' => array(-10, 120),
't4' => array(30, 70),
);
}
}
3.运行测试
phpunit --bootstrap src/autoload.php test/UserTest.php
假如把登录密码设置错误,testLogin断言失败,那么依赖的testLogin的方法(testGetUser和testCheckUserPay)断言将全部跳过。
4.生成代码覆盖率报告
phpunit --bootstrap src/autoload.php --coverage-html ./html test/UserTest.php