emmmm 之前的是不带报告的,毕竟直接写入Excel,测试用例已经能交差了。但是想到如果case非常多,自己进到excel筛选什么的过于麻烦,添加个html的测试报告这样一目了然。
如果没看过原版的,给你个链接接口自动化框架详解
这次我们只讲新添加的东西
**
首先先下载个改良版htmltestrunner
放到跟你脚本同级(一个文件夹,这样你import的时候方便)
import xlrd
import requests
from xlutils.copy import copy
from urllib import parse
import HTMLTestRunner_PY3
import unittest
import time
这次我们多引用一个刚才下载的 htmltestrunner
还有一个time 这样保存的时候什么时候运行的case就知道了
直接上源码,最主要的时候最后加的几句
import xlrd
import requests
from xlutils.copy import copy
from urllib import parse
import HTMLTestRunner_PY3
import unittest
import time
now=time.strftime("%Y-%m-%d %H_%M_%S")
report_path = r'D:\Soft\VScode\Python\study_lianxi\test_case\{}result.html'.format(now)
excel_path = r'D:\Soft\VScode\Python\study_lianxi\接口自动化用例.xls'
excelfile = xlrd.open_workbook(excel_path,formatting_info=True)
sheet_1 = excelfile.sheets()[0]
# cols 是列
#cols = sheet_1.col_values(0)
# rows 是行
#rows = sheet_1.row_values(0)
# cell 单元格查找,先列再行,7C也就是6,2
# cell_7C=sheet_1.cell(6,2).value
# 全局变量
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):
'''
param url: url地址
param parameter_keys: phone 和 key
param 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(r'D:\Soft\VScode\Python\study_lianxi\接口测试结果.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()
# 生成测试报告
# 测试用例.py存放的目录
test_dir = r'D:\Soft\VScode\Python\study_lianxi'
# 执行测试用例目录下所有以test开头.py结尾的文件
discover = unittest.defaultTestLoader.discover(test_dir,pattern='test*.py')
# 保存测试报告
with open(report_path,'wb')as f:
runner = HTMLTestRunner_PY3.HTMLTestRunner(stream=f,title='接口用例测试报告',description='xxx接口第一次自动化测试')
runner.run(discover)
# 结束
runner代表的参数 title就是测试报告的标题 description就是测试报告的描述
然后
在同个目录下新建一个以test开头的py文件
import unittest
import ddt
import xlrd
excel_path = r'D:\Soft\VScode\Python\study_lianxi\接口测试结果.xls'
excelfile = xlrd.open_workbook(excel_path,formatting_info=True)
sheet_1 = excelfile.sheets()[0]
cols = sheet_1.col_values(8)
li = [i for i in cols if i]
del li[0]
@ddt.ddt
class test_report(unittest.TestCase):
@ddt.data(*li)
def test_pass_or_false(self,value):
self.assertEqual(value,'Pass')
这些代码是检查Excel内所有的是否通过,如果pass就通过,如果false就不通过,会在测试报告上显示。
下面是测试报告的效果图
其他同之前的文章,就是增加了个测试报告,直观显示一下。