ThinkPHP5与单元测试PHPUnit使用详解


Posted in PHP onFebruary 23, 2020

thinkphp5.0 是 tp 发展路线第一个支持 composer 的。tp 有自己的载入机制,composer 也有自己的载入机制。

官方提供了 think-testing 组件可以通过 composer require topthink/think-testing 1.* 安装,但我对这个测试组件不是很满意,原因是它每个测试都是模拟成 http 请求。这也就意味着对于一些特定函数,还得封装到控制器中或者路由,该控制器还得控制它生产环境不能对外开放。thinkphp5.0 是 tp 发展路线第一个支持 composer 的。tp 有自己的载入机制,composer 也有自己的载入机制。

PHPUnit 是一个用PHP编程语言开发的开源软件,是一个单元测试框架。PHPUnit由Sebastian Bergmann创建,源于Kent Beck的SUnit,是xUnit家族的框架之一。

单元测试是对单独的代码对象进行测试的过程,比如对函数、类、方法进行测试。单元测试可以使用任意一段已经写好的测试代码,也可以使用一些已经存在的测试框架,比如JUnit、PHPUnit或者Cantata++,单元测试框架提供了一系列共同、有用的功能来帮助人们编写自动化的检测单元,例如检查一个实际的值是否符合我们期望的值的断言。单元测试框架经常会包含每个测试的报告,以及给出你已经覆盖到的代码覆盖率。

总之一句话,使用 phpunit 进行自动测试,会使你的代码更健壮,减少后期维护的成本,也是一种比较标准的规范,现如今流行的PHP框架都带了单元测试,如Laraval,Symfony,Yii2等,单元测试已经成了标配。

另外,单元测试用例是通过命令操控测试脚本的,而不是通过浏览器访问URL的。

项目内安装PHPUnit

使用 composer 方式安装 PHPUnit 项目根目录下执行下面这段代码

composer require phpunit/phpunit

自动下载适配版本  我下载的时4.8.36

ThinkPHP5与单元测试PHPUnit使用详解

ThinkPHP5与单元测试PHPUnit使用详解

将 F:\wamp\wamp\www\tp5\vendor\bin 添加加到 PATH 环境变量中(这样PHPunit全局生效)

ThinkPHP5与单元测试PHPUnit使用详解

PHPUnit简单用法

1、单个文件测试

根目录下创建目录tests

ThinkPHP5与单元测试PHPUnit使用详解

新建文件 FirstTest.php,编辑如下: 

<?php
/**
 * 1、引入autoload.php文件
 * 2、测试案例
 *
 *
 */
namespace App\tests;
require_once __DIR__ . '/../vendor/autoload.php';
 
 
use PHPUnit\Framework\TestCase;
 
 
class FirstTest extends TestCase
{
  public function testTure()
  {
    $stack = [];
    $this->assertEquals(0, count($stack));
  }
}

代码解释:

FirstTest为测试类FirstTest继承于 PHPUnit\Framework\TestCase测试方法testTure(),测试方法必须为public权限,一般以test开头,或者你也可以选择给其加注释@test来表在测试方法内,类似于 assertEquals() 这样的断言方法用来对实际值与预期值的匹配做出来以此判断方法是否正确

命令行执行:
tests目录下 执行  >phpunit FirstTest     命令 测试文件命名

ThinkPHP5与单元测试PHPUnit使用详解

测试项目内方法 

tp5项目下的控制器在  F:\wamp\wamp\www\tp5\application\index\controller 文件夹下 写一个简单的方法

ThinkPHP5与单元测试PHPUnit使用详解

在tests内写一个IndexTest.php

<?php
 
namespace App\tests;
require_once __DIR__ . '/../vendor/autoload.php';
 
use PHPUnit\Framework\TestCase;
use app\index\controller\Index;
 
 
class IndexTest extends TestCase
{
  public function testSum()
  {
    $obj = new Index;
    $this->assertEquals(6, $obj->index(2,3));
 
  }
 
}

执行后的结果  成功!

ThinkPHP5与单元测试PHPUnit使用详解

如果我在index.php,和IndexTest.php都故意写错 

ThinkPHP5与单元测试PHPUnit使用详解

ThinkPHP5与单元测试PHPUnit使用详解

返回结果  会有错误位置

ThinkPHP5与单元测试PHPUnit使用详解

其他用法

其他用法请参考官网:PHPUnit中国官网 

PHP 相关文章推荐
PHP的栏目导航程序
Oct 09 PHP
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
ThinkPHP实现批量删除数据的代码实例
Jul 02 PHP
php结合安卓客户端实现查询交互实例
May 05 PHP
php获取开始与结束日期之间所有日期的方法
Nov 29 PHP
关于PHP定时发送服务的解决办法
Apr 23 PHP
Thinkphp 空操作、空控制器、命名空间(详解)
May 05 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 PHP
Thinkphp5+uploadify实现的文件上传功能示例
May 26 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
Oct 22 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
PHP 对接美团大众点评团购券(门票)的开发步骤
Apr 03 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 #PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 #PHP
php实现通过stomp协议连接ActiveMQ操作示例
Feb 23 #PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 #PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 #PHP
php7 图形用户界面GUI 开发示例
Feb 22 #PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 #PHP
You might like
解析php中static,const与define的使用区别
2013/06/18 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
PHP图片处理之使用imagecopyresampled函数裁剪图片例子
2014/11/19 PHP
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
jQuery 1.4 15个你应该知道的新特性(译)
2010/01/24 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
js小数运算出现多位小数如何解决
2015/10/08 Javascript
html+javascript+bootstrap实现层级多选框全层全选和多选功能
2017/03/09 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python杀死一个线程的方法
2015/09/06 Python
python 生成器协程运算实例
2017/09/04 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
tensorflow 获取变量&amp;打印权值的实例讲解
2018/06/14 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
Python中函数参数调用方式分析
2018/08/09 Python
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
pycharm 取消默认的右击运行unittest的方法
2018/11/29 Python
Python for循环与getitem的关系详解
2020/01/02 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
python实现最速下降法
2020/03/24 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
解析html5 canvas实现背景鼠标连线动态效果代码
2019/06/17 HTML / CSS
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
EGO Shoes美国/加拿大:英国时髦鞋类品牌
2018/08/04 全球购物
超市创业计划书
2014/04/24 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
六年级数学教学反思
2016/02/16 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书