在测试一个功能模块的时候我们判断一个功能示范正常的途经是直接比较实际测试结果和期望值,同样做接口测试也是一样,在实现接口自动化测试的时候,我们有一个很重要的问题需要解决,就是怎样去比较实际值和期望值。
有人会想到用断言的技术来实现unittest的断言确实可以比较两个值是否一样,可以在用例Excel的期望值后面增加一列实际值来记录接口响应的数据,这样当接口项目完成了测试,我们就拿到了所有的接口响应数据,直接对比两列的数据我们就能看出来到底哪些用例测试通过了哪些没有测试通过,把测试结果以及响应结果都写回到Excel。
1、Excel数据准备
2、拓展DoExcel类
在 接口自动化数据源问题 中,写了一个专门读取Excel测试数据的类,我们现在要写入测试结果,就要在Excel中新增3个字段,ExceltedResult、ActualResult、TestResult,分别对应存储的是期望结果,实际结果,以及测试结果,设计的Excel如下所示:
在测试之前,我们要提前把期望结果写好,测试完成后要写入结果分别是写入每一行的第7、8列,写入Excel时,我们需要提供行列信息,在DoExcel类里面新增一个函数,写入数据,示范代码如下所示:
from openpyxl import load_workbook
# 1、一次性读取所有数值
class DoExcel:
def __init__(self, file_path, sheet_name):
self.file_path = file_path
self.sheet_name = sheet_name
def do_excel(self):
wb = load_workbook(self.file_path)
sheet = wb[self.sheet_name] # 传表单名 返回一个表单对象
test_data = [] # 读取EXCEL中的所有值
for i in range(2, sheet.max_row + 1):
sub_data = {} # 保证数据与excel中的格式一致
sub_data['id'] = sheet.cell(i, 1).value
sub_data['title'] = sheet.cell(i, 2).value
sub_data['method'] = sheet.cell(i, 3).value
sub_data['url'] = sheet.cell(i, 4).value
sub_data['param'] = sheet.cell(i, 5).value
sub_data['ExpectedResult'] = sheet.cell(i,6).value
sub_data['ActualResult'] = sheet.cell(i, 7).value
sub_data['TestResult'] = sheet.cell(i, 8).value
test_data.append(sub_data)
return test_data # 返回获取到数据
#结果回写
def write_back(self, row, column, value):
# row 代表写入的行数
# column代表写入的列数
# value代表写入的值
wb = load_workbook(self.file_path)
sheet = wb[self.sheet_name]
# 为Excel指定的行列写入指定的值
sheet.cell(row, column).value = value
# 写完结果后,要记得保存
wb.save(self.file_path)
3、加入断言,执行测试,完成结果回写
丰富了DoExcel类,可以完成测试数据的读取以及测试结果的回写,要判断测试是否通过,我们需要利用到unittest的断言,同时观察到用例的id与Excel的行数刚刚好是+1的关系,就可以巧妙利用这个关系定位行数写入数据,示范代码如下所示:
import unittest
from ddt import ddt, data
from common.http_request import HttpRequest # 接口自动化前期准备及统一封装接口请求
from test_http_excel import DoExcel
from common.test_cookie import GetData
# 测试数据
test_data = DoExcel('C:/Users/Administrator/Desktop/test_data.xlsx', 'test_data').do_excel()
@ddt # 装饰测试类
class TestHttpRequest(unittest.TestCase):
def setUp(self): # 重写
# 创建写入测试的实例
self.t = DoExcel('C:/Users/Administrator/Desktop/test_data.xlsx', 'test_data')
@data(*test_data) # 装饰测试用例,拿到几个数据,就执行几条用例
def test_case_1(self, data_item):
print("**************************")
print("正在执行第{0}条用例:{1}".format(data_item['id'], data_item['title']))
# 执行http请求
res = HttpRequest(data_item['url'], eval(data_item['param'])).http_request(data_item['method'],
getattr(GetData, 'Cookie'))
if res.cookies: # 如果cookie有的话,那么就更新COOKIE
setattr(GetData, 'Cookie', res.cookies) # 反射
# 利用断言,判断期望结果和实际结果是否一致
try:
self.assertEqual(eval(data_item['ExpectedResult']), res.json())
TestResult = 'PASS' # 如果不报错,设置测试结果为PASS
except AssertionError as e:
print('执行接口测试出错,错误是{0}'.format(e))
TestResult = 'Fail' # 如果报错,设置测试结果为Fail
raise e
finally:
self.t.write_back(data_item['id'] + 1, 7, str(res.json())) # 写入实际结果
self.t.write_back(data_item['id'] + 1, 8, TestResult)
print("第条测试用例执行结果是:{0}".format(res.json()))
def tearDown(self):
pass
运行测试代码之后,运行结果如下所示:
同时,我们去检查Excel中的数据写入情况,测试实际值以及测试结果都已经正确写入到Excel中,写入结果如下所示:
(* ̄(oo) ̄)仅供参考,有疑问可私聊博主哦,大家一起学习,共同进步!