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获取当前文件所在目录 getcwd()函数
May 13 PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
Sep 30 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
Jun 02 PHP
表格展示无限级分类(PHP版)
Aug 21 PHP
PHP 文件编程综合案例-文件上传的实现
Jul 03 PHP
php根据分类合并数组的方法实例详解
Nov 06 PHP
简单谈谈php中的unicode和utf8编码
Jun 10 PHP
Smarty模板变量调节器用法分析
May 23 PHP
简单实现php上传文件功能
Sep 21 PHP
多个Laravel项目如何共用migrations详解
Sep 25 PHP
PHP工厂模式的日常使用
Mar 20 PHP
php常用日期时间函数实例小结
Jul 04 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设计模式之调解者模式的深入解析
2013/06/13 PHP
深入浅析PHP无限极分类的案例教程
2016/05/09 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
JavaScript 三种不同位置代码的写法
2009/10/25 Javascript
JavaScript中获取元素索引的函数
2010/09/10 Javascript
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
js有关元素内容操作小结
2011/12/20 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
学习JavaScript设计模式之策略模式
2016/01/12 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
JavaScript队列结构Queue实现过程解析
2020/03/07 Javascript
[54:29]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第二场
2018/04/09 DOTA
Python中的面向对象编程详解(上)
2015/04/13 Python
Python读写文件方法总结
2015/06/09 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
Python pip install如何修改默认下载路径
2020/04/29 Python
css3制作动态进度条以及附加jQuery百分比数字显示
2012/12/13 HTML / CSS
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
深入解析HTML5使用SVG图像时的viewBox属性用法
2015/09/02 HTML / CSS
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
优秀员工评语
2014/02/10 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
MySQL索引知识的一些小妙招总结
2021/05/10 MySQL
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记