接口测试流程及面试会遇到的问题

接口测试流程或者说接口测试怎么做的?

1、分析需求文档,2、编写测试计划、用例(微信标签:0-30字符,数字,字母,汉字,组合的,1-30有效(29个,30,1,15,17,8)无效(特殊字符开头?是有效,其他国家语言0-30之间字符,空,空格,表情,超长31个,超长10000,重复(业务),url错误-http/参数缺失,请求方法错误,body数据格式错误json,头信息不对(content-type不匹配)??)),3、执行测试,分析测试结果与预期结果是否一样。4、总结写测试总结报告

使用python-requests库测试。

import requests

url = "http://114.116.97.187:8086/zentao/user-login.html"

payload = "account=admin&password=b5be656a7060dd3525027d6763c33ca0&passwordStrength=1&referer=%2Fzentao%2F&verifyRand=504592655&keepLogin=0&captcha="
headers = {
  'host': '114.116.97.187:8086',
  'proxy-connection': 'keep-alive',
  'content-length': '137',
  'authorization': 'Basic cm9vdDoxMjM0NTY=',
  'accept': 'application/json, text/javascript, */*; q=0.01',
  'x-requested-with': 'XMLHttpRequest',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36',
  'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
  'origin': 'http://114.116.97.187:8086',
  'referer': 'http://114.116.97.187:8086/zentao/user-login-L3plbnRhby8=.html',
  'accept-encoding': 'gzip, deflate',
  'accept-language': 'zh-CN,zh;q=0.9',
  'cookie': 'zentaosid=3bf2cf46ff8f8f110e90f8855255d25a; lang=zh-cn; device=desktop; theme=default; windowWidth=978; windowHeight=664; welcomebanner_status=dismiss; language=zh_CN; cookieconsent_status=dismiss; continueCode=e73k0plt2H2hNTQsDFau5izSwJfD2SaJHvlSz4UMpTpVCvXiQLh92sMN0X5l; bugBranch=0; bugModule=0; device=desktop; lang=zh-cn; lastBugModule=0; preBranch=0; preProductID=1; productStoryOrder=id_desc; qaBugOrder=id_desc; storyBranch=0; storyModule=0; theme=default; treeBranch=0'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)


.session()方法可以保存登陆状态,如果有token的头信息也必须加上token.

