文档章节

phpunit简单使用

tanjj
 tanjj
发布于 2017/08/25 14:51
字数 630
阅读 32
收藏 0

一、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

© 著作权归作者所有

tanjj
粉丝 18
博文 28
码字总数 29300
作品 0
广州
程序员
私信 提问
PHPUnit 入门篇

PHPUnit是什么? 它是一款轻量级的php测试框架 为什么要用PHPUnit? 1. facebook在用 2. 可以通过命令操控测试脚本 3. 可以测试性能 4. 可以测试代码覆盖率 5. 可以自动化的更新测试用例的参...

鉴客
2011/11/30
2.5K
1
windows下安装pear和PHPUnit

想安装phpunit那么就要安装pear,网上说在php安装目录中找到go-pear.bat然后双击,但是很扯的是我的安装目录中真的没有,那么咋办捏。。继续问度娘,原来还真有和我一样的。参考这里的安装成...

王纪光
2013/11/30
3.5K
0
opensuse13.1 下phpunit+selenium

正在学习yii框架,在编写php代码的时候,要用到单元测试。之前只听说单元测试,没怎么了解过,这次要用到了。在yii框架中使用phpUnit进行单元测试真的很方便。从Yii1.1版本起,Yii已经紧密结...

Ron-Liu
2013/11/28
152
0
进阶篇:如何为ThinkPHP5编写优质的单元测试?

前言 在项目开发中,需要使用到ThinkPHP 5,为了编写单元测试,解决了几个难题,特此纪录分享一下。 难点1:TP5自带的单元测试感觉不好用,如何使用纯粹的原生PHPUnit? 在看云上,有TP5官方...

暗夜在火星
05/08
72
0
PHPUnit实践001--环境搭建及简单用法

windows环境下搭建PHPUnit可以直接下安装包傻瓜安装,博主项目使用的是php5.6 所以下载了3.7的phpunit 用composer安装phpunit composer require --dev phpunit/phpunit ^6.2 phpunit 用xml做...

lgy5451263
2018/06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
7
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
9
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部