接口测试框架接入性能测试实践分享
1. 前言
现如今接口测试在软件质量行业中的地位,已经越来越重要,相对于上层的UI自动化测试和下层的单元测试,接口测试的“低”投入、“高”回报,也成了绝大多数质量保障实践的首选。
在开展接口测试时,往往很多时候都只在关注接口的功能性质量,而对于非功能性的质量保障验证,比如性能、安全,在实际工程应用或者设计用例时关注度明显不足(甚至很多压根没有这方面的测试实践)。
今天就以Python系下requests库(常用于接口测试)和Robot FrameWork框架为例,和大家聊聊在接口测试过程中,和功能需求同等重要的性能测试检查项。
2. 接口测试需要考虑的性能检查项
在接口测试过程中,除了要考虑产品需求的正常、异常、数据正确性等显性功能需求质量外,还有很多隐性需求质量需要关注,以性能测试为例,常见需要关注的检查项包括,但不限于:
- 1、单用户登录的响应时间是否小于 3 秒;
- 2、单用户登录时,后台请求数量是否过多;
- 3、高并发场景下用户登录的响应时间是否小于 5 秒;
- 4、高并发场景下服务端的监控指标是否符合预期;
- 5、高集合点并发场景下,是否存在资源死锁和不合理的资源等待;
- 6、长时间大量用户连续登录和登出,服务器端是否存在内存泄漏。
本文重点以接口响应时间为例,介绍如何在requests库和Robot FrameWork框架纳入性能测试项,其它性能检查项思路基本都是相通的。
3. requests库接口测试校验响应时间
通常在结合requests库开展接口测试时,发送请求后,接口的响应时间,也是我们需要关注的一个重点,如果响应时间太长,从产品业务或者用户角度也是不可接受的。那如何进行请求响应时间校验,也成为了接口测试人员需要掌握的一项小技能。
针对requests库校验请求响应时间,给大家提供两种实现思路:
一、借助请求响应超时机制
具体实现:
#-*- coding:utf-8 -*-
import requests
from requests import exceptions
try:
req = requests.post(url=url, data=data, headers=headers, verify=False, timeout=3)
print r.json()
except exceptions.Timeout as e:
print("抛出异常")
在上述实现中,通过增加timeout参数,设置请求响应超时机制,当timeout=3(可自由定义),当请求响应时间超过3秒,则会抛出超时异常。
其中,额外补充的知识点:超时(默认单位:s),有两种设置超时方法:
- timeout=5:设置5s的超时时间
- timeout=(5,10):设置区间时间的等待
当请求出现超时时,则会抛出此异常:requests.exceptions.ConnectTimeout: HTTPConnectionPool
2、获取响应时间方法:req.elapsed.total_seconds()
二、借助requests接口响应返回值elapsed
具体实现:
#-*- coding:utf-8 -*-
import requests
r = requests.post(url, data=data, headers=headers)
print(r.status_code)
print(r.elapsed)
print(r.elapsed.total_seconds())
print(r.elapsed.microseconds)
print(r.elapsed.seconds)
elapsed_time = r.elapsed.total_seconds() #获取实际的响应时间
assert elapsed_time>3
上述代码实现中,通过获取请求返回的响应值来获取接口响应时间,常见的几个获取响应时间参数为:
- elapsed.total_seconds:获取响应时间,单位s (推荐)
- elapsed. microseconds:获取响应时间,大于1s的时候,只截取了后面的小数部分
- elapsed.seconds:单位s,响应时间小于1s时,为0
4. Robot Framework框架校验响应时间
在上述我们介绍了requests库在开展接口测试过程,校验请求响应时间的实现思路。而通过Robot Framework框架开展接口测试,主要会依赖RequestsLibray库,而因此实现思路也是一样的。
具体实现,可参考下述示例:
img
上述校验请求响应时间,核心就两句代码:
${elapsed_seconds}= set variable ${resp.elapsed.total_seconds()}
should be true ${elapsed_seconds}<3
补充知识点:响应体${resp}是一个类对象,源码可在requests/models/Response查看,可以查看找出该类的所有属性,第6行打印结果:
5. 小结
作为测试工程师,你的目标是要保证系统在各种应用场景下的功能是符合设计要求的,所以你需要考虑的测试用例就需要更多、更全面。本文,通过接口测试如何融合接口性能检查项,给大家提供一点思路,希望对你有所帮助或启发。
- LCA 最近公共祖先
- RMQ问题(线段树算法,ST算法优化)
- 统计0到n之间1的个数[数学,动态规划dp](经典,详解)
- Selenium2+python自动化40-cookie相关操作
- 【干货】PyTorch实例:用ResNet进行交通标志分类
- 2017年浙江理工大学程序设计竞赛校赛 题解&源码(A.水, D. 简单贪心 ,E.数论,I 暴力)
- Selenium2+python自动化41-绕过验证码(add_cookie)
- C语言求最小公倍数和最大公约数三种算法(经典)
- Selenium2+python自动化47-判断弹出框存在(alert_is_present)
- Free Pascal初次体验(有亮点哦)
- HDU 1312 Red and Black(DFS,板子题,详解,零基础教你代码实现DFS)
- Selenium2+python自动化48-登录方法(参数化)
- 51Nod 1003 阶乘后面0的数量(数学,思维题)
- 如何查看某个用户指定时间段的ABAP开发记录
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- TypeScript: 常用的高级类型
- TypeScript:得泛型者,得天下
- 微信PC端多开的秘密
- Spring Cloud 微服务(七)- 上:日志收集集成
- Spring Cloud 微服务(七)- 下:日志收集详解
- Spring Cloud 微服务(八):链路追踪
- 一文带你网络安全 入门到入* [网络安全]
- 小白也能秒懂Vue源码中那些精细设计(选项处理)
- 软件品质评测系统-任务分发管理平台
- 彻底解决小程序无法触发SESSION问题
- 如何搭建前端异常监控系统
- JS+CSS 3实现图片滑块效果
- 深入理解 AuthenticationManagerBuilder 【源码篇】
- 每天一道前端面试题:如何进行网站性能优化
- PowerBI DAX 度量值管理 - 驾驭度量值依赖关系,删除无效