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中的字符串函数
Nov 24 PHP
PHP 开源框架22个简单简介
Aug 24 PHP
PHP IF ELSE简化/三元一次式的使用
Aug 22 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
php引用返回与取消引用的详解
Jun 08 PHP
php读取excel文件的简单实例
Aug 26 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
Jun 19 PHP
php简单操作mysql数据库的类
Apr 16 PHP
PHPUnit测试私有属性和方法功能示例
Jun 12 PHP
PHP析构函数destruct与垃圾回收机制的讲解
Mar 22 PHP
PHP抽象类与接口的区别实例详解
May 09 PHP
Yii框架参数配置文件params用法实例分析
Sep 11 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
乐信RP2100的电路分析和打磨
2021/03/02 无线电
关于文本留言本的分页代码
2006/10/09 PHP
php利用cookies实现购物车的方法
2014/12/10 PHP
拖动一个HTML元素
2006/12/22 Javascript
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
jQuery 自定义函数写法分享
2012/03/30 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
简述JavaScript的正则表达式中test()方法的使用
2015/06/16 Javascript
手机图片预览插件photoswipe.js使用总结
2016/08/25 Javascript
基于jQuery ligerUI实现分页样式
2016/09/18 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
Node.js设置CORS跨域请求中多域名白名单的方法
2017/03/28 Javascript
react-native-fs实现文件下载、文本存储的示例代码
2017/09/22 Javascript
JavaScript实现的超简单计算器功能示例
2017/12/23 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
nodejs分离html文件里面的js和css的方法
2019/04/09 NodeJs
详解微信小程序开发聊天室—实时聊天,支持图片预览
2019/05/20 Javascript
JS实现横向轮播图(中级版)
2020/01/18 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
浅谈Python对内存的使用(深浅拷贝)
2018/01/17 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
django-filter和普通查询的例子
2019/08/12 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
Python定时器线程池原理详解
2020/02/26 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
Python字典实现伪切片功能
2020/10/28 Python
使用纯HTML5编写一款网页上的时钟的代码分享
2015/11/16 HTML / CSS
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
深圳茁壮笔试题
2015/05/28 面试题
会展中心部门工作职责
2013/11/27 职场文书
生物科学专业自荐书
2014/06/20 职场文书
小班上学期个人总结
2015/02/12 职场文书
食堂管理制度范本
2015/08/04 职场文书
python实现手机推送 代码也就10行左右
2022/04/12 Python
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis