想要将Excel编写好的接口测试用例都插入数据库表中,于是使用Python来实现对应的操作,具体的思路如下图所示:
实现的方法如下:
def import_excel(self):
try:
case_data_list = []
case_src = open_workbook(config.src_path + ‘/case/接口测试用例.xls‘, formatting_info=True)
case_sheet = case_src.sheet_by_index(1)
for rows in range(7, case_sheet.nrows):
case_data = case_sheet.row_values(rows)
# case_data_list = case_data_list + ‘,‘ + str(case_data)
# print("输出每一条测试用例的数据:%s" % case_data)
name_interface = case_data[3] # 用例名称
exe_level = int(case_data[0]) # 用例执行等级
exe_mode = case_data[5] # 请求方式
header_interface = ‘‘ # 请求头文件
if exe_mode == ‘POST‘ or exe_mode == ‘post‘: # 如果是post时设置请求头类型
header_interface = ‘{\‘content-type\‘:\‘application/x-www-form-urlencoded\‘}‘
url_interface = case_data[6] # 接口地址
params_interface = case_data[7] # 接口请求参数
data_list = case_data[9] # 返回结果集,接口预期code返回值
# print(data_list)
list_response = []
data_key = self.__recur_params(data_list, list_response) # 完整性参数,待比较参数集
code_to_compare = data_key[0] # 待比较的code参数
data_code = ast.literal_eval(data_list) # 将字符类型转为字典类型
code_expect = data_code[code_to_compare] # 接口预期code返回值
# print("输出返回结果中的参数%s" % data_key)
‘‘‘
print(type(name_interface), type(exe_level), type(exe_mode), type(url_interface),
type(header_interface), type(params_interface), type(code_to_compare),
type(code_expect), type(data_key))
‘‘‘
# 插入测试用例数据到数据库中
test_db = opmysql.OperationDbInterface()
insert_list = (name_interface, exe_level, exe_mode, url_interface, header_interface, params_interface,
code_to_compare, code_expect, data_key)
case_data_list.append(tuple(insert_list))
# print(insert_sql, insert_list)
# print(insert_list)
print(case_data_list)
insert_sql = "INSERT INTO case_interface(`name_interface`,`exe_level`,`exe_mode`,`url_interface`," "`header_interface`,`params_interface`,`result_interface`,`code_to_compare`," "`code_actual`,`code_expect`,`result_code_compare`,`params_to_compare`,`params_actual`," "`result_params_compare`,`case_status`,`create_time`,`update_time`) VALUES " "(%s,%s,%s,%s,%s,%s,‘‘,%s,‘‘,%s,NULL,\"%s\",‘[]‘,NULL,1,NOW(),NOW());"
insert_case = test_db.insert_data(insert_sql, case_data_list)
print(insert_case[‘data‘], insert_case[‘message‘])
在编写的过程中遇到的问题记录:
问题1:TypeError: string indices must be integers
错误原因分析:string indices must be integers 字符串索引必须是整数,再定位到对应的代码语句code_expect = data_code[code_to_compare]中,本来获取时需要的是字典类型,看错误提示说的字符串类型,查看参数对应的类型时,确实是字符类型
解决方法:需要将字符串类型转为字典类型,使用ast库中的literal_eval方法将字符串类型转为字典类型(字符类型转为字典类型还可以使用eval()或json.loads()方法)
data_code = ast.literal_eval(data_list) # 将字符类型转为字典类型
code_expect = data_code[code_to_compare] # 接口预期code返回值
问题2:TypeError: expected string or bytes-like object
错误原因分析:expected string or bytes-like object 需要字符串或类似字节的对象,查看对应的语句排查了好久看不出问题,而排查时数据类型又都正常,list集合中的每个参数的类型也排查过都没问题,最后定位到调用的方法时,刚开始也没发现问题,最后调试时发现传入的参数写反了,第一个参数是插入语句,第二个参数才是插入数据,写反了,导致一直报错
解决办法:将参数调整正确就可以解决问题
问题3:TypeError: not all arguments converted during string formatting
错误原因分析: not all arguments converted during string formatting不是所有参数都在字符串格式化期间转换,原因是插入语句中每个要插入的数据占位符,与后面插入的数据不对应。根据原因一个个参数进行排查,发现调用对应的函数后将一个元组的数据当成了一个字符串进行传入,导致不对应。
解决办法:将元组加入到列表中,再通过列表的形式传参,调用函数时,对应的占位符与数据能匹配好,能正常操作了,问题解决
问题4:TypeError: not enough arguments for format string
错误原因分析:not enough arguments for format string 格式字符串的参数不足,查看对应的语句print输出时报错,原因是占位符与后面的参数不对应,后面的参数少了
解决办法:加上对应的参数值就可以解决问题