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(1)
Oct 09 PHP
linux下 C语言对 php 扩展
Dec 14 PHP
php 图像函数大举例(非原创)
Jun 20 PHP
php正则表达匹配中文问题分析小结
Mar 25 PHP
基于php验证码函数的使用示例
May 03 PHP
PHP中替换键名的简易方法示例详解
Jan 07 PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 PHP
用 Composer构建自己的 PHP 框架之构建路由
Oct 30 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
php文件上传、下载和删除示例
Aug 28 PHP
php语言注释,单行注释和多行注释
Jan 21 PHP
PHP中的访问修饰符简单比较
Feb 02 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实现的功能是显示8条基色色带
2006/10/09 PHP
destoon实现VIP排名一直在前面排序的方法
2014/08/21 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
php找出指定范围内回文数且平方根也是回文数的方法
2015/03/23 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
JavaScript使用cookie
2007/02/02 Javascript
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
Javascript读取cookie函数代码
2010/10/16 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
2011/08/20 Javascript
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
js性能优化技巧
2015/11/29 Javascript
分享一个原生的JavaScript拖动方法
2016/09/25 Javascript
轻松理解Javascript变量的相关问题
2017/01/20 Javascript
详解JS转换数值函数Number()、parseInt()、parseFloat()
2018/08/24 Javascript
微信小程序 textarea 层级过高问题简单解决方案
2019/10/14 Javascript
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
python实现基于SVM手写数字识别功能
2020/05/27 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
python 定义类时,实现内部方法的互相调用
2019/12/25 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
波比布朗英国官网:Bobbi Brown英国
2017/11/13 全球购物
Currentbody澳大利亚:美容仪专家
2019/11/11 全球购物
优秀教师自我评价范文
2014/09/27 职场文书
泰山导游词
2015/02/02 职场文书
党员转正党支部意见
2015/06/02 职场文书
公司人力资源管理制度
2015/08/05 职场文书
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android