```python
import requests

url = "http://114.116.97.187:8086/zentao/user-login.html"

payload = "account=admin&password=b5be656a7060dd3525027d6763c33ca0&passwordStrength=1&referer=%2Fzentao%2F&verifyRand=504592655&keepLogin=0&captcha="
s=requests.session()
headers = {
    'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
}
response = s.request("POST", url, headers=headers, data=payload)
# print(response.text)

add_bug_url='http://114.116.97.187:8086/zentao/bug-create-1-0-moduleID=0.html'
add_bug_payload="------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"product\"\r\n\r\n1\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"module\"\r\n\r\n0\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"project\"\r\n\r\n0\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"execution\"\r\n\r\n0\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"openedBuild[]\"\r\n\r\n1\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"assignedTo\"\r\n\r\n\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"deadline\"\r\n\r\n\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"type\"\r\n\r\ncodeerror\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"os\"\r\n\r\n\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"browser\"\r\n\r\n\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\n" \
                "Content-Disposition: form-data; name=\"title\"\r\n\r\ntest988991\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"color\"\r\n\r\n\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"severity\"\r\n\r\n3\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"pri\"\r\n\r\n3\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"steps\"\r\n\r\n<p>[step]</p><br/><p>[result]</p><br/><p>[except]</p><br/>\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"story\"\r\n\r\n0\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"task\"\r\n\r\n0\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"oldTaskID\"\r\n\r\n0\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"mailto[]\"\r\n\r\n\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"keywords\"\r\n\r\n\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"status\"\r\n\r\nactive\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"labels[]\"\r\n\r\n\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"files[]\"\r\n\r\n\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"uid\"\r\n\r\n6135a9c5e3f35\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"case\"\r\n\r\n0\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"caseVersion\"\r\n\r\n0\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"result\"\r\n\r\n0\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY\r\nContent-Disposition: form-data; name=\"testtask\"\r\n\r\n0\r\n------WebKitFormBoundaryuC6W0EONj2HL7KrY--\r\n"
add_header={
    'content-type': 'multipart/form-data; boundary=----WebKitFormBoundaryuC6W0EONj2HL7KrY',
}
res_add=s.request("POST",add_bug_url,data=add_bug_payload,headers=add_header,)

print(res_add.text)
接口测试问题总结:
自己的问题:请求地址错误,方法错误,数据格式错误,头信息content-type,token,request/session()能够保存状态,写的提取代码的问题。程序的问题:有数量限制,添加只能一次。工具的问题:单独执行与集合整体执行。环境变量的问题。

token、session、cookie三者区别:
Token
令牌,是用户身份的验证方式。
一个Token就是一些信息的集合;
session
会话,代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续。
cookie
储存在用户本地终端上的数据,服务器生成,发送给浏览器,下次请求统一网站给服务器。
cookie与session区别
cookie数据存放在客户端上,session数据放在服务器上;
cookie不是很安全,且保存数据有限;
session一定时间内保存在服务器上,当访问增多,占用服务器性能。
session与token
作为身份认证,token安全行比session好;
Session 认证只是简单的把User 信息存储到Session 里,因为SID 的不可预测性,暂且认为是安全的。这是一种认证手段。 而Token ,如果指的是OAuth Token 或类似的机制的话,提供的是 认证 和 授权 ,认证是针对用户,授权是针对App 。其目的是让 某App有权利访问 某用户 的信息。
token与cookie
Cookie是不允许垮域访问的,但是token是支持的, 前提是传输的用户认证信息通过HTTP头传输;
token就是令牌,比如你授权(登录)一个程序时,他就是个依据,判断你是否已经授权该软件;cookie就是写在客户端的一个txt文件,里面包括你登录信息之类的,这样你下次在登录某个网站,就会自动调用cookie自动登录用户名;session和cookie差不多,只是session是写在服务器端的文件,也需要在客户端写入cookie文件,但是文件里是你的浏览器编号.Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端。


面试题:浏览器和服务器的简单交互过程(在浏览器地址栏上输入一个网址,之后发生 什么了?)
1. 解析 URL
不知道有没有同学会混淆域名和 URL 的概念,可以这样理解,URL 就是我们输入的网址,而网址里面含有域名。浏览器做的第一步就是解析 URL 得到里面的参数,将域名和需要请求的资源分离开来,从而了解需要请求的是哪个服务器,请求的是服务器上什么资源等等。
 2. 浏览器封装 HTTP 请求报文
对 URL 进行解析之后,浏览器确定了目标服务器和文件名,接下来就需要根据这些消息「封装」成一个 HTTP 请求报文发送出去。解释一下「封装」,这是一个贯穿整个计算机网络的概念。就是说发送端在层与层之间传输数据时,每经过一层必定会被打上一个该层所属的首部信息。反之,接收端在层与层之间传输数据时,每经过一层就会把该层对应的首部信息消去。
3. DNS 域名解析获取 IP 地址
1)首先搜索「浏览器的 DNS 缓存」,缓存中维护着一张域名与 IP 地址的对应表;
2)若没有命中,则继续搜索「操作系统的 DNS 缓存」;
3)若仍然没有命中,则操作系统将域名发送至「本地域名服务器」,本地域名服务器查询自己的 DNS 缓存,查找成功则返回结果(注意:主机和本地域名服务器之间的查询方式是「递归查询」);
4)若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行查询,通过以下方式进行「迭代查询」(注意:本地域名服务器和其他域名服务器之间的查询方式是迭代查询,防止根域名服务器压力过大):
首先本地域名服务器向「根域名服务器」发起请求,根域名服务器是最高层次的,它并不会直接指明这个域名对应的 IP 地址,而是返回顶级域名服务器的地址,也就是说给本地域名服务器指明一条道路,让他去这里寻找答案
本地域名服务器拿到这个「顶级域名服务器」的地址后,就向其发起请求,获取「权限域名服务器」的地址
本地域名服务器根据权限域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址
4)本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
5)操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来
6)至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起来
4. 建立 TCP 连接
获取到了目标服务器的 IP 地址之后,浏览器就知道我等下请求要发给谁了,这个时候就可以开始发送封装好了的 HTTP 请求报文了,那么既然需要发送请求,必然就需要 TCP 通过三次握手为浏览器和服务器之间建立可靠的连接,「保证双方都具有可靠的接收和发送能力」。
5. 浏览器发送请求
TCP 三次握手完成后,浏览器与目标服务器之间就建立了一个可靠的虚拟通道,于是浏览器就可以发送自己的 HTTP 请求了。6. 负责传输的 IP 协议
实际上,TCP 在三次握手建立连接、四次握手断开连接、以及连接建立过程中的收发数据(TCP 报文段)等各阶段操作时,都是通过 IP 协议进行传输的,IP 协议将这些阶段的数据添加 IP 首部封装成 IP 数据报再进行传输。
7. 使用 ARP 协议凭借 MAC 地址通信
8. 服务器响应请求
浏览器的 HTTP 请求报文通过 TCP 三次握手建立的连接通道被切分成若干报文段分别发送给服务器,服务器在收到这些报文段后,按照序号以原来的顺序重组 HTTP 请求报文。然后处理并返回一个 HTTP 响应。当然,HTTP 响应报文也要经过和 HTTP 请求报文一样的过程。
9. 断开 TCP 连接
浏览器和服务器都不再需要发送数据后,四次挥手断开 TCP 连接
10. 浏览器显示界面
浏览器接收到服务器返回的 HTTP 响应报文后,根据浏览器的渲染机制对相应的数据进行渲染
总结
屏蔽掉底层细节,笼统的总结一下上述过程。

应用层:
浏览器封装 HTTP 请求报文
DNS 解析域名获得目标服务器地址
传输层:
建立连接
把应用层传过来的 HTTP 请求报文进行分割,并在各个报文上打上标记序号及端口号转发给网络层
网络层:
利用 ARP 协议根据 IP 地址获取作为通信目的地的 MAC 地址后转发给链路层
服务端在链路层收到数据,按序往上层发送,一直到应用层接收到浏览器发送来的 HTTP 请求报文,然后处理该请求并返回 HTTP 响应报文,浏览器接收到响应报文之后解析渲染界面。最后 TCP 断开连接。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值