php单元测试phpunit入门实例教程


Posted in PHP onNovember 17, 2017

本文实例讲述了php单元测试phpunit。分享给大家供大家参考,具体如下:

这篇文章提供了一些phpunit官方教程没有提到的信息,帮助初学者快速了解php单元测试,在phpunit官网提供了详细的中文教程,可选多种格式下载

phpunit官网地址:https://phpunit.de/

何为单元测试:

指对软件中的基本单元进行测试,如函数、方法等,以检查其返回值或行为是否符合预期;实际中软件是很复杂的,由许多组件构成,执行流程连贯在一起,要进行单元片段的测试,就需要为其提供执行上下文(或者说参数)和环境(比如打桩模拟一些对象)来运行,并监控其行为和返回值,为此我们就需要写出做这件事情的程序代码,这样的代码叫做测试用例,许多测试用例有机结合在一起形成一个整体的测试,又叫做测试套件,被测试的程序代码叫做生产代码。phpunit这个软件就是用来帮助我们写测试用例并进行测试的。

php的单元测试:phpunit

在其官网有详细教程,这里介绍一些补充内容。

首先要明白phpunit软件本身就是由php语言实现,其使用是通过命令行进行的,并不是通过浏览器访问

明白这一点很重要,许多新人被卡在这里。很基础也很简单,但似乎没怎么被提及

在官网下载后得到一个phar文件,关于phar归档文件的介绍可参见前面一篇文章PHP开发之归档格式phar文件概念与用法

请同时下载phpunit使用文档,按照里面的安装方法进行安装,之后在命令行输入以下命令:

phpunit --help

如果显示出了帮助信息即安装成功,在命令行当前目录下建立一个测试用例为yunke.php,内容如下:

<?php
use PHPUnit\Framework\TestCase;
class yunkeTest extends TestCase
{
  public function testPushAndPop()
  {
    $stack = [];
    $this->assertEquals(0, count($stack));
    array_push($stack, 'foo');
    $this->assertEquals('foo', $stack[count($stack) - 1]);
    $this->assertEquals(1, count($stack));
    $this->assertEquals('foo', array_pop($stack));
    $this->assertEquals(0, count($stack));
  }
}
?>

然后在命令行输入以下命令:

phpunit yunke

显示如下内容:

PHPUnit 5.7.12 by Sebastian Bergmann and contributors.
.                                  1 / 1 (100%)
Time: 159 ms, Memory: 7.00MB
OK (1 test, 5 assertions)

恭喜,你已经成功运行了一个单元测试,第一行是作者信息(Sebastian Bergmann这个家伙很喜欢署名啊)

第二行以一个句点开始,表示所有测试成功通过

你可能会疑惑,上面的php代码是怎么回事呢?

那就是一个测试用例,简单的测试了一个数组操作,进行单元测试一般通过以下四步:

1. 针对生产代码类 Class 的测试写在类 ClassTest中。
2. ClassTest(通常)继承自 PHPUnit\Framework\TestCase
3. 测试都是命名为 test* 的公用方法。也可以在方法的文档注释块(docblock)中使用 @test 标注将其标记为测试方法。
4. 在测试方法内,类似于 assertEquals()这样的断言方法用来对实际值与预期值的匹配做出断言判断。

这里你可能会有几个地方迷惑:

1、在注释块中使用的标注,php可以通过反射得到,程序可以利用得到的信息进行配置
2、上列中测试用例代码里面的TestCase类来自哪里?并没有被加载啊?
上文提到phpunit本身是用php语言写成的,打包成了phar供使用,phar是可执行的,执行时首先执行包里面的存根文件stub

你可以按照上文云客的另外一篇phar帖子介绍的方法提取还原phpunit.phar包,或者使用phpstorm这样的ide直接打开

在.phar/stub.php里你将看到存根代码,TestCase类就是在存根代码里面require的“phpunit yunke”这条命令行代码将首先运行phpunit脚本,从存根文件开始执行,然后由phpunit加载测试用例代码

可以看出程序并不是从测试用例脚本开始执行的,现在明白TestCase类哪里来的了吧

通过以上内容再配合官网文档,新手应该可以顺利入门了

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP 和 XML: 使用expat函数(一)
Oct 09 PHP
windows下升级PHP到5.3.3的过程及注意事项
Oct 12 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
Jul 02 PHP
完美的2个php检测字符串是否是utf-8编码函数分享
Jul 28 PHP
PHP反向代理类代码
Aug 15 PHP
PHP中数据库单例模式的实现代码分享
Aug 21 PHP
PHP遍历文件夹与文件类及处理类用法实例
Sep 23 PHP
PHP生成唯一订单号的方法汇总
Apr 16 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
Nov 15 PHP
对laravel in 查询的使用方法详解
Oct 09 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 23 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
Feb 26 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
Nov 17 #PHP
PHP流Streams、包装器wrapper概念与用法实例详解
Nov 17 #PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 #PHP
PHP实现求解最长公共子串问题的方法
Nov 17 #PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 #PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
Nov 17 #PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 #PHP
You might like
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
PHP数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
PHP Try-catch 语句使用技巧
2016/02/28 PHP
Laravel学习基础之migrate的使用教程
2017/10/11 PHP
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
datagrid框架的删除添加与修改
2013/04/08 Javascript
jQuery unbind()方法实例详解
2016/01/19 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
jQuery Select下拉框操作小结(推荐)
2016/07/22 Javascript
Google 地图API Map()构造器详解
2016/08/06 Javascript
JavaScript动态数量的文件上传控件
2016/11/18 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
Web前端框架Angular4.0.0 正式版发布
2017/03/28 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
vuejs element table 表格添加行,修改,单独删除行,批量删除行操作
2020/07/18 Javascript
原生jQuery实现只显示年份下拉框
2020/12/24 jQuery
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
python基础教程之类class定义使用方法
2014/02/20 Python
深入理解Javascript中的this关键字
2015/03/27 Python
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本
2019/02/25 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
python 数据库查询返回list或tuple实例
2020/05/15 Python
Links of London官方网站:英国标志性的珠宝品牌
2017/04/09 全球购物
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
2012/05/24 面试题
What's the difference between an interface and abstract class? (接口与抽象类有什么区别)
2012/10/29 面试题
物流专业大学生的自我鉴定
2013/11/13 职场文书
家长给孩子的表扬信
2014/01/17 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
社区学习雷锋活动总结
2014/04/25 职场文书