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中$_SERVER的详细参数与说明
Jul 29 PHP
PHP 数组排序方法总结 推荐收藏
Jun 30 PHP
解析php时间戳与日期的转换
Jun 06 PHP
PHP如何利用P3P实现跨域
Aug 24 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
Jun 19 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
Sep 23 PHP
PHP匿名函数和use子句用法实例
Mar 16 PHP
PHP自定义函数格式化json数据示例
Sep 14 PHP
php+ajax+json 详解及实例代码
Dec 12 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
Jan 11 PHP
php获取数据库中数据的实现方法
Jun 01 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数组函数序列之array_values() 获取数组元素值的函数与方法
2011/10/30 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
AngularJs基于角色的前端访问控制的实现
2016/11/07 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
vue获取input输入值的问题解决办法
2017/10/17 Javascript
一步步教会你微信小程序的登录鉴权
2018/04/09 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
9102了,你还不会移动端真机调试吗
2019/03/25 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
2019/10/21 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
Python3实现从文件中读取指定行的方法
2015/05/22 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
python学习之hook钩子的原理和使用
2018/10/25 Python
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
python实现大量图片重命名
2020/03/23 Python
在Python中等距取出一个数组其中n个数的实现方式
2019/11/27 Python
Python如何使用argparse模块处理命令行参数
2019/12/11 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
pycharm如何设置官方中文(如何汉化)
2020/12/29 Python
蔻驰意大利官网:COACH意大利
2019/01/16 全球购物
运动会入场词50字
2014/02/20 职场文书
政法学院毕业生求职信
2014/02/28 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
向国旗敬礼学生寄语大全
2014/09/30 职场文书
群众路线查摆问题及整改措施
2014/10/10 职场文书
二手车交易协议书标准版
2014/11/16 职场文书
安全生产先进个人事迹材料
2014/12/30 职场文书
《确定位置》教学反思
2016/02/18 职场文书