接口面试题
什么是接口
接口就是内部模块对模块,外部系统对其他服务提供的一种可调用或者连接的能力的标准
webservice 和 HTTP api接口
- webservice接口是走soap协议通过HTTP传输,请求报文和返回报文都是XML格式
- http api接口是走HTTP协议通过路径来区分调用的方法,请求报文格式都是key-value形式,返回报文一般是json串
什么是接口测试
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是检查数据的交换、传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
接口测试流程
需求讨论、需求评审、场景设计、编写用例、准备数据、执行测试
- 需求评审,熟悉业务和需求
- 开发提供接口文档(必须提供接口说明、URL、请求方法、请求参数、参数类型、请求参数说明及返回参数说明)
- 编写接口测试用例
- 进行用例评审
- 提测后开始测试
- 提价测试报告
如何分析问题是前端的还是后端的
如果发送的数据是正确的,但是后台反馈的数据是不符合需要的,那就是后台的问题;如果前端没有请求接口,或者请求的时候发送数据与需求不符,那这个时候就是前端的问题了
接口测试测试点是什么?
- 目的:测试接口的正确性和稳定性
- 原理: 模拟客户端向服务器发送请求报文,服务器接收请求报文后对相对应的报文做处理并向客户端返回应答,客户端接收应答的过程
- 重点:检查数据的交换、传递和控制管理过程,还包括处理的次数
- 核心:持续集成是接口测试的核心
- 优点:为高复杂性的平台带来高效的缺陷监测和质量监督能力,平台越复杂,系统越庞大,接口测试的效果越明显
- 用例设计重点:通过情况下主要测试最外层的两类接口,数据进入系统接口和数据流出系统接口
后端接口都测什么?
- 业务功能:正常场景、异常场景
- 边界分析测试:
- 输入输出参数边界分析:覆盖所有的必参数、组合可先参数;参数有、无或null;参数的顺序、个数、类型;参数类型数值的大小、输入的数值范围;参数包含特殊字符
- 参数组合测试
- 异常情况测试:幂等(重复提交)、并发测试、事务实测、大数量测试(同时处理大批数据的测试、DB数据量很大时,测试DB操作)
- 性能测试:响应时间、吞吐量、并发数、服务器资源使用率(CPU、内存、io)
- 安全测试:
- 敏感信息是否加密:前后端数据传输是否加密; 日志信息是否加密
- sql 注入
后端接口测试一遍、前端也测试一遍,是不是重复测试了
- 基本功能测试
- 边界分析测试
- 存储测试:屏幕旋转、连续加载页面、开多个窗口、应用户型调用、多线程下载
- 性能测试:
- 响应时间:安装、启动、跳转
- 内存、CPU、fps、电量、流量、温度
- 稳定性测试
- 兼容性测试:
- 网络(2G、3G、4G、5G 、wifi、断网、弱网)
- 分变率
- 机型
- 平台
- 中断测试(如:来电话、短信或闹钟)
- 交互测试(调用相机、分享功能)
- UI测试 从两个测试活动中系统的部分有功能测试、边界分析测试和性能测试,其他部分有各自特性或关注点不同需要进行特殊的测试。
接口测试可以关注与服务器逻辑验证,而UI测试可以关注于页面展示逻辑及界面前端与服务器集成验证
接口测试质量品谷标准
- 业务功能覆盖是否完整
- 业务规则覆盖是否完整
- 参数验证是否达到要求(边界、业务规则)
- 接口异常场景覆盖是否完善
- 接口覆盖率是否达到要求
- 性能指标是否达到要求
- 安全指标是否满足要求
为什么要做接口测试
前后端传输、日志答应等信息是否加密传输也是需要验证的,特别是涉及到用户的隐私信息,如身份证,银行卡等
- 越底层发现bug,它的修复成本是越低的
- 前端随便编,接口测试好了,后端不用变。
- 检查系统的安全性、稳定性,前端传参不可信,比如京东购物,前端价格不可能传入-1,但是接口可以传入-1。
- 如今的系统复杂度不断上升,传统的测试方法成本急剧增加且测试效率大幅下降,接口测试可以提供这种情况下的解决办法
- 现在有很多系统前后端架构是分离的,从安全层面上来说:
- 从安全层面上来说,只依赖前端进行限制已经完全不能满足系统的安全要求,需要后端同样进行控制,在这种情况下就需要从接口层面进行验证。
- 前后端传输、日志打印等信息是否加密也是需要验证的,特别是涉及到用户的隐私信息,如身份证、银行卡等
Jmeter
通过BeanShell脚本,实现对接口入参sha256加密
- 前期准备:找开发要sha256.js
- windows:将sha256,js放到jmeter的bin目录下
- mac:将sha256.js放到个根目录下
- 操作步骤:
- 添加线程组-》sampler-》dug sample(调试)
- dug sampler-》前置处理器-》JSP223 Precessor
load("sha256.js");
var amdin_password=sha256("${password}");
log.info("************************ *****************");
log.info(amdin_password);
log.info("******************************************");
vars.put("password",amdin_password)
- 执行后,在日志中打印出被加密的参数
上个接口的返回值为下个接口的入参
- 操作步骤
- 添加HTTP请求-》选择后置处理器中正则表达式提取器(json Extractor)
- 在json Extractor,输入需要去取的字段,并将提取结果付给变量
- 新建一个http请求,再将请求参数传入
jmeter连接Mysql数据库
如果从上一个请求返回的数据中获取特定值的数据,并以数组的方式输出
- 前提准备:
- 下载 jsonbj.jar,并将jar包放到lib文件夹中
- 操作步骤
- 添加HTTP请求-》添加后置处理器Beanshell PostProcessor
log.info("~~~~~~~~~~~~~~~~~~~~~~~~~json~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
import net.sf.json.*;
//接口返回的字符串对象
String jsonStr = prev.getResponseDataAsString();
// 把字符串转换为对象
JSONObject jsonObject=JSONObject.fromObject(jsonStr);
// 取对象中需要的数组,并转换成字符串
String dataStr = jsonObject.get("data").toString();
// 把字符串转换成数组对象
JSONArray dataArray = JSONArray.fromObject(dataStr);
String str= new String("B");
log.info("str:"+str);
// 遍历数组中的每个对象,取Status为2的对象放入list中
JSONArray res = new JSONArray();
for (int len = dataArray.size(), i = 0; i < len; i++) {
JSONObject obj = (JSONObject)dataArray.get(i);
int status = Integer.parseInt(obj.get("Status").toString());
String BuyOrSell = obj.get("BuyOrSell").toString();
if (status == 2 && BuyOrSell.equals(str)){
res.add(obj);
}
}
// 整理后的数组
log.info(res.toString());
String Str1=res.toString();
vars.put("data",Str1);