hyperf 十二、自动化测试
文档教程:Hyperf
用co-phpunit提供测试,在composer中测试。
"scripts": {"test": "co-phpunit --prepend test/bootstrap.php -c phpunit.xml --colors=always",
}
测试中使用Hyperf\Testing\Client模拟请求,该类调用Hyperf\HttpServer\Server中的request()方法获取请求数据。
#HyperfTest\HttpTestCase
use Hyperf\Testing\Client;
use PHPUnit\Framework\TestCase;abstract class HttpTestCase extends TestCase
{/*** @var Client*/protected $client;public function __construct($name = null, array $data = [], $dataName = ''){parent::__construct($name, $data, $dataName);$this->client = make(Client::class);}
public function __call($name, $arguments){return $this->client->{$name}(...$arguments);}
}#HyperfTest\Cases\ExampleTest
class ExampleTest extends HttpTestCase
{
}#Hyperf\Testing\Client
use Hyperf\HttpServer\Server;
class Client extends Server
{protected $baseUri = 'http://127.0.0.1/';public function __construct(ContainerInterface $container, PackerInterface $packer = null, $server = 'http'){parent::__construct($container, $container->get(HttpDispatcher::class), $container->get(ExceptionHandlerDispatcher::class), $container->get(ResponseEmitter::class));$this->packer = $packer ?? new JsonPacker();$this->initCoreMiddleware($server);$this->initBaseUri($server);}public function get($uri, $data = [], $headers = []){$response = $this->request('GET', $uri, ['headers' => $headers,'query' => $data,]);return $this->packer->unpack((string) $response->getBody());}
}
相关方法:
Hyperf\Testing\Client::get($uri, $data = [], $headers = [])
Hyperf\Testing\Client::post($uri, $data = [], $headers = [])
Hyperf\Testing\Client::put($uri, $data = [], $headers = [])
Hyperf\Testing\Client::delete($uri, $data = [], $headers = [])
Hyperf\Testing\Client::json($uri, $data = [], $headers = [])
Hyperf\Testing\Client::file($uri, $data = [], $headers = [])
Hyperf\Testing\Client::request(string $method, string $path, array $options = [])
Hyperf\Testing\Client::initRequest(string $method, string $path, array $options = [])
Hyperf\Testing\Client::sendRequest(ServerRequestInterface $psr7Request)
具体断言函数参照phpunit。
一、编写测试
namespace HyperfTest\Cases;use HyperfTest\HttpTestCase;
/*** @internal* @coversNothing*/
class ExampleTest extends HttpTestCase
{public function testExample(){$this->assertTrue(true);//var_dump($this->get('/'));$this->assertTrue(is_array($this->get('/')));}
}
composer test -- --filter=test
因为co-phpunit脱胎于phpunit,所以filter其实也是phpunit选项。
二、测试替身
测试替身文章原文:PHPUnit 手册 – 第 9 章 测试替身
测试替身用mockery实现。
mockery:
composer地址:mockery/mockery - Packagist
文档地址:Mockery — Mockery Docs 1.0-alpha documentation
github地址:https://github.com/mockery/mockery
创建的类名必须设置名称以Test结尾,否则不会调用。
#./phpunit.xml 限制后缀内容
<testsuites><testsuite name="Tests"><directory suffix="Test.php">./test</directory></testsuite>
</testsuites># composer 命令配置
"scripts": {"test": "co-phpunit --prepend test/bootstrap.php -c phpunit.xml --colors=always",
}
declare (strict_types = 1);
namespace HyperfTest\Cases;use App\Api\TestApi;
use App\Service\TestingService;
use HyperfTest\HttpTestCase;
use Hyperf\Di\Container;
use Mockery;/*** @internal* @coversNothing*/
class Example2Test extends HttpTestCase
{protected function tearDown(): void{Mockery::close();}public function test2(){$container = $this->getContainer();$res = $container->get(TestingService::class)->test();$this->assertEquals(1, $res['status']);}/*** @return Container*/protected function getContainer(){$container = Mockery::mock(Container::class);$apiStub = $this->createMock(TestApi::class);$apiStub->method('test')->willReturn(['status' => 1,]);//旧版//$container->shouldReceive('get')->with(TestingService::class)->andReturn(new TestingService($apiStub));//新版$container->allows()->get(TestingService::class)->andReturn(new TestingService($apiStub));return $container;}
}相关文章:
hyperf 十二、自动化测试
文档教程:Hyperf 用co-phpunit提供测试,在composer中测试。 "scripts": {"test": "co-phpunit --prepend test/bootstrap.php -c phpunit.xml --colorsalways", } 测试中使用Hyperf\Testing\Client模拟请求,该类调用Hyp…...
dblink简单使用
1.配置tns [oraclepg1 admin]$ cat tnsnames.ora 19c (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.56.100)(PORT 1521)))(CONNECT_DATA (SERVICE_NAME orcl)))11g (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 192.168.56…...
Typescript 第十一章 与JavaScript互操作(外参变量声明,外参类型声明,外参模块声明)
第十一章 与JavaScript互操作 本章讨论在实际开发中如何编写Typescript。有可能你真正把代码从无类型语言向Typescript迁移。也有可能要使用第三方库。 使用类型声明逐步从JavaScript迁移到Typescript使用第三方JavaScript和Typescript 11.1 类型声明 类型声明文件的扩展名…...
从0到1框架搭建,Python+Pytest+Allure+Git+Jenkins接口自动化框架(超细整理)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 接口测试是对系统…...
在windows配置redis的一些错误及解决方案
目录 Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException:用客户端Redis Desktop Manager一样的密码端口,是可以正常连接的,但是运行java程序之后使用接口请求就会报错 Unable to connect to Redis; nested e…...
真机搭建中小网络
这是b站上的一个视频,演示了如何搭建一个典型的中小网络,供企业使用 一、上行端口:上行端口就是连接汇聚或者核心层的口,或者是出广域网互联网的口。也可理解成上传数据的端口。 二、下行端口:连接数据线进行下载的端…...
Linux:shell脚本:基础使用(1)
Shell的作用 命令解释器,“翻译官”,介于系统内核与用户之间,负责解释命令行 用户的登录Shell 登录后默认使用的Shell程序,一般为 /bin/bash 不同Shell的内部指令、运行环境等会有所区别 cat /etc/shells 编写第一个Shell脚本 …...
carla中lka实现(一)
前言: 对于之前项目中工作内容进行总结,使用Carla中的车辆进行lka算法调试,整体技术路线: ①在Carla中生成车辆,并在车辆上搭载camera,通过camera采集图像数据; ②使用图像处理lka算法&#…...
常见的数据结构(顺序表、顺序表、链表、栈、队列、二叉树)
线性表(Linear List) 1.什么是线性表 2.线性表的特点 3.线性表的基本运算 顺序表 1.什么是顺序表 2.时间复杂度: 链表 1.什么是链表 2.单向链表 3. 双向链表 4.ArrayList和LinkedList的使用 栈Stack 1.什么是栈 2.栈的基本方法 队列…...
(12)理解委托,反射,Type,EvenInfo,插件, 组合枚举,BindingFlags,扩展方法及重载,XML认识
一、复习委托事件 1、委托复习。 private delegate int MyDelegate(int a, int b); //1.定义委托类型private static void Main(string[] args){MyDelegate md new MyDelegate(AddDelegate);//2.声明委托变量int result md(1, 2);//3.调用委托Console.WriteLine(result);Cons…...
软件建设方案技术方案实施方案密码评测方案等保测评方案人员培训方案项目建设与运行管理项目招标方案模板目录
第一章 项目概述 1.项目名称(包含项目全称和简称) 2.项目建设单位及负责人、项目责任人 3.项目建设依据 (1)政策依据(主要从国家、省、市、行业部门相关的政策文件要求等方面进行描述) (2)技术标准 4.项目建设目标、建设任务 5.项目主要建设内容、规模、建设周期…...
pytorch中torch.einsum函数的详细计算过程图解
第一次见到 rel_h torch.einsum(“bhwc,hkc->bhwk”, r_q, Rh)这行代码时,属实是懵了,网上找了很多博主的介绍,但都没有详细的说明函数内部的计算过程,看得我是一头雾水,只知道计算结果的维度是如何变化的…...
【iOS】App仿写--天气预报
文章目录 前言一、首页二、搜索界面三、添加界面四、浏览界面总结 前言 最近完成了暑假的最后一个任务——天气预报,特此记录博客总结。根据iPhone中天气App的功能大致可以将仿写的App分为四个界面——首页,搜索界面,添加界面,浏…...
快速远程桌面控制公司电脑远程办公
文章目录 第一步第二步第三步 远程办公的概念很早就被提出来,但似乎并没有多少项目普及落实到实际应用层面,至少在前几年,远程办公距离我们仍然很遥远。但2019年末突如其来的疫情,着实打了大家一个措手不及。尽管国内最初的大面积…...
亚信科技AntDB数据库专家出席数据库标准研讨会并参与研讨
2023年7月12日,全国信息技术标准化技术委员会数据库标准工作组(SAC/TC28/WG31)秘书处组织召开数据库标准研讨会,会议围绕数据库标准工作组2023年上半年开展的标准编制情况进行交流。亚信科技AntDB数据库相关专家出席会议ÿ…...
【我们一起60天准备考研算法面试(大全)-第三十四天 34/60】【前缀和】【北邮】
专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示&#…...
【数据分析】numpy (二)
numpy作为数据分析,深度学习常用的库,本篇博客我们来介绍numpy的一些进阶用法: 一,numpy的常用简单内置函数: 1.1求和: a np.array([[1, 2],[3, 4]]) np.sum(a)10 1.2求平均值: np.mean(a…...
Vue3小案例—v-model 双向数据绑定实现动态列表增加和删除
v-model双向绑定的原理: v-model 是Vue.js 提供的一个指令,用于实现双向数据绑定,它可以将表单元素的值与Vue实例的数据绑定在一起,当表单元素的值发生改变时,Vue实例的数据也会随之更新,反之亦然。 …...
MySQL 重置root 密码
5.7 版本 首先要把服务mysql57 关闭 net stop MySQL57 在安装的mysql57的程序的bin中 运行cmd(管理员运行) mysqld --defaults-file‘mysql存放数据的位置\my.ini’ --skip-grant-tables 上图 错误 注意:如果遇到mysqld: Can’t change dir…...
OpenCV图像处理技巧之空间滤波
1. 引言 再次问好,图像处理爱好者们!🌟 在前面的章节中,我们学习了图像处理的基础知识,并展现了图像增强的魅力。在这一节中,我们将更深入地研究空间滤波技术。 闲话少说,我们直接开始吧&#…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
