Yaml文件+接口自动化
首先安装好yaml, 命令:pip install PyYAML
第一步:新建yaml文件,并写入接口数据
新建yaml文件
写入接口所属数据
# 【login】:登录接口名称(自定义)
login1:
# 【method】:请求方法,post或get
method: "post"
# 【url】:请求地址(字符串格式)
url: "https://www.baidu.com"
# 【head】:请求头信息(字典格式)
head:
"Content-Type": "application/json;charset=UTF-8"
# 【data】:请求体(字典格式)
data:
"uuid": "BD123456"
"password": "BD111111"
# 登录接口2
login2:
method: "post"
url: "https://www.baidu.com"
head:
"Content-Type": "application/json;charset=UTF-8"
data:
"uuid": "BD123456"
"password": "BD111111"
第二步:写一个打开yaml文件的公用方法(另建一个文件py)
编写打开yaml文件方法
import yaml
def load_yaml(path):
"""
:param path: yaml文件地址
:return: 返回yaml文件数据
"""
file = open(path, 'r', encoding='utf-8')
data = yaml.load(file, Loader=yaml.FullLoader) # 表示全加载文件
return data
第三步:写一个接口请求方法(另建一个文件)
import json
import requests
from UI.Common.OpenYamlFileMethod import load_yaml
def test_url(txt='status_code'):
"""
接口请求
:param url_title: 需要测试的yaml文件中的接口标题
:param txt: 需要返回相应的内容,默认返回相应状态码
:return:
"""
# 将yaml文件数据传入
data_yaml = load_yaml(r'../UI/TestExampleFile/UrlYamlFile.yaml')
# 从yaml文件中获取接口标题,并传入data。(指定哪条接口测试)
data = data_yaml['login']
# data是一个字典,需将数据拆分出来保存到变量中, 然后才能引用到接口中,不用变量直接引用会报错
url = data['url']
method = data['method']
datas = data['data']
heads = data['head']
# 用于保持会话(session)
s = requests.session()
# getattr:对象映射。json.dumps:将datas的数据转换成json格式。(method: 请求方法;url: 请求地址;datas: 请求体;head: 请求头)
res = getattr(s, method)(url=url, data=json.dumps(datas), headers=heads)
# 对象映射, 默认返回相应状态码
print(getattr(res, f'{txt}'))
test_url()
requests模块传请求体参数时, 有两种方式:
data传参:
数据报文:当传入类型为dict字典类型,默认情况下以form表单的方式传参,格式:a=1&b=2&c=3
数据报文:当传入类型为sit类型,默认情况下:text/plain
json传参:
不管是dict还是str,默认格式都为:{“a”=1,“b”=2}
数据格式转换:
json.dumps(data) 序列化:把字典格式数据转换为str格式;
json.loads(data) 反序列化:把str格式转换成字典格式;
请求方法
requests.get()
requests.post()
requests.put()
requests.session():用于保持会话(session)
除了requests.session()外,其他请求方法的参数都差不多,都包含url,params, data,headers,cookies,files,auth,timeout等等
请求参数
url:字符串格式,参数也可以直接写到url中params:url参数,字典格式
data:请求数据,字典或字符串格式
headers:请求头,字典格式
cookies:字典格式,可以通过携带cookies绕过登录
files:字典格式,用于混合表单(form-data)中上传文件
auth:Basic Auth授权,数组格式 auth=(user,password)
timeout:超时时间(防止请求一直没有响应,最长等待时间),数字格式,单位为秒
响应解析
res.status_code:响应的HTTP状态码
res.reason:响应的状态码含义
req.text:响应的文本格式,按req.encoding解码
req.content:响应的二进制格式
req.encoding:解码格式,可以通过修改req.encoding='utf-8’来解决一部分中文乱码问题
req.apparent_encoding:真实编码,由chardet库提供的明显编码
req.json():(注意,有括号),响应的json对象(字典)格式,慎用!如果响应文本不是合法的json文本,或报错
req.headers:响应头
req.cookies:响应的cookieJar对象,可以通过req.cookies.get(key)来获取响应cookies中某个key对应的值
Excel数据驱动,接口自动化
问题1:做接口测试,常常需要将上一个接口的值传入到下一个接口中,这里使用了jsonPath语法来解决;
问题2:发送请求前,常常需要传入很多变量,这里变量不一定是上一个接口的响应,有可能是时间、计算后的数据等。这里使用替换字符串来解决。
问题3:接口发送是,涉及到很多JSON格式问题,以下也是使用函数来解决。
问题4:注意使用python跑接口测试前, 需把fiddler等其它网络代理给关了,否则无法跑测试
1、创建excel,拟定好excel文件格式。
2、写两个方法,一个读取excel方法,一个发送请求方法,有注释
import json
import requests
from openpyxl import load_workbook
class ExcelOperate:
"""
excel文件操作工具包
"""
# 读取excel
def read_excel(self, filename, sheet_name, cases_title):
"""
:param filename: excel文件名称
:param sheet_name: sheet页名称
:param cases_title: 用例标题名称
:return:
"""
excel = load_workbook(rf'../data/{filename}') # 读取excel 【如果使用相对路径,参照路径为调用这个方法的路径】
sheet = excel[sheet_name] # 读取sheet页
data_list = [] # 定义空列表,将获取到excel的数据存放至此
# 定义个false值,后面做判断用
false = False
# 遍历获取到的excel的值(行行遍历)
for i in sheet.values:
# 将(用例标题)为None的用例存放至data_list
if false:
if i[2] is None:
data_list.append(i)
else:
break
# 将(用例标题)为True的用例存放至data_list
if str(i[2]) in cases_title:
data_list.append(i)
false = True
# 将列表转换成元组,方便后面的接口方法接收
tup1 = tuple(data_list)
# 返回元组
return tup1
# 接口请求方法
def url_request(self, po, ur, he, da):
"""
po请求方式,ur请求地址,he请求头,da请求体。传入的he和da必须是json格式文本
json.dumps:转换成json格式,json.loads转换成python可识别的JSON格式,requests模块默认的是拉丁语,需要转换成utf-8
有些请求头是空的, 有些请求体是空的, 所以用到if
:param po: 请求方法
:param ur: 请求地址
:param he: 请求头
:param da: 请求体
:return:
"""
if po and ur and he and da:
res = getattr(requests, po)(
url=ur,
data=json.loads(json.dumps(da)).encode("utf-8"),
headers=eval(he)
)
# 获取接口响应
text_ = getattr(res, "text")
# 返回接口响应(返回的是str)
return text_
if (he is None) and da:
res = getattr(requests, po)(
url=ur,
data=json.loads(json.dumps(da)).encode("utf-8")
)
text_ = getattr(res, "text")
return text_
if (da is None) and he:
res = getattr(requests, po)(
url=ur,
headers=eval(he)
)
text_ = getattr(res, "text")
return text_
if (he is None) and (da is None):
res = getattr(requests, po)(
url=ur
)
text_ = getattr(res, "text")
return text_
3、然后就可以发送请求了。
# 实例化
ua = UrlClass()
# 调用read_excel方法,获取excel('1.登录')接口值
dt = ua.read_excel('1.登录')
# 调用url_request方法发送请求
ra = ua.url_request(dt[1], dt[2], dt[3], dt[4])
# 使用jsonpath语法, 提取token
token = jsonpath(json.loads(ra), "$.data.uucToken")
uuid = jsonpath(json.loads(ra), "$.data.uuid")
# 调用read_excel方法,获取excel('2.查询用户')接口值
dt2 = ua.read_excel('2.查询用户')
# 将token值替换自定义变量,替换后传回变量,以达到替换目的
dt2 = str(dt2).replace('test_2214', str(token[0]))
dt2 = str(dt2).replace('test_2215', str(uuid[0]))
# 替换变量需是str,调用接口请求需是元组, 所以替换完后需将str转成元组
dt2 = tuple(eval(dt2))
# 发送请求
ra2 = ua.url_request(dt2[1], dt2[2], None, None)
# 打印响应
print(ra2)
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
不要因为困难而退缩,不要因为失败而气馁,奋斗是人生的密码,只有坚持不懈,才能书写出辉煌的篇章。相信自己的力量,勇往直前,你将创造属于自己的壮丽人生,成就无限可能。
每一次努力都是为了让自己变得更好,每一次奋斗都是为了实现更大的梦想。不要停下脚步,不要放弃追求,勇往直前,你将创造出属于自己的辉煌人生。相信自己,坚持奋斗,未来将无限可能。
不论前方多险峻,只要坚持向前,勇往直前,你就能攀登高峰,收获辉煌。相信自己的能力,坚守信念,努力奋斗,你将创造属于自己的辉煌人生。不要停下脚步,勇敢追逐,只要不放弃,就能创造属于自己的辉煌人生。