软件测试丨工具在接口测试中发挥什么样的作用?
获取更多相关资料
接口测试究竟是什么?为什么要用接口测试?它有哪些工具呢?这一连串的问题敲击着我们,请带着这些问题,在本文中寻找答案,我将为您打开接口测试的大门。
1. 初探接口测试
接口测试是什么。它检查数据的交换,传递和控制管理过程,它绕过了移动端,对服务端进行测试,是个十足的跨栏高手。
图片来源:网络
你一定听说过 ui 测试,它可以对前端进行测试,例如 selenium 工具是一个典型的 ui 测试工具,是否可以通过 ui 测试来诊断后端呢?不可以!
因为后端非常复杂,就像下图这样。ui 测试无法涵盖这么复杂的链路的,在这么庞大的结构下,selenium 显得力不从心。这就是我们为什么要绕过移动端,从而使用接口测试的原因。
图片来源:阿里云
那么接口测试有什么优点呢?我们对测试进行分层,如下面这个图片,越往上,速度越慢,发现 bug 的时间越晚,接口测试(service)相比 ui 测试,可以更早发现问题,更快的质量反馈。
图片来源: martinfowler.com/bliki/TestP…
既然接口测试优于 ui 测试,我们为什么不取消 ui 测试?虽然 ui 界面不稳定(经常变化),也很肤浅(无法涵盖所有后端测试),但 ui 端很多东西是无法被替代,比如颜色好不好看,小数点显示几位合适,按钮是不是小了,等等。
很多人觉得自己只会一种测试就可以了,但你不知道,测试是一个整体,无法互相替代。我们希望一个>优秀的工程师,是至少满足我们的 3.5 级标准。也就是自动化测试+接口+持续集成这个核心---霍格沃兹测试开发学社:思寒
我们接口测试工具都是依赖下面的七层网络模型,但七层只是概念,真正只使用有五层(tcp/ip)。比如 tcpdump 是个超级底层的东西,它就是在网络层嗅探,因此需要使用 root 权限。
图片来源:百度百科
如果对接口测试工具进行分类,可以如下几类:
网络嗅探工具:tcpdump、wireshark
代理工具:fiddler、charles、anyproxyburpsuite、mitmproxy
分析工具 curl、postman、chrome Devtool
下面对部分工具进行简介。我会告诉你为什么用,怎么用,以及工具之间的联系。
2.tcpdump
首先登场的是 tcpdump。将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供 and、or、not 等逻辑语句来帮助你去掉无用的信息。
上面说过,它在网络层嗅探,是个超级底层的工具,我们用几个命令了解它的威力。
它是一个十足的网络管理员,比如你可以让管理员 tcpdump 时刻监听 443 端口,如果有异样就向我们汇报:
tcpdump port 443 -v -w /tmp/tcp.log
port 443 监听 443 端口
-v 输出一个稍微详细的信息
-w 把数据写到 log 中
利用这条命令,会把得到的报告放到目录 /tmp/tcp.log 中,随后我将带领您,用 wireshark 分析 tcpdump 生成的报告,体会他们兄弟俩的友情。
3.wireshark
wireshark 也是一款网络嗅探工具,它不仅包含 tcpdump 功能,还有更多扩展功能,比如分析工具。
但是它有一个弊端,如何我们的数据包走的是 https,是无法抓到的,因为 https 是一个加密消息,加密是为了让消息更可靠,浏览器很讨厌,他会把 http 转换成 https,那么有哪些网站可以用 http 呢?
在百度上搜 mp3:www.baidu.com/s?wd=mp3
这是一个典型的 http 请求,首先用 tcpdump 截获请求,并生成 log,然后用 wireshark 打开 tcpdump 生成的 log:你会看到前几项是非常奇怪的东西,这是什么?
这是三次握手,为什么要三次握手?因为信道是不可靠的,我们发送数据前,就必须确保信道稳定,而三次握手就像是下面这些操作:
第一次握手:建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SENT 状态,等待服务器确认。
第二次握手:服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(seq=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态;
第三次握手:客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED(TCP 连接成功)状态,完成三次握手。
如果你觉得头晕,不如想象成下面这样:
开发小哥向测试媛打招呼
测试媛点头微笑并简单回复
开发小哥点头微笑
经过打招呼,他们就可以更进一步交流,就像下面这样:
时间飞快,不知不觉聊了一个下午,是时候说再见了,于是进行了四次挥手:
第一次挥手:客户端向服务器端发送一个 FIN,请求关闭数据传输。
第二次挥手:服务器接收到客户端的 FIN,向客户端发送一个 ACK,其中 ack 的值等于 FIN+SEQ
第三次挥手:服务器向客户端发送一个 FIN,告诉客户端应用程序关闭。
第四次挥手:客户端收到服务器端的 FIN,回复一个 ACK 给服务器端。其中 ack 的值等于 FIN+SEQ
这个过程就像是:
开发小哥:“是时候说再见了”
测试媛 :“嗯”
测试媛 :“那下次再见”
开发小哥:“好”
需要注意的是,一个请求可能分为多个包,一个数据也是这样,于是你在 wireshark 会看到很多包。
有人会问,既然 wireshak 包含了 tcpdump 的功能,我们费这么大力气导出 tcp.log 干嘛,为什么不直接用 wireshark 截获数据包?
是这样的,在接口测试,我们的抓包过程都是在服务器上,服务器是个暴脾气,不给你提供 ui 界面,而 wireshark 恰好有 ui 界面,在服务器上无法工作,瞬间变成了盲人。
我们只能利用 tcpdump 抓包生成 log,然后将 log 分给 wireshark,在客户端上分析。wireshark 无法分析 https 协议的包,那我们对 https 就束手无策了吗?不是的,我们很强大,代理工具 charles 就可以破解 https。
4.chrome Devtools
这是 chrome 自带的分析工具。使用前,你要勾选命令行->更多工具->开发者工具,在页面上右键检查来打开分析工具。需要注意的是:本次我们只关注 network 它非常全面,比如状态,类型等等。
上面就是它的全貌了,我们点击一个连接,可以看到下面的交互细节。
上面的东西非常多,我们点击 xhr 来筛选,xhr 可以进行同步或异步地返回 Web 服务器的响应,并且能够以文本或者一个 DOM 文档的形式返回内容。右键->copy->copy as curl,以下是在雪球模拟搜索请求"souguo"的命令。
但是,当我们直接在命令行中运行时,你会发现,出现一些问题,这是因为少了 cookie:
curl 'stock.xueqiu.com/v5/stock/ba…' -H 'Accept: /' -H 'Referer: xueqiu.com/k?q=sogo' -H 'Origin: xueqiu.com' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36' --compressed
windows 不带有 curl 命令,需要进行安装。curl 命令的具体使用请关注霍格沃兹测试学院教学视频。
windows 不带有 curl 命令,需要进行安装。
5.面试常见问题
1. http 与 https
有人对 http 与 https 还是很模糊,这里进行说明,首先用下面的 curl 命令访问 ceshiren.com,你会看到它包含连接成功,服务器验证,加密连接等等,我称这些为加密。
-vvv:查看细节
上面的加密连接完成后,继续往下看,这便是主题,你会看到一系列字段,包括请求类型是 get,请求内容是什么。注意下面返回的符号<,是指服务器返回给我们的内容,keep-alive 的意思是保活,不进行四次挥手等等。我称这些为主题。
同样,我附上 wireshark http 的内容:
看到了吗,他们的主题简直是一模一样。于是得出这样的结论,https 和 http 本质是一样的,不同的就是这个加密过程,https 试图对链接进行加密,这种加密让我们开发人员很烦恼,不得不承认,https 很棒,时刻保护着我们。
浏览器也很棒,他会把 http 链接转换为 https。
2. session 与 cookie 的区别
第一次访问百度时,会有 setCookie 命令。于是浏览器存一份在本地,当再次访问时,浏览器会带上这份 cookie 在请求头,增加这个机制是为了追踪一个人访问的过程。
session 是什么呢?session 是一个特殊的 cookie,它把数据都存在了服务器,本地只有一个 id,服务器可以用 id 去寻找它对应的数据。
3. get 与 post 的区别
发起请求时,我们常常会看到 get 和 post,他们究竟有什么区别呢?在神秘而美丽的万维网中,TCP 就像是运输汽车,我们用 TCP 来运输数据。
它勤劳而可靠,从不会丢货。如果路上全是一模一样的运输汽车,那这个公路会一团混乱,因为非常紧急的汽车(警车)可能被前面的汽车拦堵在路上,因为它们都是 TCP。
为了避免这种情况发生,警察叔叔制定了交通规则:HTTP。HTTP 给汽车分门别类,有 GET, POST, PUT, DELETE 等等,HTTP 规定,GET 请求的汽车,要贴上 GET 的标签,而且要求把传送的数据放在车顶上(url 中)。如果是 POST 请求,要贴上 POST 的标签,并把货物放在车厢里(请求体 body)。
当然,你也可以在 GET 的时候往车厢内(body)偷偷藏点货物;也可以在 POST 的时候在车顶上(url 中)放一些数据。HTTP 只是个行为准则,而 TCP 才是 GET 和 POST 怎么实现的基本。
当然,接口测试远不止上面这些,你需要知道更多,比如 charles 到底怎么使用?打开一个网站会发生什么事情?使用 nc 黑客工具模拟浏览器可以偷偷地干什么?http 的 header 必须要有什么?这些都是接口测试中必须要知道的知识。
获取更多相关资料
版权声明: 本文为 InfoQ 作者【测试人】的原创文章。
原文链接:【http://xie.infoq.cn/article/0f3815f896bb5a634c3a0a3ae】。文章转载请联系作者。
评论