1、phpunit和单元测试php
单元测试是对单独的代码对象进行测试的过程,好比对函数、类、方法进行测试。单元测试能够使用任意一段已经写好的测试代码,也能够使用一些已经存在的测试框架,好比phpunit,单元测试框架提供了一系列共同、有用的功能来帮助人们编写自动化的检测单元,例如检查一个实际的值是否符合咱们指望的值的断言。单元测试框架常常会包含每一个测试的报告,以及给出你已经覆盖到的代码覆盖率。html
搞单元测试的大概步骤是:编写待测试类,编写测试用例类,编写测试类,测试。json
二、phpunit安裝bootstrap
安装方法简单,参考官网。框架
3、基本使用示例ide
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.phpui
假如把登陆密码设置错误,testLogin断言失败,那么依赖的testLogin的方法(testGetUser和testCheckUserPay)断言将所有跳过。
4.生成代码覆盖率报告
phpunit --bootstrap src/autoload.php --coverage-html ./html test/UserTest.php