接口测试
功能自动化测试:
使用Selrnium、QTP等自动化工具对系统进行测试
缺点:投入产出比低,发现Bug能力弱
单元自动化测试
缺点:难度大、找不到合适的人员、成本高
接口自动化测试
主要测试模块间的调用关系的正确性
接口
- 接口全称为应用编程接口,简称为API
- 接口的本质上是程序开发的函数或者方法,完成一定功能的代码集合
接口的类型
- 接口是指外部系统与内部系统之间以及各个子系统之间的交互点
- 包含外部接口、内部接口、
- 内部接口又分为上层服务与下层服务接口、同级接口
- 常用接口为HTTP协议接口
接口测试的含义
- 对接口的功能、性能、安全性等方面进行验证的一种测试类型
- 接口功能测试主要用于验证接口是否正确实现或处理需要的各种业务,将不同的数据传递给同一个接口,判断各个返回值是否正确
为什么进行接口测试
- 前后端分离
为什么要做接口测试?
·接口自动化测试维护成本比UI自动化维护成本更低
·接口测试相对于更容易实现自动化测试持续集成
·减少回归测试人力和时间成本
·缩短测试周期
·满足后端快速发版的需求
接口测试能做什么?
自动准备测试数据(数据初始化)
自动执行测试用例
自动验证接口返回的结果是否正确
自动验证数据库数据的准确性
自动生成测试报告
接口测试的方法
- 自动化测试初级:测试工具,例如Postman、JMeter、Fiddler、Charles等工具使用
- 自动化测试高级:自动化测试脚本,Python、Requests库、pytest/unittest、pandas、pymysql等
接口自动化测试的含义
- 通过编写脚本实现接口测试
接口的优势
·规范性
定义接口的时候就是在定义规范,定义接口文档(编写接口文档就是在编写规范)
·扩展性
函数编程
接口测试本质
测试人员借助工具模拟客户端向服务器发送请求,服务器接受请求,对相应的请求数据作出处理并向客户端返回结果
,工具模拟客户端接收返回结果,然后测试人员检查返回结果是否正确
接口的组成要素
接口地址
URL叫做资源统一定位器、表示一个完整的网址或接口地址
协议://服务器的IP地址或域名:端口号/项目名称/接口名称?参数名1=参数值1&参数名2=参数值2
URL叫统一资源标识符也成为接口路径,用来表示网址或接口中具体的位置或名称,是URL一部分
/项目名称/接口名称
面试题?http与https的区别???
1. 安全性不同2. 响应速度4. 消资源5. 展示方式6. 费用不同
http和https采用两种完全不同的连接方式,前者采用的是80端口,后者则是443端口。
https是构建在SSL之上的http协议,所以https会消耗更多的服务器资源
自动化测试能做什么
- 自动准备初始化数据
- 自动执行测试用例
- 自动验证接口返回结果的正确性
- 自动验证数据库数据的正确性
- 自动生成测试报告
接口测试的步骤
- 分析需求
- 编写测试用例
- 部署接口测试用例
- 制作测试脚本(使用工具/编码)
- 执行测试脚本
- 记录测试结果
- 生成测试报告
服务器与客户端
- 服务器:被测软件或者被测接口程序
- 客户端:个人计算机,一般会安装Postman、Fiddler、Charles、APIfox、JMeter
请求与响应
- 客户端要使用服务器上的某个软件或功能,需要把处理的数据发送给服务器,服务器上的接口程序会处理数据,然后把处理的结果发送给客户端
- 客户端发送数据给服务器的过程叫做请求
- 服务器把结果发送给客户端的过程叫做响应
请求的组成有哪些
请求头 网页搜索(selenium)
- 编码方式、语言、Cookie、地址、重定向地址、设备信息、浏览器信息、操作系统、系统位数
请求体
- 也叫请求正文、对于POST方法来讲、要发送给服务器的数据存放在请求体中
响应的组成
响应头
- 主要是指相应的附加信息,比如响应类型、响应状态码、cookie、session等
响应体
- 也叫响应正文、相当于接口返回值
- 是测试时,最关心的内容
Web接口的组成要素
接口地址
协议://服务器IP地址或域名:端口号/项目名/功能名
协议://服务器IP地址或域名:端口号/项目名/功能名?参数名=参数值1&参数名2=参数值2
协议
- http端口号80
- https端口号443
- https是基于SSL的超文本传输协议,比http更加安全
域名
端口号
- 一台服务器会提供很多服务,用不同的端口号来区分不同的应用程序或接口
- 端口号是可以修改的
?
- 用于分割接口地址和参数的标志
- 一般带有问号的请求是GET请求方法
&
- 用于连接多个参数,固定写法
- URL叫做统一资源定位器,表示一个完整的网址或接口地址
- URI叫做统一资源标识符,一般用来表示网址或接口中具体位置或名称,是URL的一部分
请求方法
- 表示如何发送和处理数据
- 常用的请求方法
- 注意测试时,使用哪种方法要根据接口文档
请求参数
- 需要接口程序处理的数据
- 参数名、参数类型、参数长度、参数约束、哪些必填、哪些选填
响应头
- 响应状态码、简称为状态码
- 200 成功响应
- 301 永久重定向
- 302 临时重定向
- 400 域名不存在或请求错误(参数错误)
- 401 需要授权
- 403 客户端错误
- 404 接口地址错误
- 500 服务器错误
响应类型
- text/html/网页版文本格式
- JSON类似于python的字典
- xml
响应正文
- 接口返回值中最核心的部分
- 最终测试是否通过都要检查响应正文
数据库
- 如果数据库涉及到写数据库,必须要验库
面试题:get与post的区别?
- get请求可以被缓存,post不可以
- get请求会保存在浏览器的历史记录中,post不会
- get请求可以被收藏为书签,post不会
- get请求时,发送数据的长度一般都有限制(与浏览器地址栏有关),post没有限制
- get发送的数据一般会在接口地址url中,而post发送的数据放在请求体中
- post方法相对于get方法更加安全
- get请求一般用于获取数据,post请求主要用于提交数据
- <!--get请求属于发送明文,post属于密文-->
<!--get请求相比于post请求不安全-->
练习demo1
接口文档
接口功能:根据用户id查询用户名
接口地址:http://39.104.25.201/apitest/one-param/
请求方法:Get
响应类型:text/html
响应文本包含:请使用ID参数进行访问
题目要求:查看响应状态码、查看响应体、响应类型
#导入requests库
import requests
#定义变量url存储接口地址
url = ‘http://39.104.25.201/apitest/one-param/’
#调用requests库中的get方法,访问接口,获取响应,将响应结果存储在result变量中
result = requests.get(url=url)
#获取响应状态码
print(f‘响应状态码:{result.ststus_code}’)
print(f‘响应体:{result.text}’)
print(f‘响应类型:{result.headers["Content-Type"]}’)
接口文档
接口地址:http://www.httpbin.org/get
请求方法:Get
请求参数:无
响应类型:JSOn
预期包含json字符串
题目要求:使用text和json查看响应正文,响应类型
#导入requests库
import requests
#定义变量url存储接口地址
url = ‘http://www.httpbin.org/get’
#调用requests库中的get方法发送请求,访问接口地址,获取响应结果存储变量result
result = requests.get(url)
#根据要求查看响应结果
print(f‘响应文本 text:{result.txt}’)
print(f‘响应文本 json:{result.json()}’)
print(f‘响应类型 :{result.headers0["content-type"]}’)
demo3
接口文档
接口功能:根据用户id、username查询用户注册时间
接口地址:http://服务器的ip地址/apitest/multi-params/
请求方法:Get
参数:id(用户编号),username(用户名)
id=1,username=admin
id=2,username=Dumb
id=3,username=Superman
数据库表:wa_test.users
响应类型:JSON
预期返回:{“登录名”:“admin”,“注册时间”:“2020-07-15 15:30:47”}或{“Message”:“提示用户信息不存在”}
查看响应结果:响应正文、响应类型、实际请求URL、请求头、请求体
#导入requests库
import requests
#定义变量存储接口地址
url = 'http://39.104.25.201/apitest/one-param/'
#定义变量储存数据
params = {"id:1,"username":"admin"}
#调用requests库中get方法,发送请求,获得响应,将获取内容存储变量中
result = requests.get(url=url,params=params)
#查看响应结果:响应正文、响应类型、实际请求URL、请求头、请求体
print(f'响应正文text:{result.text}')
print(f'响应类型:{result.headers["content-type"]}')
print(f'实际请求URL:{result.request.url}')
print(f'请求头:{result.request.headers}')
print(f'请求体:{result.reuest.body}')
·带参数的Get请求的实际URL与要求的地址不同
·Get的参数放在URL地址之中,以?间隔接口地址与参数,多个参数以&间隔
·get方法没有请求体