马上就又到了程序员们躁动不安,蠢蠢欲动的季节~这不,金三银四已然到了家门口,元宵节一过后台就有不少人问我:
现在外边大厂面试都问啥
想去大厂又怕面试挂
面试应该怎么准备
测试开发前景如何
面试,一个程序员成长之路永恒绕不过的话题。每每到这个时期,不管当前有没有跳槽换工作需求的,都多少会跟着观望一下“外边的世界”~
当然外边的世界很精彩,但出来混,可不能没有一点准备,赤手空拳上阵。给大家分享一份免费的 测试工程师面试题,涵盖不少大厂高频必考点,需要的同学可免费领取。
不只是面试,了解市场需求,认识自己的问题,熟悉Python高频难点,巩固 Python相关知识...这份资料都可以帮助到你。
金三银四刚开始就拿到了蚂蚁的offer,这份阿里大牛总结的面试笔记,能掌握这份笔记的70%以上感觉就能拿大厂offer。
为了帮助更多的粉丝朋友们都拿到心仪的offer,小编在此把这份笔记分享出来
接上篇:
9.10 什么是 api 接口测试
接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点测试的重点,
是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等
9.11 什么情况下开展接口测试?
1、项目处于开发阶段
2、有接口需求文档,开发已完成联调,功能测试展开之前
3、专项测试:参数约束测试,业务场景测试,测试接口请求响应时间(性能)
4、版本上线前,进行整体回归测试,查看接口是否有异常(如 404 等)
9.12 依赖于第三方的接口如何测试
1,需要第三方接口的,接口文档
2,发送请求到第三方接口,检查第三方接口返回的数据是否正确
3,不正确的时候,要跟第三方接口联调,看是请求问题,还是第三方接口返回数据有误,
这个我们公司的第三方接口,我们都是打通的,比如电商,我们通过调用微信接口等等,都是打通的,
比如要测试下单第三支付,我们自己开店,收款设置我们自己的账号,然后通过商品设计 1 分钱,去
测试的。
如果不打通的话,基本也只能抓包,主要保证我们发送出去的数据符合需求文档就行,然后真正的上
线之前,我们会在预生产环境做一个联调测试,把各自系统连在一起,做一个联调测试没有问题了
我们就可以上线,基本就这么做的
联调测试怎么做的:
其实联调测试就是数据拉通测试,两个子系统,连在一起,形成一个完整的系统,然后从上游下数据,
下游接到数据看传过来的数据是否符合下游的系统要求然后下游做了操作,把数据返回给上游,通知
上游说数据返回了,上游看返回的数据是否符合要求,如果没有问题,就这个数据就拉通成功这个都
是按照用例来执行,上游和下游一起出一份用例,两边都评审通过,然后按照测试用例执行,每条用
例测试通过那么联调测就完成了。
9.13 你们接口怎么鉴权的?
(1)通过用户和密码,auth 鉴权
(2)通过 cookie 和 session
(3)通过 token
(4)通过 sign 签名
现在 app 一般是通过 token 鉴权,有些是通过把 token 放在请求头里面,有些是通过 singn 签名这
个字段放在 body 里面去鉴权的,一般的 web 是通过 session 去鉴权的
9.14 接口传输格式有哪些
常见的媒体格式类型如下:
text/html:HTML 格式
text/plain:纯文本格式
text/xm:XML 格式
Image/gif:gif 图片格式
mage/jpeg:jpg 图片格式
Image/ng:png 图片格式
以 application 开头的媒体格式类型
application/xhtm + xml: XHTML 格式
application/ml:XML 数据格式
application/atom + xml: Atom XML 聚合格式
application/json:JsoN 数据格式
application/pdf:pdf 格式
application/msword:Word 文档格式
application/octet-stream:二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded:encoded:<form encType=””>中默认的 encType,form
表单数据被编码为 key/value 格式发送到服务器(表单默认的提交数据的格式)
另外一种常见的媒体格式是上传文件之时使用的:
multipart/form-data:需要在表单中进行文件上传时,就需要使用该格式
9.15 cookie、session、token 的区别
它们都是用来做鉴权的,区别的话,大概是这样的
1、现在 cookie、session 一般是配合使用的用户第一次登陆时,服务器会创建一个 session
生成一个 sessionID,sessionID 保存在 cookie 中,然后返回到客户端,保存在浏览器中。
客户端每次发请求都会把这个值带到服务器,做一个鉴权和会话的跟踪,或者时效的验证
2、token 和 cookie、session 差不多,通过算法,每次验陆,会产生一串很长的随机字符串,一般
是在放在返回的 body 里面,或者返回的头里面,他们都是服务器产生,带过来是要做验证和时效的
验证的。一般在 app 中使用 token 比较多一点,Web 端使用 cookie、session 的鉴权方式会多一点。
9.16 接口测试的工具有哪些?
Fiddler 抓包工具,也可以做接口测试
Postman 接口测试工具,支持接口自动化测试
wireshark 支持电脑上各种协议的抓包工具,主要常见有 http 和 tcp 抓包
Soapui 功能强大的接口测试工具,性能测试,接口自动化测试
java+httpclient.jar java 代码实现接口自动化测试,一般需要借助单元测试框架 junit 和
TestNG 接口自动化测试框架设计:java+httpclient+TestNG
Python + requests python 代码实现接口与接口自动化测试,测试框架: unittest,pytest,
接口测试框架设计: python+ requests+ unittest+ htmlTestRunner 或者 python +requests+ pytest
Loadrunner 接口自动化测试,接口性能测试(主要)
jmeter 接口测试,接口自动化测试,接口性能测试(主要)
Swagger 编写在线接口文档,在线接口测试
9.17 jmeter 环境搭建
(1)安装 jdk(java 运行环境)
(2)安装 jmeter
9.18 接口工具 jmeter 用到哪些组件,具体作用
取样器:
http 请求
向服务器发 htp 请求
JDBC Requst
向数据库发请求
Debug Sampler
调试,看执行过程
Bean Shel 取样器
把某个变量设置定位全局变量
后置处理器:
正则表达式提取器
#提取接口的响应内容或请求内容中的数据具体要提什么数据根据需求来,比如我们充值接口依赖登
录接口,需要用到登录
接口的 cookie,需要提取 cookie
边界值提取器
JSON 提取器
Bean Shell Post Precessor
#在请求结束之后需要做的某些事情
比如转码
断言: #检验结果,验证本接口是否有问题
响应断言
Json 断言
配置元件:
CSV data Set Config
#读取 CSV 文件,txt 文件
JDBC Connection Confiquration
#连接数据库
Http Cookie 管理器
HTTP 信息头管理器
用户定义的变量
计数器
定时器:
同步定时器,主要用来设置集合点
监听器:
查看结果数
9.19 jmeter 原理是什么
jmeter 做接口测试其实就是模拟前端向后台发请求,它是通过线程来模拟真实用户对 web 服务器的
访问压力。基本原理是建立一个线程池,多线程运行取样器产生大量负载,在运行过程中通过断言来
验证结果的正确性,可以通过监听来记录测试结果
9.20 上传文件的接口用 JMeter 怎么做
另外一种问法:有没有做过文件上传的接口,具体怎么做?
要测试上传文件的接口,在 JMeter 的 http 请求这个组件中传递请求参数的栏目中专门提供了一个用
来文件上传的,在这里面需要填写几个内容,一个就是文件的路径,还有一个就会参数名称,还有就
是 MlME 类型也就是指定要上传的文件的类型,这样就可以了。
9.21 对于 POST 请求,要求传递 Json 格式数据, JMeter 怎么做
对于这个其实在 JMeter 的 http 请求这个组件中的参数配置栏目中,第二个栏目有个消息体数据,
我们把需要上传的参数组装成 json 格式,然后编写到 body data 里面,然后,需要在 http 信息头
管理其中,需要将数据格式设置为 json 格式,这个就是设置 Content-Type
为 application/json:charset=utf-8,这样就可以了。
9.22 对于需要加密的请求参数, JMeter 如何处理?
这里首先让开发给我们写一个加密,解密的 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 调用
mport com changfu EncryptAnd Decryptinterface; #导入加密类
String json_str =
"{\"Username\":\"amycheno2\",\"password\":\"F59BD65F7EDAFB087A81D4DC
AO6c4910\",\"deviceNo\",\"35584806988942\")";
#请求的参数
调用加密类中的函数对请求参数实现加密处理。
String enpost= EncryptAndDecryptinterface.getEncryptPost(json_str); #将请求参数加密
vars put("enpost",enpost);
#将加密处理后的数据存到 jmeter 变量中
9.23 如果接口返回的数据做了加密处理的,如何进行断言?
这里可以采用 Beanshell 断言
1、首先得让开发写一个解密的 jar 包,然后把 jar 包放入到 JMeter 的 JMeter 的 lib/ext 目录下
2、然后在测试计划中有一个 add Directory or jar to classpath 在这里指定 jar 的路径添加需要
的 jar 包
3、在 JMeter 中添加 Beanshell 断言,里面实现 java 代码,具体过程就是
a.导入解密的 jar 包中的解密算法类54
b.导入用于解释 json 格式数据的类(假设返回的数据是 json 格式的)
c.对数据进行处理器,首先获取接口的返回数据,然后调用解密算法类中的函数进行解密,解密出来
后就是一个 json 格式数据
d.然后调用 json 库中的函数对 json 数据进行解释,提取其中需要断言的字段,判断与预期结果是否
一致就可以了
具体代码:
1、在 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); //解析 json
String 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;}
9.24 下一个接口用到上一个接口的数据,但返回的数据加密了,如何提取?
比如:一次登录后做多个接口的操作,
然后登录后的 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,其他线程组可调用请该变量
具体代码:
mport 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= new JSONObject(resb); ∥解析 json 响应信息
String uid_str = data_obj.get("result").get("id").toString()://截取响应信息中 uid
的值
props.put("uid str".uid_str); ∥将 uid_str 数据存到变量中,这里用 props.put,其他线
程组可调用请该变量
log.info("加密前的 uid="+uid_str);
4、在下一个接口中添加一个用户参数,引用上面保存的 uid_str 变量
5、然后在下一个接口中添加一个 BeanShell PreProcessor(前置处理器),在其中编写
java 代码
具体就是:
a.导入解密的 jar 包中的加密算法类
b.获取登录传递的 uid_str 变量
c.调用加密算法中的加密函数对登录返回的 uid 进行加密处理
d.然后把加密后的数据保存到一个 jmeter 变量中
具体代码:
import com changfu.EncryptAndDecryptInte;
String uid_str= props.get("uid_str"); //获取登录传递的 uid_str 变量
String enuid=EncryptAndDecryptlnterface.getEncryptUID(uid_str)//加密登录返回的 uid
Vars.put("enuid",enuid);
log.info("加密登录后返回的 uid"+enid);
6、最后在下一个接口的参数中引用这个变量就可以了