My_Project

资料整理


接口测试白皮书

<p>维护人:易铭、杨庆鸳</p> <h3>一、接口测试:</h3> <p>1、什么是接口测试? 接口测试是指针对模块或系统间接口进行的测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等;</p> <p>2、为什么要做接口测试?</p> <ul> <li>越底层发现bug,它的修复成本是越低的;</li> <li>前端随便变,接口测好了,后端不用变,前后端是两拨人开发的;</li> <li>检查系统的安全性、稳定性,前端传参不可信,比如京东购物,前端价格不可能传入-1元,但是通过接口可以传入-1元;</li> <li>如今的系统复杂度不断上升,传统的测试方法成本急剧增加且测试效率大幅下降,接口测试可以提供这种情况下的解决方案;</li> <li>接口测试相对容易实现自动化持续集成,且相对UI自动化也比较稳定,可以减少人工回归测试人力成本与时间,缩短测试周期,支持后端快速发版需求。接口持续集成是为什么能低成本高收益的根源;</li> <li>现在很多系统前后端架构是分离的,从安全层面来说:1)只依赖前端进行限制已经完全不能满足系统的安全要求(绕过前面实在太容易), 需要后端同样进行控制,在这种情况下就需要从接口层面进行验证; 2)前后端传输、日志打印等信息是否加密传输也是需要验证的,特别是涉及到用户的隐私信息,如身份证,银行卡等;</li> </ul> <p>3、接口测试的原理:模拟客户端向服务器发送请求报文,服务器接收请求报文后对相应的报文做处理并向客户端返回应答,客户端接收应答的过程;</p> <p>4、接口测试的重点:检查数据的交换,传递和控制管理过程,还包括处理的次数;</p> <h3>二、常见接口类型</h3> <p>1、get型接口:</p> <ul> <li>说明:请求数参数写在网址后面,用&quot;?&quot;连接,多个参数之间用&quot;&amp;&quot;连接。</li> <li>场景:get型接口用于获取信息,多用于查询数据,如列表查询功能,点击查询按钮就调用一个get接口,然后把信息返回出来;</li> <li>特点:1)请求数据量小;2)参数暴露于url地址中,故存在安全隐患;</li> </ul> <p>2、post型接口:</p> <ul> <li>说明:向指定资源位置提交数据(如提交表单、上传文件)来进行请求,post请求可能会导致新资源的建立;</li> <li>场景:如注册、上传、发帖等功能;</li> <li>特点:请求数据量大,安全性高;</li> </ul> <p>3、put型接口:</p> <ul> <li>说明:put请求用于向指定资源位置上传最新内容;</li> </ul> <p>4、delete型接口;</p> <ul> <li>说明:请求服务器删除请求里url所标识的资源</li> </ul> <h3>三、接口文档</h3> <p>测试用例编写之前,我们需要找对应开发或是PD提供详细的接口文档,文档中接口重要信息是否完整直接影响到我们测试用例的设计以及测试的顺利执行; 详细接口文档具体包括如下几个部分(参考): 1、接口说明(比如:功能作用); 2、请求url地址; 3、请求方式; 4、是否有请求头信息; 5、请求参数列表:</p> <ul> <li>字段名;</li> <li>是否必传;</li> <li>字段类型;</li> <li>字段说明;</li> </ul> <p>6、返回格式; 7、状态码说明; 8、接口特殊说明; 9、接口业务逻辑说明;</p> <h3>四、用例设计</h3> <h4>测试用例设计思路:</h4> <p><img src="http://rpddoc.weoa.com/server/../Public/Uploads/2019-09-24/5d898f7d7fcbd.png" alt="" /> 注:1、2、3标签为测试用例优先级别(仅供参考);</p> <h3>五、测试工具</h3> <h4>1、Postman:</h4> <h5>优势:</h5> <p>单接口测试方便、快速,功能强大,支持用例管理,支持get、post、文件上传、响应验证、变量管理、环境参数管理等功能,可以批量运行,并支持用例导出、导入;</p> <h5>劣势:</h5> <p>1)每次接口测试时都要手工填入测试字段,结果也需要人工校验,无法全自动无人工干扰的进行测试; 2)不适用于多个关联接口测试,很多接口是一套接口,而并不是单个接口独立存在。而且接口之间还有相互依赖性。比如最常见的购物接口,首先需要使用用户名和密码进行登录,然后服务器验证登录后会返回一个token,这个token通常是放在http的response里面。接下来的添加购物车,提交订单也都要用到这个token作为身份认证标识。那么,对于这套接口测试起来就很麻烦,首先执行登录接口获取token,在测试后面的接口时都要加上token。注意token还有时效性,20分钟没有动作自动失效。那么,这套用例就无法保存在postman中,每次都要重新获取token; 3)自动化断言不够强大,不能和jenkins、代码管理库进行持续集成测试;</p> <h4>2、Jmeter:</h4> <h5>优势:</h5> <p>1)对于多个接口之间的依赖关系,Jmeter通过‘正则表达式提取器’就可以自动获取前一个response中的token,然后作为参数传给本次http请求。这个token可以保存在全局变量中,以供后面的接口使用。使用jmeter可以灵活的动态获取token,而不像postman每次需要手动获取; 2)JMeter提供了BeanShell编程能力,可以写出比较灵活的测试脚本,通过jmeter+ant+jenkins可以实现接口和性能自动化测试; 3)可以用来做性能测试,相比loadrunner来说,它内存占用小,免费开源,轻巧方便、无需安装;</p> <h5>劣势:</h5> <p>jmeter毕竟是性能工具,在报告的显示上以及返回值的校验上无法细化;以及在集成至持续集成也不是很方便;</p> <h4>3、Python脚本:</h4> <h5>优势:</h5> <p>1)python可以利用强大的第三方库Requests实现接口用例编写,结合unittest单元测试框架,生成测试报告,也可以和jenkins做持续集成测试; 2)扩展性大、灵活、效率高、技术得到提升;</p> <h5>劣势:</h5> <p>1)测试环境是否支持; 2)测试人员技术要求; 3)评估测试成本是否支持;</p> <h4>4、测试门户</h4> <p>待补充</p> <h4>六、测试方法</h4> <p>1、Linux中curl命令请求接口测试: cURL(CommandLine Uniform Resource Locator)是一个可以在命令行输入命令传输文件的工具 cURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。 curl的基本用法:curl [options] [URL...] (也可以不用opthion,那默认就是get请求)</p> <p>参数说明 (参数区分大小写) -d后面跟着的为需要发送的数据 -H自定义头信息 -X指定协议类型</p> <p>案例: post请求:curl -X post &quot;<a href="http://www.yahoo.com/login.cgi">http://www.yahoo.com/login.cgi</a>&quot; -d ‘{&quot;a&quot;:&quot;1&quot;,&quot;b&quot;:&quot;2&quot;}’ get请求:curl '<a href="http://www.yahoo.com/login.cgi?user=nickname&password=12345'(默认get请求">http://www.yahoo.com/login.cgi?user=nickname&password=12345'(默认get请求</a>) 请求自定义头信息headers:Curl -X PUT ‘URL’ -H ‘’CONTENT-TYPE:APPLICATION/JSON’ -d ‘{&quot;a&quot;:&quot;1&quot;,&quot;b&quot;:&quot;2&quot;}’</p> <p>参数区分大小写! -x在给定的端口上使用HTTP代理 -X指定什么命令 -d代表post请求(后面可以跟json格式文件,也可以直接json) -H自定义头信息 -p(小写)使用HTTP代理 -P (大写)使用端口地址,而不是使用PASV -T 上传文件 -u设置服务器的用户和密码 -U设置代理用户名和密码</p> <p>接口解析(最简单的接口):123.45.67.89:1080/a/login/jiekou</p> <h4>七、测试注意事项</h4> <p>1、接口测试经常遇到的bug和问题,如下:</p> <ul> <li>传入参数处理不当,导致程序crash;</li> <li>类型溢出,导致数据读出和写入不一致;</li> <li>因对象权限未进行校验,可以访问其他用户敏感信息;</li> <li>状态处理不当,导致逻辑出现错乱;</li> <li>逻辑校验不完善,可利用漏洞获取非正当利益等。</li> </ul>

页面列表

ITEM_HTML