excel单元测试
步骤1:编写测试方法
api_request.py
import requests class HttpRequest: """requests请求需要转入的参数""" def http_request(self,method, url, data,auth = None,headers =None ): '''url:请求地址 http://xxxx:port param:传递的参数 非必填参数 字典的格式传递参数 method:请求方式 支持get,post,put... get:获取信息,post:添加信息,put:修改更新信息 ''' if method.lower() in ('get','post','put','patch'): if method.lower() == 'get': res = requests.get(url, data, auth = auth, headers= headers) elif method.lower() == 'post': res = requests.post(url, data, headers = headers) elif method.lower() == 'put': res = requests.put(url, data, headers = headers) else: res = requests.patch(url, data, headers = headers) return res else: raise Exception('暂不支持的请求方式')
步骤2:excel中存储测试数据
test.xlsx
步骤3:配置文件,指定需要测试的测试数据
case.config
[MODE] button = all button1 = ['001', '003']
步骤4:读取配置文件
api_readconfig.py
import configparser class ReadConfig: def read_config(self,file_name,section,option): cf = configparser.ConfigParser() # 实例化 cf.read(file_name,encoding='utf-8') return cf.get(section,option)
步骤5:取出指定测试数据,存于列表中
from openpyxl import load_workbook from api_tools.doexcel.api_readconfig import ReadConfig #导入配置文件读取方法 class Excel: def __init__(self,file_name,sheet_name): self.file_name = file_name self.sheet_name = sheet_name self.obj = load_workbook(self.file_name)[self.sheet_name] self.max_row = self.obj.max_row self.max_colunm = self.obj.max_colunm def get_header(self): """获取标题行:第一行""" header = [] # 存储标题行 for j in range(1, self.max_colunm + 1): header.append(self.obj.cell(1, j).value) return header def data_store(self): """ button:控制是否执行所有的用例,默认值为all, 为all表示执行所有用例,否则进入分支判断 button的取值:all/列表 """ button = ReadConfig().read_config('case.config', 'MODE', 'button1') # 配置文件读取方法 """ 将excel的测试数据存储到列表中 """ header = self.get_header() # 获取header data_list = [] for i in range(2,self.max_row +1): #行:一条测试用例 data_dict ={} for j in range(1,self.max_colunm + 1): # 列,利用get_header()存储测试数据 data_dict[header[j-1]] = self.obj.cell(i,j).value # header是列表, j-1列表:从0开始 data_list.append(data_dict) # 每条测试用例作为子元素传入test_data[]中 """ # 直接将测试数据以字典形式写入到data_list列表中 data_dict['method'] = self.obj.cell(i,4).value data_dict['url'] = self.obj.cell(i,5).value data_dict['data'] = self.obj.cell(i,6).value data_dict['expected'] = self.obj.cell(i,7).value data_list.append(data_dict) # 每条测试用例作为子元素传入data_list[]中 """ # return data_list if button == 'all': # 执行所有的用例 data_final = data_list else: data_final = [] for item in data_list: # 对data_list 所有的测试数据进行遍历 if item['case_id'] in button: data_final.append(item) return data_final
步骤6:执行测试用例方法
请求头文件:get_header.py
class GetHeader: headers = {'X-Lemonban-Media-Type': 'xxxxx', 'Content-Type': 'application/json; charset=UTF-8','Authorization':None}
测试用例执行方法:
api_testexcelcase.py
import json import unittest from ddt import ddt,data from api_tools.com.api_request import HttpRequest # 导入requests接口请求方法 from api_tools.doexcel.get_header import GetHeader from api_tools.doexcel.api_readexcel import Excel data_final = Excel("file_name", "sheet_name").data_store() #所有测试用例 @ddt class Test(unittest.TestCase): """写测试用例""" def setUp(self): pass """ def __init__(self, methodName, method, url, data, expected): # 通过初始化函数来传参数 super(Test, self).__init__(methodName) # 保留父类的方法 self.url = url self.data = json.loads(data) self.method = method self.expected = expected """ @data(*data_final) # 给requests接口方法传入必要参数,并且比对结果是否与预期一致 def test_casename(self,item): """ print('请求信息为:\n url:{0},data:{1},method:{2},header:{3}'.format(self.url, json.dumps(self.data), self.method,getattr(GetHeader, 'headers'))) res = HttpRequest().http_request(self.url, json.dumps(self.data), self.method,getattr(GetHeader, 'headers')) try: self.assertEqual(self.expected, res.json()['code'], '提示信息') except AssertionError as e: #异常处理 print("出错啦!断言错误是{0}".format(e)) raise e print(res.json()) """ print('请求信息为:\n url:{0},data:{1},method:{2},header:{3}'.format(item['url'], json.dumps(json.loads(item['data'])),item['method'], getattr(GetHeader, 'headers'))) res = HttpRequest().http_request(item['url'], json.dumps(json.loads(item['data'])), item['method'],getattr(GetHeader, 'headers')) try: self.assertEqual(item['expected'], res.json()['code']) except AssertionError as e: print("test_rl_api error is {}".format(e)) raise e print(res.json()) def tearDown(self): pass
步骤7:执行测试用例,生成测试报告
import HTMLTestRunner import time import unittest from api_tools.doexcel.api_testexcelcase import Test suite = unittest.TestSuite() # 创建实例 loader = unittest.TestLoader() # 加载测试用例 suite.addTest(loader.loadTestsFromTestCase(Test)) # 生成测试报告 with open(time.strftime('%Y-%m-%d %H_%M_%S')+'_test_report.html','wb') as file: runner = HTMLTestRunner.HTMLTestRunner(stream=file, verbosity=2, title= time.strftime('%Y-%m-%d %H_%M_%S') + 'XXXX测试报告', description='运行环境:Windows 10, Chrome浏览器' ) runner.run(suite) # 执行测试用例 if __name__ == '__main__': unittest.TestCase()