接口测试
接口测试流程
1. 业务需求分析
2. 看接口文档
3. 测试用例设计
4. 用例执行【被自动化替代】
5. 报告总结输出 【被自动化替代】
自动化测试 不是为了取代手工测试,而是为了提高测试效率,降低测试成本【降本增效】
接口测试人员只需要关注测试的设计,后续的步骤由框架替代
自动化框架的设计注意事项:
1. 框架是普通自动化脚本开发和测试开发的分水岭
2. 框架的特点【复用】
框架开发步骤(针对测试人员去开发系统软件)
1. 开发一个框架的需求
这里需要安装allure,allure是用于生成测试结果文档的
在下载了allure的官网压缩包之后,将其解压并配置环境变量到PATH目录上,配置bin目录即可
python
import xToolkit, requests, pytest, allure, os
# 一行代码读取所有测试用例信息
# 读取接口测试用例.xls中的2表的数据,sheet=1表示表2
allTest = xToolkit.xfile.read("接口测试用例.xls").excel_to_dict(sheet=1)
print(allTest)
# 借助测试工具(postman、jmeter等等)发起接口请求
@pytest.mark.parametrize("testOne", allTest)
def test_case_exec(testOne):
res = requests.request(
url=testOne["接口URL"],
method=testOne["请求方式"],
params=eval(testOne["URL参数"]))
# 断言测试是否通过,一般是通过测试用例的预期状态码和实际响应的状态码进行比较
print(res.text)
# pytest 运行方式 1.命令行 2.代码中调用[框架封装常用]
if __name__ == "__main__":
pytest.main([
'-s', # 打印print 输出的内容
'-v', # 打印详细运行日志信息
'--capture=sys' # 保留系统输出
'test.py',
'--clean-alluredir','--alluredir=allure-results' # 生成 测试数据-用于生成html报告
])
# allure html报告生成的技术 1.生成测试数据 2.通过allure命令生成html报告
os.system(r"allure generate -c -o 测试报告")
上述代码就实现了对应的功能
Jmeter接口自动化测试
接口测试_技术背景:前后端分离架构、移动互联网时代(app、小程序、公众号h5...)
测试人员依赖各种工具:web应用使用浏览器、接口测试【通过工具模拟客户端调用】
接口文档核心要素
我们对一个接口做测试,填入以下参数,这是一个登录接口,接着我们可以通过查看结果树获取结果
在参数填写正常的情况下,都是没有任何问题的
结果如下:
json
{"msg":"登录成功","code":0,"data":{"id":"5435","username":"lisi","nickname":"","mobile":"","email":"","avatar":"http:\/\/shop-xo.hctestedu.com\/static\/index\/default\/images\/default-user-avatar.jpg","alipay_openid":"","weixin_openid":"","weixin_unionid":"","weixin_web_openid":"","baidu_openid":"","toutiao_openid":"","qq_openid":"","qq_unionid":"","integral":"0","locking_integral":"0","referrer":"0","add_time":"1644236740","add_time_text":"2022-02-07 20:25:40","mobile_security":"","email_security":"","user_name_view":"lisi","is_mandatory_bind_mobile":0,"token":"89b498190522bc05a2d966b6fbda0fc4"}}
此时我们再测试另一个,复制刚刚登录的接口,修改一些参数
路径:/index.php?application=app&s=/api/order/index
将之前的参数删除,添加json数据
json
{
"page":1,
"status":"-1"
}
再次运行,此时报错400,说明是没有权限,我们需要添加权限,也就是token
修改路径:/index.php?application=app&s=/api/order/index?token=89b498190522bc05a2d966b6fbda0fc4
添加了token后再次运行,即可返回结果,但返回的结果没有进行格式化,看起来很难受,我们需要对其进行格式化
实现步骤
1. 下载jar包(jackson-annotations,jackson-core,jackson-databind 版本都为2.8.6);
2. 将jar包所在的目录添加到Test Plan 测试计划中;
3. 在Jmeter的测试计划Test Plan 中添加 BeanShell PostProcessor;
4. 在BeanShell PostProcessor 中的Script中插入代码;
5. 重启Jmeter;
详细步骤:
我们需要先下载三个maven的包(jackson-annotations,jackson-core,jackson-databind 版本,我这里选择的是2.15.2),在该网址进行下载:https://mvnrepository.com/search?q=jackson-annotations
将jar包添加到Test Plan测试计划中
在Jmeter的测试计划Test Plan 中添加 BeanShell PostProcessor;
路径:选中Test Plan > Add > Post Processor > BeanShell PostProcessor添加;
在BeanShell PostProcessor 中的Script中插入代码;
java
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
try {
String response_data = prev.getResponseDataAsString();
log.info("response_data: " + response_data);
ObjectMapper objectMapper = new ObjectMapper();
Map readValue = objectMapper.readValue(response_data, Map.class);
String writeValueAsString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(readValue);
log.info("PrettyFromatJson result: " + writeValueAsString);
prev.setResponseData(writeValueAsString);
} catch (JsonProcessingException e) {
log.info("BeanShell PostProcessor failed=======================================", ex);
}
重启jmeter则解决
上述方法借鉴于:https://blog.csdn.net/ueiun2_explore/article/details/103729730
大项目协同方式
大型项目:分模块,划分功能--
A:用户登录注册模块
B:订单模块测试脚本(需要登录)
C:购物车测试模块(需要登录)
如何避免重复的工作,相互之间的协作问题
测试片段可以单独划分每一个模块,对于测试用例模块化封装,通过模块控制器对于对应的测试片段进行执行
Jmeter自动化问题及解决方案
自动化是什么?
自动化不是特指某一个技术。凡是能够提高测试人员效率、替代部分人工操作的技术
如何提高效率,分析效率低
添加一个全局的测试变量
在此处添加变量
添加完成后,通过${}的形式可以使用对应的变量
多组数据测试
有时候我们可能对多组数据进行测试,例如登录的多个用户的情况
以及其他的情况
我们可以通过读取csv的形式读取多组数据,然后将多组数据赋到对应的参数上
我们将参数通过${}的形式赋到对应的位置上
此时运行,会发现有对应的结果,但是只有第一组数据的结果,并没有多组数据的结果
此时需要循环控制器进行控制
接着将csv和登录接口的功能放入到循环控制器中,循环控制器会对其进行循环
再次运行,即可看到对应的结果了
接口执行结果判定
100个接口,每个接口5个用例,500个用例的执行结果
【特定状态码、和数据库对比、判定响应内容...】
接口依赖处理
通过json后置提取器来进行数据的提取
先在订单处放置对应的提取结果名`/index.php?application=app&s=/api/order/index?token=${login_token}`
加密接口测试
不能用未处理的明文数据进行接口调用
明文数据传输在网络 -- 安全性降低【很有可能被截取】
案例1:记录网络数据传输内容【野生免费wifi】
案例2:用别人的VPN梯子,外网【代理 -- fiddler、Charles】
软件服务商,增强安全性
如果我们想对加密接口进行测试,该怎么处理呢
1. 准备测试数据的时候,提前做好加密处理。【数据不怎么变动的场景】
1. 让开发生成一些加密数据。局限性:数据是固定的
2. 了解开发人员用的加密算法+密钥,自己写代码进行加密【绝大多数测试不会加密】
1. md5 -- hash算法,摘要算法,(不可逆加密)
2. 对称加密
3. 非对称加密
3. 开发人员提供API的调用方式【示例代码】
1. beanshell -- 类似java语言【不推荐,是一种脚本,容易写错且不好找出问题】
2. 最大问题:理论上是可行的,但是实际落地极其麻烦
4. 提供可执行的命令工具【比较好】
1. 在线加解密接口【适合比较通用的加密场景】【依赖外部的工具网站能够使用】
2. 让开发提供内部加解密接口【弊端:产生额外的接口调用,不适用性能测试场景】
3. 本地可执行文件【比较通用】 -- openssl、自己开发编写
4. 通过OS进程采样器实现Jmeter与任意开发语言,任意工具进行集成
OS进程取样器
介绍:jmeter去执行一段命令(例如python的),拿到返回结果
操作方式
上面这段内容是对用户名和密码进行加密后返回,比如说我们想在登录中使用这个结果该如何使用呢
这里需要使用正则表达式提取器
将对应的结果来进行提取
在接口中创建正则表达式提取器
通过正则表达式匹配可以匹配到对应的数据