HTTP基础:接口测试
接口的概念
1、接口又称API(Application Programming Interface,应用程序编程接口),是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
2、两个不同的系统或者一个系统中两个不同的功能,它们之间相互连接的部分称为接口
3、软件项目中,接口是系统与系统之间,模块与模块之间或者服务与服务之间相互调用的入口。从开发者角度,接口是分工协作的产物,不同开发者实现自己的功能之后,封装成接口,供其他开发者调用。其他开发者只要按规定格式发送一些必要参数,就能使用该功能
4、在软件测试中,常说的接口一般有两种图形用户接口(GUI),它是人与程序的接口;应用程序编程接口(API)
简单概括为以下3点:
1、程序代码(函数方法)
2、屏蔽实现细节
3、可以被访问/调用来获取信息或实现某些功能(提供访问地址,定义了访问规则)
接口自述(通俗的来说):
1、首先我有一些功能(功能函数)
2、你不用关心我怎么实现的(屏蔽细节)
3、我会给你一个我的地址(接口地址)
4、你按照地址找到我,按照我规定的格式(请求类型)告诉我所需要的信息(参数)就行
5、我会给你个反馈(相应信息)
接口分类
依据所遵循的协议不同,常见的接口可以分为以下3类:
1、HTTP接口:它是基于超文本传输协议(HTTP)开发的接口
2、Web Service接口:它是系统对外的接口。比如你要从别的网站或者服务器上获取资源,别人不会把数据库共享给你,他们会提供一个写好的方法,让你来获取数据
3、RESTful接口:简称REST,其描述了一个架构样式的网络系统,核心是面向资源。REST专门针对网络应用设计和开发方式,降低开发的复杂性,提高系统的可伸缩性
注:基于浏览器/服务器模式(B/S)的软件系统接口大多数为HTTP接口
接口测试的原理
测试人员借助工具模拟客户端向服务器端发送请求报文,服务器端接收请求报文后,对相应的报文做出处理并向客户端返回应
答,工具模拟客户端接收应答,然后测试人员检查应答是否正确
接口测试的范围
关于接口测试的范围,主要从以下两个方面进行介绍:
1、是否所有的接口都需要测试
随着系统复杂度越来越高,接口越来越多,想要完全覆盖所有的接口是一件非常困难的事。通常情况下,主要测试最外层的两类接口:数据进入系统的接口(调用外部系统的参数为本系统使用)和数据流出系统的接口(验证系统处理后的数据是否正确)
2、被测试接口需要测试哪些方面
测试人员需要关注被测试接口的功能是否实现,性能是否达标,安全性是否满足。重点关注数据的交换、传递、处理次数以及控制管理过程
测试接口的必要性
1、软件系统的复杂度不断上升,仅靠功能测试已难以保证项目的质量和进度(功能测试的片面性和滞后性导致成本增加、测试效率低),而接口测试能使测试团队更早、更深入地介入项目:初期就能发现系统深层次的问题,降低问题修复的时间成本
2、接口的变更概率远远小于用户界面的变更概率,因此接口测试自动化维护成本比UI自动化维护成本更低,接口测试相对于更容易实现自动化测试持续集成:减少回归测试的人力和时间成本,缩短测试周期(持续集成是接口测试的灵魂)
3、接口是各种系统功能的基础,接口测试介于单元测试与系统测试之间,单元测试一般由开发完成(不要相信开发)
接口测试流程
1、编写接口测试计划
接口测试计划与功能测试计划的目标一致,都是为了确认需求、确定测试环境以及测试方法,为设计测试用例做准备,初步制定接口测试进度方案。一般来说,接口测试计划包含概述、测试资源、测试功能以及重点,测试策略、测试风险、测试标准等
2、编写、评审接口测试用例
和功能测试类似,在开始接口测试前,需要根据测试文档、接口文档等项目相关文档编写并评审接口测试用例。接口测试思路如下图
3、执行接口测试
依据编写的接口测试用例,借助测试工具(如Postman、JMeter等)执行接口测试,上报发现的问题
接口文档是接口测试的参照,至少包括:
1、接口说明
2、调用url
3、请求方法(get\post ……)
4、请求参数、参数类型、请求参数说明
5、返回参数说明
接口测试质量评估标准:
1、接口覆盖率是否达到要求
2、业务规则覆盖是否完整
3、参数验证是否达到要求(边界、业务规则)
4、接口异常场景覆盖是否完整
5、代码覆盖率是否达到要求
6、性能指标是否满足要求
7、安全指标是否满足要求
接口自动化测试持续集成的要点
进行项目测试时,接口会增加、减少或变更,测试用例也会相应更新,因此需要借助工具(如GitHub等)来维护测试用例进行持续集成,通过自动化测试实时监控项目接口运行情况。对接口测试而言,持续集成是核心内容,通过自动化的手段才能做到低成本、高收益。接口自动化测试持续集成主要包括以下内容:
1、流程方面:在回归阶段加强接口异常场景的覆盖,并逐步向系统测试、冒烟测试阶段延伸,最终达到全流程自动化
2、结果展示:更加丰富的结果展示,趋势分析、质量统计和分析等
3、问题定位:报错信息、日志更加精确,方便问题的复现和定位
4、结果校验:加强自动化校验能力,如数据库信息校验
5、代码覆盖率:不断尝试由目前的黑盒向白盒下探,提高代码覆盖率
6、性能需求:完善性能测试体系,通过自动化的手段监控接口性能指标是否正常
拓展:
前后端分离
1、前后端分离是近年来Web应用开发的一个发展趋势。这种模式具有以下优势:
2、后端人员不需要精通前端技术,只专注于数据的处理,对外提供API即可
3、前后端分离可扩大接口的应用范围,开发的接口可以应用于Web页面,也可以应用到APP上
4、节约开发时间
HTTP
1、HTTP的目的是为了提供一种发布和接收HTML页面的方法
2、HTTP的主要特点有:简单(服务器程序规模小,因为通信速度比较快)、灵活(HTTP允许传输任意类型的数据对象,传输类型由Content-Type加以标记)、无连接(服务器处理完客户端的请求,并收到客户端的应答后,即断开连接,可以节约传输时间)、无状态(对于事物处理没有记忆能力)
3、HTTP请求包含4个部分:统一资源标识符、方法(Method)、头部(Headers)和体(Body)
4、HTTP中GET方法和POST方法的不同点
⑴提交数据的方式不同:GET方法中请求的数据会附在URL之后;POST方法中会把提交的数据放置在HTTP包的请求体中(因此GET方式提交的数据会在地址栏中显示出来而POST方式提交的数据不会再地址栏中显示出来)
⑵传输数据大小不同:虽然HTTP没有对传输的数据大小进行限制,HTTP规范也没有对URL的长度进行限制,但浏览器或其他方面会存在一些限制
GET:特定的浏览器和服务器会对URL长度有限制,因此使用GET方式提交时,传输数据就会收到URL长度的限制
POST:此方式由于不是通过URL进行传输的,理论上不会受到限制,但实际上各个Web服务器会规定使用POST方式提交的数据进行大小限制
⑶安全性不同:POST方式比GET方式安全性更高:GET提交的数据会在URL中显示出来
JSON:
1、JSON是一种轻量级数据交换格式。其易于阅读和编写,也易于机器解析和生成,并能有效的提升网络传输效率。因,HTTP接口响应一般为JSON格式
2、JSON语法规则:用大括号保存对象、用键值对表示对象、用逗号分隔每个对象、用中括号保存数组
3、JSON示例:
{"name":"storm","age":"32","sex":"male"}
网络基础知识:IP
IP地址:就像每个人都有一个身份证号码;IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址
查看IP命令
1、Windows: ipconfig
2、Linux: ifconfig
3、python:检查字符串是否ip
def check_ipv4(ip):
num_list = ip.split(".")
for num in num_list:
if not num.isdigit() or not 0 <= int(num) <=255:
return False
else:
return True
if __name__=="__main__":
print(check_ipv4("101.1.0.201"))
#上面代码的输出结果为:True
网络基础知识:端口
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。如果把IP地址比作一间房子,端口就是出入这间房子的门。一个IP地址的端口可以有65536(即:2^16)个
端口类型
1、公认端口:从0到1023,紧密绑定于一些服务
2、注册端口:人1024到49151,许多服务绑定这些端口,这些端口同样用于许多其它目的。
3、动态或私有端口:从49152到65535。理论上,不应为服务分配这此端口。实际上,机器通常从1024起分配动态端口。
常见软件默认端口
Apache/Nginx(HTTP服务): 80
Tomcat: 8080
Oracle: 1521
MySQL: 3306
SQL Server: 1433
PostgreSQL: 5432
MongoDB: 27017
Redis: 6379
Memcached: 11211
查看端口命令
Windows: netstat -ano
Linux: netstat -ntlp
解决端口占用问题
Windows: netstat -ano | findstr "8080",找到占用端口的程序的PID -> 打开任务管理器 -> 设置显示PID -> 找到并结束对于程序
Linux: netstat -ntlp | grep "8080", 找到对应的程序 -> ps -ef | grep "程序名" 找到对于的pid -> kill 相应的id