人就是不能懒!爬起来复盘一下写的测试用例驱动的接口自动化测试框架!
**
**
用Python 读取Excel表内的测试用例,得到其中的各个信息,
然后用把数据稍作处理用requests发送请求获取返回结果,
再把结果和期望结果对比,判断该条用例能不能通过。
把实际结果和是否通过写入到一个新的Excel中,完成测试。
xlrd 读取Excel文档
requests 发送http请求
xlutils 复制文档,写入结果
urllib 的 parse 格式化一下url的后缀
如果Python加入到环境变量了,那么:
python -m pip install requests
python -m pip install xlrd
python -m pip install xlutils
我用的是百度上搜索api第一个推荐的。。。可能是做了广告的,叫聚合数据。
地址: https://www.juhe.cn/
进取看就看到几个免费的绿色大字很显眼!!!来就用免费的!
我们就用这两个。
通过api文档我们先用Python简单试一下该接口如何调用
ps:
记得注册实名,才能得到Key,也可以先用我的。
代码
import requests
Key = '646e09fa62e08de26ec3b5ccd1725acf'
url = 'http://apis.juhe.cn/mobile/get?phone=13429667914&key={}'.format(Key)
html = requests.get(url).text
print(html)
返回
{“resultcode”:“200”,“reason”:“Return Successd!”,“result”:{“province”:“浙江”,“city”:“杭州”,“areacode”:“0571”,“zip”:“310000”,“company”:“移动”,“card”:""},“error_code”:0}
可以看到我们成功了!
那么我们只需要在测试用例里把用例写好,就可以采取读取的方法来调用接口,来检查是否正确。
因为时间问题,还有主要是为了搭框架,我们就简单写几条,主要是代码实现
import xlrd
import requests
from xlutils.copy import copy
from urllib import parse
excel_path = r'D:\Soft\VScode\Python\接口自动化用例.xls'
excelfile = xlrd.open_workbook(excel_path,formatting_info=True)
open_workbook的时候最好加上参数formatting_info=True,这样能保证你自己写的格式能保留
但是不能保留公式颜色什么的,确实是有点坑哈,不过不影响我们这框架的流程
sheet_1 = excelfile.sheets()[0]
answer = []
pass_or_false = []
body = {}
headers = {"User-Agent":
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2427.7 Safari/537.36"
}
answer 是用来保存返回值的列表,
pass_or_false 是用来保存返回值和期望值是否一样的列表
body 是我们requests调用请求时的url后边的路径
headers 就是我们模拟浏览器来调用接口
先写处理Excel类
class Dispose_excel:
# 得到case多少列函数
def get_case_count(self):
# 获取一共有多少列
rows_count = sheet_1.nrows
# 去掉表头 一共有多少个case
real_count = rows_count - 6
return real_count
我们写的第一个函数,能得到一共有多少个case需要我们来自动化执行
返回一个 int值
# 得到接口URL地址
def get_url(self):
url = rows[2]
return url
我们在主程序运行的时候,会获取每行的内容,所以只要读取用例中第三行的url就可以,返回url
# 得到请求方式
def get_way(self):
way = rows[3]
return way
# 得到请求参数
def requests_parameter(self):
requests_parameter_cell = rows[4]
return requests_parameter_cell
# 得到正确状态码
def should_status_code(self):
status_code = rows[5]
return status_code
# 得到预期结果
def expected_result(self):
result = rows[6]
return result
# 写入 实际结果 和pass false
def write_result(self):
answer_excel = copy(excelfile)
workSheet = answer_excel.get_sheet(0)
start = 6
for i in range(len(answer)):
workSheet.write(start,7,answer[i])
workSheet.write(start,8,pass_or_false[i])
start += 1
answer_excel.save('接口测试结果.xls')
因为我们测试用例是从第7行开始的,所以start就是6(Python中一般都是以0开始,所以7行是6)
每次遍历都写入一个实际结果,和通不通过
接下来写新的Api类
class Api_get_result():
# 初始化属性
# url,phone,key,parameter_phone,parameter_key
def __init__(self,url,parameter_keys,parameter_values):
self.url = url
for i in range(len(parameter_keys)):
body[parameter_keys[i]] = parameter_values[i]
因为我们在测试用例中,把请求参数,写在一个字典中,所以我们要把字典解析传入进来
完善字典body
# 发送 post请求
def api_post(self):
get_url = self.url + '?' + parse.urlencode(body)
res = requests.post(get_url,headers=headers)
# res = requests.post(self.url,data = body,headers=headers)
return res
此网站都是此格式,所以先把url拼完整,把参数和key都填入,之后用parse格式化一下
再用resquests.post 获取返回信息
# 发送 get请求
def api_get(self):
get_url = self.url + '?' + parse.urlencode(body)
res = requests.get(get_url,headers=headers)
return res
我们类,函数都写完了,现在需要写主流程,把各个模块拼接起来
if __name__ == "__main__":
# 处理excel初始化函数
document_data = Dispose_excel()
# 得到一共有多少case
count = document_data.get_case_count()
# 遍历
for i in range(6,6+count):
# 得到各个参数
rows = sheet_1.row_values(i)
url = document_data.get_url()
way = document_data.get_way()
res_parameter = document_data.requests_parameter()
status = document_data.should_status_code()
expect_result = document_data.expected_result()
# 处理请求参数,变为字典
parameter_dic = eval(res_parameter)
num = len(parameter_dic)
# 得到具体输入 api_get类里的参数
parameter_dic_keys = []
parameter_dic_values = []
for i in range(num):
parameter_dic_keys.append(list(parameter_dic.keys())[i])
parameter_dic_values.append(list(parameter_dic.values())[i])
# 调用api_get类
api = Api_get_result(url,parameter_dic_keys,parameter_dic_values)
# 判断请求方式,发起请求 且得到结果
if way == 'get':
result = api.api_get().text
elif way == 'post':
result = api.api_post().text
answer.append(result)
# 判断是否与预期结果相符
if result == expect_result:
pass_or_false.append('Pass')
else:
pass_or_false.append('False')
# 把结果写入新的表格
document_data.write_result()
import xlrd
import requests
from xlutils.copy import copy
from urllib import parse
excel_path = r'D:\Soft\VScode\Python\接口自动化用例.xls'
excelfile = xlrd.open_workbook(excel_path,formatting_info=True)
sheet_1 = excelfile.sheets()[0]
# 全局变量
answer = []
pass_or_false = []
body = {}
headers = {"User-Agent":
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2427.7 Safari/537.36"
}
# 得到接口信息类
class Api_get_result():
# 初始化属性
# url,phone,key,parameter_phone,parameter_key
def __init__(self,url,parameter_keys,parameter_values):
self.url = url
for i in range(len(parameter_keys)):
body[parameter_keys[i]] = parameter_values[i]
# 判断是get请求还是post请求
def way_to_requests(self,way):
if way == 'get':
return True
elif way == 'post':
return False
else:
return None
# 发送 post请求
def api_post(self):
get_url = self.url + '?' + parse.urlencode(body)
res = requests.post(get_url,headers=headers)
# res = requests.post(self.url,data = body,headers=headers)
return res
# 发送 get请求
def api_get(self):
get_url = self.url + '?' + parse.urlencode(body)
res = requests.get(get_url,headers=headers)
return res
# 处理Excel类
class Dispose_excel:
# 得到case多少列函数
def get_case_count(self):
# 获取一共有多少列
rows_count = sheet_1.nrows
# 去掉表头 一共有多少个case
real_count = rows_count - 6
return real_count
# 得到接口URL地址
def get_url(self):
url = rows[2]
return url
# 得到请求方式
def get_way(self):
way = rows[3]
return way
# 得到请求参数
def requests_parameter(self):
requests_parameter_cell = rows[4]
return requests_parameter_cell
# 得到正确状态码
def should_status_code(self):
status_code = rows[5]
return status_code
# 得到预期结果
def expected_result(self):
result = rows[6]
return result
# 写入 实际结果 和pass false
def write_result(self):
answer_excel = copy(excelfile)
workSheet = answer_excel.get_sheet(0)
start = 6
for i in range(len(answer)):
workSheet.write(start,7,answer[i])
workSheet.write(start,8,pass_or_false[i])
start += 1
answer_excel.save('接口测试结果.xls')
if __name__ == "__main__":
# 处理excel初始化函数
document_data = Dispose_excel()
# 得到一共有多少case
count = document_data.get_case_count()
# 遍历
for i in range(6,6+count):
# 得到各个参数
rows = sheet_1.row_values(i)
url = document_data.get_url()
way = document_data.get_way()
res_parameter = document_data.requests_parameter()
status = document_data.should_status_code()
expect_result = document_data.expected_result()
# print(url,way,res_parameter,status,expect_result)
# 处理请求参数,变为字典
parameter_dic = eval(res_parameter)
num = len(parameter_dic)
# 得到具体输入 api_get类里的参数
parameter_dic_keys = []
parameter_dic_values = []
for i in range(num):
parameter_dic_keys.append(list(parameter_dic.keys())[i])
parameter_dic_values.append(list(parameter_dic.values())[i])
# 调用api_get类
api = Api_get_result(url,parameter_dic_keys,parameter_dic_values)
# 判断请求方式,发起请求 且得到结果
if way == 'get':
result = api.api_get().text
elif way == 'post':
result = api.api_post().text
# 把每次结果都添加至列表
answer.append(result)
# 判断是否与预期结果相符
if result == expect_result:
pass_or_false.append('Pass')
else:
pass_or_false.append('False')
# 把结果写入新的表格
document_data.write_result()
# 结束
现在这个有个BUG就是填入的信息,需要进入excel再排版一下 大概10秒搞定
源码在git上也可获取 https://github.com/fyp858585/nice_try
如果有Git 可以直接下载源码,选择你要下载的文件夹使用Git bash git clone https://github.com/fyp858585/nice_try.git