import unittest
from Business.Class.HTMLTestRunner import HTMLTestRunner
from Business.Class.ExcelUtils import *
from Business.Class.JsonOrYaml import *
from Base.Class.Http import *
from Base.Class.Database import *
from Base.Class.Logger import *
log = Logger(name='test', level='DEBUG')
class TestCase:
def __init__(self, workbook, data='数据配置', case='测试用例', envs='测试环境', level_list=None):
from pandas.core.frame import DataFrame
self._g = {}
self._l = {}
self.case = case
self.envs = envs
self.http = Request
init = Excel().open(workbook, read_only=True)
init_data = auto_decode(init.select(data).cellGet(0, 0))
init_case = auto_decode(init.select(case).cellGet(0, 0))
self.cell_list = {
'item':
auto_decode(init.select(case).cellGet(cell=init_case['fixeds']['item'])),
'mode':
auto_decode(init.select(case).cellGet(cell=init_case['fixeds']['mode']))
}
self.view_list = {
'http':
DataFrame(read_view_dict(filename=workbook, sheet=data, area=init_data['tables']['http']['views'], fields=init_data['tables']['http']['field'], auto_truncate=True)),
'base':
DataFrame(read_view_dict(filename=workbook, sheet=data, area=init_data['tables']['base']['views'], fields=init_data['tables']['base']['field'], auto_truncate=True)),
'data':
DataFrame(read_view_dict(filename=workbook, sheet=data, area=init_data['tables']['data']['views'], fields=init_data['tables']['data']['field'], auto_truncate=True)),
'case':
DataFrame(read_view_dict(filename=workbook, sheet=case, area=init_case['tables']['case']['views'], fields=init_case['tables']['case']['field'], auto_truncate=True))
}
self.i = self.cell_list['item']
self.m = self.cell_list['mode']
self.h = self.view_list['http']
self.b = self.view_list['base']
self.d = self.view_list['data']
self.c = self.view_list['case']
init.exit()
self._setLevels(level_list)
self._setRequestMode(self.m)
self.dirs = os.path.dirname(workbook)
def _setRequestMode(self, value=None):
self.http = [Request, Session][value in ['会话模式', 'Session', 'session']]()
return True
def _setLevels(self, level_list=None):
if isinstance(level_list, (list, tuple, str)):
self.leve_list = level_list
@staticmethod
def _matchCaseType(value=None):
match value:
case '正常用例':
return 10
case '前置用例':
return 20
case _:
return 50
@staticmethod
def _matchParmType(value=None):
match value:
case 'Json':
return 10
case 'Form':
return 20
case _:
return 50
def _matchLevelRun(self, value=None):
if self.leve_list is None:
return True
return value in self.leve_list
@staticmethod
def _sub_variable(text='', vars_dict=None):
if not isinstance(text, str):
return text
for variable_name in re.findall('\${(.*?)}', text):
try:
value = vars_dict[variable_name]
except:
value = ''
text = text.replace('${%s}' % variable_name, str(value))
return text
def _sub_variable_auto(self, data=None, vars_dict=None):
if isinstance(vars_dict, list):
d = {}
for v in vars_dict:
d.update(v)
vars_dict = d
if isinstance(data, list):
for i in range(len(data)):
if not isinstance(data[i], str):
continue
data[i] = self._sub_variable(text=data[i], vars_dict=vars_dict)
return data
if isinstance(data, dict):
for k in data.keys():
if not isinstance(data[k], str):
continue
data[k] = self._sub_variable(text=data[k], vars_dict=vars_dict)
return data
if isinstance(data, str): return self._sub_variable(data, vars_dict=vars_dict)
return data
def test_unit(self, data):
log.d('正在执行:%s' % data['CaseTitle'])
HTTPCh = self.h.where((self.h['Env'] == self.envs) & (self.h['Name'] == data['HTTPCh']), inplace=False).dropna(how='all').loc[0].to_dict()
res_kwargs = {
'debug': True,
'method': data['HTTPMethod'],
'url':
self._sub_variable_auto(
(HTTPCh['HostWithScheme'] or '') + (data['HTTPUri'] or '/'),
[self._g, self._l]
),
'query':
self._sub_variable_auto(auto_decode(data['HTTPQuery']),
[self._g, self._l]),
'header':
self._sub_variable_auto(auto_decode(data['HTTPHeaders']),
[self._g, self._l]),
'cookie':
self._sub_variable_auto(auto_decode(data['HTTPCookies']),
[self._g, self._l]),
'auto_redirect':
data['HTTPRedirect'] in ['是', 'True', 'true']
}
HTTPParamType = self._matchParmType(data['HTTPParamType'])
match HTTPParamType:
case 10:
res_kwargs['data_json'] = self._sub_variable_auto(auto_decode(data['HTTPParamContent']))
case 20:
res_kwargs['data'] = self._sub_variable_auto(auto_decode(data['HTTPParamContent']))
case _:
res_kwargs['data'] = self._sub_variable_auto(data['HTTPParamContent'])
HTTPParamOfFile = self._sub_variable_auto(auto_decode(data['HTTPParamOfFile']))
if isinstance(HTTPParamOfFile, dict):
for k, v in HTTPParamOfFile:
HTTPParamOfFile[k] = open(os.path.abspath(os.path.join(self.dirs, './%s' % v)), 'rb')
res_kwargs['data_file'] = HTTPParamOfFile
res = self.http.http(**res_kwargs)
log.d('\n%s' % (res['brief'] or ''))
# print(res)
# print(HTTPCh)
def test(self, index):
# print(view_case.loc[index])
main_case = self.c.loc[index].to_dict()
self.test_unit(data=main_case)
def main(self):
class ClassTestCase(unittest.TestCase):
pass
ClassTestCase.__qualname__ = self.case
ClassTestCase._test_ = self.test
serial = 0
for i in range(len(self.c)):
thisCase = self.c.loc[i].to_dict()
if not self._matchCaseType(thisCase['Flag']) == 10 and self._matchLevelRun(thisCase['CaseLevel']): continue
serial += 1
def foo(self, index=i): return self._test_(index)
foo.__doc__ = thisCase['CaseTitle']
exec('ClassTestCase.test%s_%s = foo' % (str('%04d' % serial), str(thisCase['CaseId'])))
return ClassTestCase
if __name__ == '__main__':
test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(testCaseClass=TestCase(
workbook='D:/Desktop/接口自动化测试用例.xlsx',
data='数据配置',
case='测试用例',
envs='测试环境',
level_list=['P0']
).main(), prefix='test'))
HTMLTestRunner(verbosity=5, report=os.path.abspath(os.path.join(os.path.dirname(__file__), './1.html'))).run(
test_suite)