java 单机接口限流处理方案
977
2022-11-20
本文目录一览:
接口测试最近几年被炒的火热了,越来越多的测试同行意识到接口测试的重要性。接口测试为什么会如此重要呢? 主要是平常的功能点点点,大家水平都一样,是个人都能点,面试时候如果问你平常在公司怎么测试的,你除了说点点点,还能说什么呢,无非就是这个项目点完了点那个项目, 这就是为什么各行各业的只要手指能点得动的人都来转行软件测试了。面试的时候面试官希望你除了点点点,还能更深入一点的思考页面上看不到的功能,也就是接口测试了。接口是看不见的,但是可以访问!
DNS是域名系统(Domain Name System) ,DNS是用来做域名解析的,它会在你上网输入网址后,把它转换成IP,然后去访问对方服务器;没有它,你想上百度就要记住百度的IP,但有了DNS的处理,你只需要记住对应网站的域名,即网址就可以了。
HTTP协议:超文本传输协议,是基于TCP的协议,默认为80端口。它的作用是用来规定客户端和服务器的数据传输格式。是一种用于请求与响应模式的、无状态、无连接 的应用层协议。 由于HTTP协议是一种请求-响应模式,所以一般需要关注HTTP请求和HTTP响应。
使用fiddler工具抓取HTTPS, 体操作请查看文末领取教程
1xx -- 信息提示(表示临时的响应。客户端在收到常规响应之前,准备接收一个或多个1xx响应)
2xx -- 成功(表明服务器成功地接受了客户端请求)
3xx -- 重定向(客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求)
4xx -- 客户端错误(发送错误,客户端有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份证验证信息)
5xx -- 服务器错误(服务器由于遇到错误而不能完成该请求)
常见的返回码有:
200 OK - [GET]:服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功
202 Aceepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作
401 Unauthorized -[*] :表示用户没有权限(令牌、用户名、密码错误)
403 Forbidden -[*] :表示用户得到授权(与401错误相对),但是访问被禁止
404 NOT FOUND -[*]:用户发出的请求针对得到是不存在的记录,服务器没有进行操作,该操作是幂等的
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。
HTTP协议常用的请求方式有如下几种:
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
POST和GET都是向服务器提交数据,并且都会从服务器获取数据。
区别:
(1)传送方式:get通过地址栏传输,post通过报文传输
(2)传送长度:get参数有长度限制(受限于url长度),而post无限制
(3)GET产生一个TCP数据包(对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200返回数据),POST产生两个TCP数据包(对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok返回数据)
(4)get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留
(5)在做数据查询时,建议用GET方式;而在做数据添加、修改或删除时,建议用post方式
请求报文: 一个HTTP请求报文由请求行(Request Line)、请求头(Header)、空行(Blank Line)和请求体(Body)4个部分组成。
响应报文: HTTP响应报文和请求报文的结构差不多,由状态行、响应头、空行、响应体4个部分组成。
是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
解决方案:通过cookie和session来保持状态。
请求body;请求url+请求body:
Content-type:
application/x-www-form-urlencoded: 表单提交--键值对, form
multipart/form-data:文件上传---文件 ,MIME
application/json,text/xml
http协议目前有4个版本(0.9,1.0,1.1,2.0),其中1.0、1.1版本在互联网上被广泛使用,2.0版本目前应用很少,是下一代的http协议。
1.存储位置不同:Cookie 是将用户数据通过加密的方式保存在客户端,大多数情况 Cookie 存储在浏览器;Session 是用于控制客户端和服务端的连接,Session 存储在服务器;
2.存储容量不同:单个 Cookie 保存的数据不得超过 4kb,一个站点最多 20 个 Cookie,Session 一般情况下没有上限,不过建议不要存放太多东西,否则影响性能;
3.存取方式不同:Cookie 只能用 ASCII 字符串,通过编码方式获取 Unicode 字符或者二进制数据,不好存储复杂的信息,而 Session 能存储任何类型的数据;
4.隐私策略/安全性不同:Cookie 放在客户端,可以进行 Cookie 欺骗,所以不安全,Session 放在服务端,更加安全;
5.有效期不同:Cookie 可以设置属性达到长期有效,Session 依赖于 JSESSIONID 的 Cookie,Cookie JSESSIONID 的过期时间默认为-1,只需要关闭窗口 Session 就会失效,就算不依赖 Cookie,用 UrL 重写也不能完成,如果 Session 超时时间过长,容易导致内存溢出;
6.服务器压力不同:Cookie 保存在本地,不存在服务端压力,Session 保存在服务端,每个用户产生一个 Session,当访问增多,会比较占用服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用 Cookie;
7.浏览器支持不同:如果浏览器禁用 Cookie,那么 Cookie 直接失效,Session 比较好点,可以用 URL 重写;
8.Cookie 和 Session 应用的场景:Cookie 一般用于记住用户的登录状态,如记录用户的习惯,购物车;而 Session 用于登录验证。
https在应用层。
会话层为7层协议的第五层,为表示层提供建立、维护和结束会话连接的功能,并提供会话管理服务。
在浏览器中输入URL并回车后,主要发生以下步骤:
解析URL,获取要访问的域名
DNS域名解析,根据访问的域名获得目标服务器的IP地址
浏览器与服务端三次握手建立TCP连接
连接建立成功之后就可以发送HTTP请求报文以及服务器返回HTTP响应报文
断开TCP链接
浏览器解析响应报文,渲染页面
这个问题还是从需求、测试用例设计、执行来说吧。
A.需求
首先要了解这个接口提供的服务的需求定义,那么我们就知道大概测试的结果是啥。同时理论上要先提供接口规范,方便后续测试,以及给调用者联调的一个文档约定。
B.测试用例设计
根据测试的接口规范,基于业务进行场景设计,再结合边界值设计方法、等价类划分等常用设计方法进行用例设计。
1.设计的方向是常规的测试用例设计:协议规范测试、接口入参、接口出参。
协议规范测试:比如HTTP协议:URL地址、Header测试。不过一般情况下,默认调用者按照接口规范正常调用。这个不用过于详细测试。
2.接口入参:参数个数测试(注意是否必传字段),参数值测试(为空、正常值、非法值等,以及首尾有空格是否过滤)。
3.接口出参:至少涵盖一条成功的响应和一条失败的响应,当然我们测试出更多错误码,我们的覆盖率也就更全面。
4.业务场景用例: 这个需要你对于这个接口的业务的了解程度,而且这是最重要的部分。
比如中间使用了缓存服务(第一次缓存没有,是不是直接读数据源,并存入缓存;第二次直接读取缓存是否正确);
比如需要考虑请求外部的接口获取相应的信息的时间损耗(连接不上外部接口,外部接口下线了,外部接口响应太慢);
C.测试用例执行
1.需要你对接口协议有一定的了解,选择适当的开源工具(如postman)或者自己编写脚本进行模拟请求。
2.需要熟悉接口所使用的中间件等知识(比如redis、kafka、mysql数据库)。
3.需要模拟外部接口返回给你现在正在验证的程序的接口。(比如扣费业务,你不可能每测一个业务,就去调真实扣费)。
是web开发接口吗?建议使用Postman
一、什么是接口?
接口测试主要用于外部系统与系统之间以及内部各个子系统之间的交互点,定义特定的交互点,然后通过这些交互点来,通过一些特殊的规则也就是协议,来进行数据之间的交互。
二、 常用接口采用方式:
1、webService接口:是走soap协议通过http传输,请求报文和返回报文都是xml格式的,我们在测试的时候都用通过工具才能进行调用,测试。可以使用的工具有apipost、jmeter、loadrunner等;
2、http api接口:是走http协议,通过路径来区分调用的方法,请求报文都是key-value形式的,返回报文一般都是json串,有get和
post等方法,这也是最常用的两种请求方式。可以使用的工具有apipost、jmeter、loadrunner等;
三、前端和后端
前端:网站前端是对网页静态页面的设计,通俗的来说,就是我们肉眼能看的到的东西,当我们浏览网站的时候所看到的页面上的内容几乎都是属于前端,前端的工作就是网站页面,静态的页面是没有后端成分的,前端主要包括html和css外加js等一些样式和布局。
后端: 网站的后端就是动态网站的技术,比如网站上的一些注册登录和一些弹窗,这些都是后端的逻辑,常用的后端语言有php,jsp等,后端的数据库也包含myspl等,都是对后端进行存储数据。
四、 接口测试概念
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等(通俗来说就是,检查业务逻辑是否满足业务需求,校验字段是否正常你实际结果是否满足预期)
五、 接口的组成:
a、接口说明
b、调用url
c、请求方法(getpostput等)
d、请求参数、参数类型、请求参数说明
e、返回参数说明
六、为什么要做接口测试,接口测试的目标
接口其实app和前端交互用的,所以好多人问,为啥做功能测试还要测接口,目标是啥不是多此一举吗?首先我告诉大家,这种想法是错误的
那么举一个例子:
例如一个登陆接口,例如产品上规定用户名6-10个字符数字下划线,但后端没做判断。但我们业务人员测试肯定验证,但只是前端做了校验,后端压根就忘了这个小需求.那么后果来了如果一个懂的直接抓包去篡改你的接口,然后绕过校验,通过sql注入直接随意登录。如果你这是一个下单业务,是不是给公司造成了很大损失
所以此时此刻接口测试目标来了:
1.可能发现客户端没有发现的bug(那么也叫隐藏bug)
2.及早爆出风险(保证质量正常上线)
3.接口稳定了,前端随便改
4.最重要检查系统安全性,稳定性
七、如何进行接口测试
1.使用接口测试工具进行测试,接口测试和接口文档生成工具apipost,接口测试和性能测试工具jmeter
2.接口状态码表示含义
例如:200(成功)/300(重定向别的地方)/400(请求语法错误)/500(服务器异常)
测试点:
B. 参数组合(传入不同值)
C. 接口安全(绕过验证/绕过身份验证/参数是否加密等)
D. 异常验证(输入异常参数边界值)
练
1.BOM头
2.runtime生成的文件权限角色与apache的角色不同
runtime的角色为root
apache的角色为www
解决方法:
进入 //thinkphp/library/think/log/driver/File.php
/**
* 日志写入接口
* @access public
* @param array $log 日志信息
* @param bool $append 是否追加请求信息
* @return bool
*/
public function save(array $log = [], $append = false)
{
// $destination = $this-getMasterLogFile();
// $path = dirname($destination);
// !is_dir($path) mkdir($path, 0777, true);
/* 日志权限修改 */
$destination = $this-getMasterLogFile();
$path = dirname($destination);
if (PHP_SAPI != 'cli') {
!is_dir($path) mkdir($path, 0755, true);
} else {
!is_dir($path) mkdir($path, 0777, true) chmod($path, 0777);
}
/* 日志权限修改 */
$info = [];
foreach ($log as $type = $val) {
foreach ($val as $msg) {
if (!is_string($msg)) {
$msg = var_export($msg, true);
}
$info[$type][] = $this-config['json'] ? $msg : '[ ' . $type . ' ] ' . $msg;
}
if (!$this-config['json'] (true === $this-config['apart_level'] || in_array($type, $this-config['apart_level']))) {
// 独立记录的日志级别
$filename = $this-getApartLevelFile($path, $type);
$this-write($info[$type], $filename, true, $append);
unset($info[$type]);
}
}
if ($info) {
return $this-write($info, $destination, false, $append);
}
return true;
}
/**
* 日志写入
* @access protected
* @param array $message 日志信息
* @param string $destination 日志文件
* @param bool $apart 是否独立文件写入
* @param bool $append 是否追加请求信息
* @return bool
*/
protected function write($message, $destination, $apart = false, $append = false)
{
// 检测日志文件大小,超过配置大小则备份日志文件重新生成
$this-checkLogSize($destination);
// 日志信息封装
$info['timestamp'] = date($this-config['time_format']);
foreach ($message as $type = $msg) {
$msg = is_array($msg) ? implode(PHP_EOL, $msg) : $msg;
if (PHP_SAPI == 'cli') {
$info['msg'] = $msg;
$info['type'] = $type;
} else {
$info[$type] = $msg;
}
}
if (PHP_SAPI == 'cli') {
$message = $this-parseCliLog($info);
} else {
// 添加调试日志
$this-getDebugLog($info, $append, $apart);
$message = $this-parseLog($info);
}
//return error_log($message, 3, $destination);
/** 解决root生成的文件,www用户没有写权限的问题 by WbHuang 20190704 begin */
if (!is_file($destination)) {
$first = true;
}
$ret = error_log($message, 3, $destination);
try {
if (isset($first) is_file($destination)) {
chmod($destination, 0777);
unset($first);
}
} catch (\Exception $e) {
}
return $ret;
/** 解决root生成的文件,www用户没有写权限的问题 by WbHuang 20190704 end */
}
1.什么是接口测试?
·接口测试是测试系统组件间接口的一种测试方法。
·接口测试的重点是检查数据的交换,传递的正确性,以及接口间逻辑依赖关系
·提交接口测试的重要意义:实现开发期并行测试,减少页面层测试的深度,缩短整个项目的测试周期。
2. 接口自动化测试的流程是什么?
·基本的接口功能自动化测试流程为:需求分析-用例设计-脚本开发-测试执行-结果分析
3. GET请求和POST请求区别是什么?
· GET请求用于信息获取,而且应该是安全和幂等的;在做数据查询时,建议用get方式。如:商品信息接口、搜索接口、博客访问接口等。
· POST请求表示可能会修改服务器上资源的请求;在做数据添加、修改时,建议用post方式,如:微博贴吧上传图片接口、登录注册接口等。
GET是从服务器上获取数据,POST是向服务器传送数据。这个说法是有误的。GET/POST都可以提交数据。Get请求也可以向服务器传递数据。Post请求也需要服务器返回数据。
4. 接口测试的常用工具有哪些?
· Postman
·Jmeter
·SoapUI
5. HTTP接口的请求参数类型有哪些?
·查询字符串参数(Quert string Parameters),参数会以url string的形式进行传递。
·请求提参数(Request body)一般用于POST请求,可以使用Content-Type来指定不同参数类型
6. 如何从上一个接口获取相关的响应数据传递到下一个接口?
先从上一个接口中的响应数据获取对应的返回值,然后使用正则表达式或者json解析来提取要获取的值,然后存储在一个变量中,最后在下一个接口中直接引用即可。
7. 接口测试用例的编写要点有哪些?
· 请求参数必填项、可选项等
·输入输出合法、非法参数等
·请求参数边界值等
·响应数据校验
·接口之间逻辑校验,如果两个请求有严格的先后顺序,需要测试调转顺序的情况
8. 接口测试的步骤有哪些?
发送接口请求
测试接口获取的返回值
断言:判断实际结果是否与预期相同
9. 接口测试中依赖登陆状态的接口如何测试?
依赖登陆状态的接口本质上是在每次发送请求时需要带上Session或者Cookie才能发送成功,在构建POST请求时添加必要的Session或者Cookie
10. 依赖第三方数据的接口如何进行测试?
可以利用一些MOCK的工具(如Json Server,Easy Mock)来模拟第三方的数据返回,最大限度地降低对第三方数据接口的依赖。
1.先检查接口 ip 是否正确,可以通过在本机 ping 接口的 ip,检查网络是否通畅
2.再检查接口的端口号是否正确,可以通过在本机 telnet 接口的 ip 和端口号,检查端口是否能连通
3.检查项目是否启动或者部署成功,可以找研发确认,或者自己登录到服务器上,通过 ps 命令检查项目的进程是否存在,然后用 tail 命令查看部署日
4.检查服务器防火墙是否关闭,如果因为安全或者权限问题不能关闭,需要找运维进行策略配置,开放对应的 ip 和端口号
5.检查你的客户端(浏览器/测试工具),是否设置了网络代理,网络代理可能会造成请求失败
6.检查操作系统的 host 文件,是否绑定了一个错误的 ip 映射。
“接口返回失败”通常是指在项目开发的代码实现过程中中,当前使用者尝试调用相关功能接口时遇到了错误,导致无法返回正确的参数。
接口返回失败有多种原因,主要原因有代码整体逻辑错误、代码出现部分错误(通常所说的bug)、参数传入错误、参数返回错误等等。
扩展资料:
项目开发过程中为了避免遇到“接口返回失败”的情况,应注意如下几点:
1、确定入口参数。
对比实际需求传入的参数,比如需求是传入模型数组,如果传入基本类型的数组则会导致失败。在这种场景中,应该事先写一段测试代码打印入口参数和返回值,不要贸然地将不熟悉的功能添加到开发代码中。
2、确认返回值。
实现项目时,需要事先确定返回值,例如实际需要传入嵌套数组作为参数,但却因为主观原因贸然认定需要模型数组,那么这样同样会出现错误。返回值类型判断错误会导致后续处理返回值时,采用了错误的流程,也导致程序不能运行。
3、注意调试。
拿到一个不熟悉的接口时,第一要做的就是调试,打印输入和输出,明白入参和返回值的形式和类型,确定无误再继续构建项目。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~