ARTICLE · 1021424
接口测试高频面试真题+答案(整理)
首先开发会给我们一个接口文档,我们根据开发给的接口文档,进行测试点的分析,主要是考虑正常场景与异常场景,正常场景,条件的组合,参数的格式校验等价边界值;异常场景,多一个参数,少个必填参数,参数为空;
接着编写测试用例,用的 Jmeter工具去运行,创建线程组,建立http请求,输入测试用例,请求参数,建立察看结果树,运行,看返回的结果,是否跟接口文档里面要求的返回结果一致,其他用例,值需要修改里面的参数,请求地址这些信息。
举例说明:(不要登录跟注册)
比如说原来我们做一个申请借款的接口,对接口进行测试分析,考虑正常场景与异常场景,正常场景,考虑不同参数组合。
比如说,不同借款方式,还款期限,还款日期,借款的利率等参数组合;也要测试每个参数格式校验,异常场景,多一个参数,少一个必填参数,比如没有借款的利率,参数为空的,比如借款标题为空,编写测试用例在 jmeter中执行,填写参数,更地址就ok,发送请求
这个涉及到动态关联,首先要搞清楚后一个接口需要用到上一个接口的什么数据,例外要看数据是在哪里取的,是在head还是在body里,然后如果要取的数据是json格式我会在发请求用json提取器去取这个数据,如果是其他格式的就用边界提取器或正则表达式去取数据。
就拿我当时做的那个下单接口来说吧,因为下单接口需要先登录,需要用到登录接口的cookies来做鉴权,首先就是把登录接口调试通过,然后在登录接口的http请求中添加一个边界值提取器或者也可以用正则表示式提取器去提取登录接口的响应头中的 cookies值
然后在下单接口中需要添加一个http cookies管理器,在http cookies管理器中引用登录接口提取出来的 cookies,这样就可以了
如果是不同的线程组的话,那在登录接口中还得添加一个 Beanshell取样器,在Beanshell取样器中,利用函数助手中的 SetProperty()函数把提取出来的 cookies设置为全局变量,然后在下单接口的http cookies管理器中利用函数助手中的Property()函数引用登录接口中设置的全局变量,这样就可以了。
问题4:接口测试主要目的是什么?
主要就是验证后台服务端的业务逻有没有问题,提高测试的效率
①越底层发现bug,它的修复成本是越低的
②前端页面修改频繁情况下,接口测试不受页面元素改变而影响
③检查系统的安全性,前端传参不可信,比如京东购物,前端价格不可能传入-1元,但是
通过接口可以传入-1元
④如今的系统复杂度不断上升,传统的测试方法成本急剧增加且测试效率大幅下降,接口自动化测试可以提高测试效率
⑤接口测试相对容易实现自动化持续集成,且相对U自动化也比较稳定,可以减少人工,回归测试人力成本与时间,缩短测试周期
问题5:接口测试和平常的Ul测试有什么区别?
其实这两者测试的侧重点是不同的,接口因为没有界面,更多考虑后台服务器对请求的,处理逻辑问题,业务交互,检测的是后台“容错机制”是否完整;
而ui更多会去关注页面展示,数据转换,界面排序这些功能,当然也会后台数据处理的问题,ui测试其实已经包含了接口测试。系统功能的用例更全面,不仅有界面的,也有业务功能用例,还有其他用户场景的用例功能入口用例,流程用例,而接口测试主要根据各种入参场景来设置用例。
首先要对于每个要测的接口都要先搞清楚这个接口的功能,它的作用是什么,熟悉这个业务功能需要用到什么协议,请求方式是什么,接口有哪些参数。对于每个参数的作用都要搞清楚,像数的类型,是否有约束限制,是否为必填的,长度,其他的限制等等。
如果两个参数之间有关联我们还要考虑参数的组合场景,对于参数不理解的,一般都会跟开发沟通下,然后考虑返回数据的类型,返回数据中的返回码和返回信息是什么,通过以上几个点去提炼测试点,设计用例。
参数约束——长度、必选项、格式、数据类型业务场最——正确的业务场景;错误的业务场景;异常场景:服务器空间不足组合场景——相互依赖:手机和验证码、用户名和验证码;相互排斥:二选一当然还有边界值等价类等等
Jmeter测试流程,步骤如下:创建 jmeter线程组一添加HPPT请求-输入协议-域-端口-路径-编码-请求方式-请求参数-启动
Jmeter测试流程:先需求,再根据需求写测试点转换成测试用例,根据测试用例编写测试脚本;执行测试脚本;提交BUG,跟踪BUG
我们主要是根据入参情况,去看接口的返回值,对于返回值,我主要关注的几个点:1.状态码2.提示信息3.返回数据的具体内容。根据接口文档的说明去检查这个3个点是否满足接口需求文档,4.有些如果要检查数据库的,就连接数据库获取数据与返回的数据做对比。
如果不满足就是有问题,如果满足则通过,如果有Bug我们会先大概分析下,是什么原因,并进行复测,如果还是有问题,提交Bug给开发,让开发修复,之后再回归测试
1)通过用户和密码,auth鉴权2)通过cookie和session3)通过token4)通过sign签名
现在app一般是通过 token鉴权,有些是通过把 token放在请求头里面,有些是通过 singn签名这个字段放在body里面去鉴权的,一般的web是通过session去鉴权的
要测试上传文件的接口,在JMeter的http请求这个组件中传递请求参数的栏目中专门提供了一个用来文件上传的,在这里面需要填写几个内容,一个就是文件的路径,还有一个就会参数名称,还有就是MlME类型也就是指定要上传的文件的类型,这样就可以了。
这里首先让开发给我们写一个加密,解密的jar, JMeter直接调用这个jar进行加密,解密处理
1)首先需要将开发给到的加解密的jar包文件放到 jmeter的lib/ext目录下
2)在测试计划中中有一个add Directory or jar to classpath,在这里指定jar的路径,添加需要的jar包
3)在jmeter的前置处理器中添加 Beanshell PreProcessor然后在其中添加java代码
具体就是:a.首先导入需要用到的加密包中的加密算法类,b.如果要对json格式的请求参数加密,组装json格式的数据c.调用加密类中的函数对json格式的参数数据进行加密,如果只对具体某个参数加密,那就针对哪个参数加密即可。d.然后将加密之后的数据保存到 jmeter的一个变量中就可以了
4)最后直接在消息体中引用这个变量就可以了
具体代码如下:
Jmeter调用
import com changfu EncryptAnd Decryptinterface;#导入加密类String json_str = "{\"Username\":\"amycheno2\",\"password\":\"F59BD65F7EDAFB087A81D4DCAO6c4910\",\"deviceNo\",\"35584806988942\")"; #请求的参数调用加密类中的函数对请求参数实现加密处理。String enpost= EncryptAndDecryptinterface.getEncryptPost(json_str); #将请求参数加密vars put("enpost",enpost); #将加密处理后的数据存到 jmeter变量中
问题11:如果接口返回的数据做了加密处理的,如何进行断言?
1)首先得让开发写一个解密的jar包,然后把jar包放入到JMeter的 JMeter的lib/ext目录下
2)然后在测试计划中有一个add Directory or jar to classpath在这里指定jar的路径添加需要的jar包
3)在 JMeter中添加 Beanshell断言,里面实现java代码,具体过程就是
a.导入解密的jar包中的解密算法类b.导入用于解释json格式数据的类(假设返回的数据是json格式的)c.对数据进行处理器,首先获取接口的返回数据,然后调用解密算法类中的函数进行解密,解密出来后就是一个json格式数据d.然后调用json库中的函数对json数据进行解释,提取其中需要断言的字段,判断与预期结果是否一致就可以了
具体代码:
在http请求->添加->断言->bean shell断言
//导入jar包的 EncryptAndDecryptinterface类import com changfu EncryptAnd DecryptInterface;//导入jar包用于解释json格式数据的类import org.json.JSONObject;//对数据进行处理器String json_res= prev.getResponse DataAsString();/取上个响应信息String resb= EncryptAndDecryptlnterface.getDecrypt(json_res);∥调用解密工具解密vars.put("resb",resb);log.info("解密后的响应信息json="+resb);JSONObject resbonseJson= new JSONObject(resb); //解析 jsonString status_str= resbonseJson.get("status") toString();//截取status字段值vars.put("status_str",status_str);log.info("执行状态="+status_str);String result="0";vars.put("result_str",result);if(!status_str.equals(result)){ //响应信息的状态值 status_str不等于0,则断言其他与实际值不一致Failure=true;FailureMessage="statuscode与实际值不一致;实际值为:"+status_str+",响应信息:"+resb;}
问题12:下一个接口用到上一个接口的数据,但返回的数据加密了,如何提取?
回答分析:比如:一次登录后做多个接口的操作,然后登录后的uid需要关联传递给其他接口发送请求的时候使用
1)首先得让开发写一个加解密的jar包,然后把jar包放入到jmeter的 jmeter的lib/ext目录下
2)然后在测试计划中中有一个 add Directory or jar to classpath在这里指定jar的路径,添加需要的jar包
3)然后在第一个接口中添加一个 bean shell postprocessor(后置处理器),在后置处理器中编写java代码,具体就是:
a.导入解密的jar包中的解密算法类b.导入用于解释json格式数据的类(假设返回的数据是json格式的)c.对数据进行处理器首先获取接口的返回数据,然后调用解密算法类中的函数进行解密,解密出来后就是一个json格式数据d.然后调用json库中的函数对json数据进行解释,提取截取响应信息中uid的值e.将 uid_str数据存到变量中,这里用 props.put,其他线程组可调用请该变量
具体代码:
import com.changfu.EncryptAndDecryptInterface;import org.json.JSONArray,import org.json.JSONObject;string json_res =prev.getResponseDataAsString();//获取登录请求的响应信息String resb = EncryptAndDecryptInterface.getDecrypt(json_res);//调用解密工具解密,对响应信息解密vars.put("resb",resb);log.info("解密后的响应信息resb="+resb);JSONObject data_obj= newJSONObject(resb); ∥解析json响应信息String uid_str = data_obj.get("result").get("id").toString()://截取响应信息中uid的值props.put("uidstr".uid_str); ∥将uid_str数据存到变量中,这里用props.put,其他线程组可调用请该变量log.info("加密前的uid="+uid_str);
公众号回复【简历】