在测试接口时,采用数据驱动的方式,将数据写在Excel表格中,代码则使用ddt数据驱动是非常方便。
代码调试成功后,只需要在Excel表格中维护测试用例,就可以实现自动化测试接口了。
Excel模板如下:
方法excel_to_list,将excel中每一条测试用例读取到一个列表中:
from openpyxl import load_workbook
def excel_to_list(sheet_name):
data_list = []
# 打开excel
workbook1 = load_workbook(case_file)
sheet1 = workbook1[sheet_name] # 定位表单(test_data)
max_row = sheet1.max_row # 统计测试用例的行数
header = get_row_values(sheet1, 1)
for i in range(2, max_row+1):
d = dict(zip(header, get_row_values(sheet1, i)))
data_list.append(d)
return data_list
简单说明:
1、sheet_name是Excel中的sheet页的名称
2、返回的数据类似:[{'title': '首页__今日__换一批', 'url': '/queryForIndex', 'data': '{}', 'method': 'get', 'exp1': 'stautscode=200', 'exp2': 'msg=查询成功'},{'title': '首页__今日__换一批', 'url': '/queryForIndex', 'data': '{}', 'method': 'get', 'exp1': 'stautscode=200', 'exp2': 'msg=查询成功'}]
具体执行用例(test_api.py)
#!/usr/bin/python
# -*- coding: utf-8 -*-
from Lib.function import *
import requests
import ddt
import unittest
from Lib.case_log import *
data = excel_to_list(sheet_name[1])
@ddt.ddt
class TestCompanyApp(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.sheet_name = sheet_name[1]
cls.s = requests.Session()
r = cls.s.post(logUrl_c, data=data_company[1])
@ddt.data(*data)
def test_app(self,params):
print('params:%s' % params)
case_name = params.get('title')
url = params.get('url')
args = eval(params.get('data')) if isinstance(params.get('data'), str) else params.get('data')
method = params.get('method')
expct_res1 = params.get('exp1')
expct_res2 = params.get('exp2')
# 发起请求,获取返回数据
if method == 'get':
result = self.s.get(baseUrl + url, params=args)
else:
result = self.s.post(baseUrl + url, data=args)
# 分析返回数据
response_data = result.text.replace(':', '=')
response_data = response_data.replace('"', '')
# print(response_data)
if result.status_code in (200, 2016):
log_case_info(case_name, url, args, expct_res1, result.json())
assert expct_res1 in response_data
assert expct_res2 in response_data
else:
log_case_info(case_name, url, args, expct_res1, result.status_code)
assert expct_res1 in response_data
if __name__ == '__main__':
unittest.main()
简单说明:
1、cls.s = requests.Session()
r = cls.s.post(logUrl_c, data=data_company[1])
这2句代码是实例化一个session,访问登陆接口,获取登陆状态并保持。(大部分接口都是需要登录状态的。)
2、@ddt.data(*data)
使用这个代码,data数组有多少个元素,则会自动循环多少次。
--------------------------------------------------------------------------------------------
注:文章内容主要是记录学习过程中遇到的一些问题,以及解决方法。留个记录,同时分享给有需要的人。如有不足之处,欢迎指正,谢谢!