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
人大复印资料处理程序_查询篇
Oct 09 PHP
php&amp;java(一)
Oct 09 PHP
php桌面中心(二) 数据库写入
Mar 11 PHP
PHP中break及continue两个流程控制指令区别分析
Apr 18 PHP
php跨域cookie共享使用方法
Feb 20 PHP
如何让CI框架支持service层
Oct 29 PHP
php中ftp_chdir与ftp_cdup函数用法
Nov 18 PHP
PHP判断IP并转跳到相应城市分站的方法
Mar 25 PHP
基于thinkPHP框架实现留言板的方法
Oct 17 PHP
PHP输出XML格式数据的方法总结
Feb 08 PHP
php文件上传类的分享
Jul 06 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
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
JavaScript对象、属性、事件手册集合方便查询
2010/07/04 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
探讨JavaScript中声明全局变量三种方式的异同
2013/12/03 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
jQuery mobile 移动web(6)
2015/12/20 Javascript
jQuery Mobile动态刷新页面样式的实现方法
2016/05/28 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
JS验证不重复验证码
2017/02/10 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
Node.js 使用流实现读写同步边读边写功能
2017/09/11 Javascript
jQuery实现计算器功能
2020/10/19 jQuery
[03:24]2014DOTA2国际邀请赛 神秘商店生意火爆
2014/07/18 DOTA
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
python把转列表为集合的方法
2019/06/28 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
matplotlib.pyplot.matshow 矩阵可视化实例
2020/06/16 Python
python获取本周、上周、本月、上月及本季的时间代码实例
2020/09/08 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
2020/11/10 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
英国办公家具网站:Furniture At Work
2019/10/07 全球购物
请解释接口的显式实现有什么意义
2012/05/26 面试题
资产经营总监岗位职责
2013/12/04 职场文书
廉洁教育学习材料
2014/05/19 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
变长双向rnn的正确使用姿势教学
2021/05/31 Python