思路
1、根据数据配置表config_total中关键字筛选出接口用例表case_interface对应数据
2、将case_interface表查询出数据的接口名称作为excle的工作表名
3、将相同接口名称的用例存入excle对应工作表中
实现步骤
创建接口测试配置表 config_total
CREATE TABLE `config_total` (
`id` int(2) NOT NULL AUTO_INCREMENT,
`key_config` varchar(128) DEFAULT NULL COMMENT '关键字名称',
`value_config` text COMMENT '关键字值',
`description` varchar(128) DEFAULT NULL COMMENT '关键字解释信息',
`status` int(2) DEFAULT NULL COMMENT '配置文件状态,0-有效,1-无效',
`create_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8 COMMENT='接口测试配置表';
config_total表新增配置数据
INSERT INTO config_total VALUES ('1', 'name_export', '[\'getIpInfo\',\'BaikeLemmaCardApi\',\'nodes\']', '导出接口数据配置', '0', '2018-05-22 10:10:49', null);
config.py文件中新增以下配置项:
filed_excel=[u'编号',u'接口名称',u'用例级别',u'请求类型',u'接口地址',u'接口头文件',u'接口请求参数',u'接口返回包',u'待比较参数',u'实际参数值',u'预期参数值',u'参数值比较结果',u'待比较参数集合',u'实际参数集合',u'参数完整性结果',u'用例状态',u'创建时间',u'更新时间']#导出的excel表格标题
#flie_excel将导入excle表中作为工作表的列名展示
需要导入的Interface.py文件
#__author__='hy'
#-*- coding:utf-8 -*-
'''
定义对mysql数据库基本操作的封装
1.包括基本的单挑语句操作,删除、修改、更新
2.独立查询单条语句、查询多条数据
3.独立添加多条数据
'''
import pymysql,re,logging,os
class OperationDb_interface(object):
def __init__(self,host='localhost',user='root',passwd='***',db_name='my_test',port=3306,link_type=0)
if (link_type == 0):
self.conn=pymysql.connect(host=host,user=user,passwd=passwd,db=db_name,port=port,charset='utf8', cursorclass=pymysql.cursors.DictCursor
)#创建数据库链接
self.cur=self.conn.cursor()#创建游标,返回字典
else:
self.conn = pymysql.connect(host=host,user=user,passwd=passwd,db=db_name,port=port,charset='utf8')
self.cur=self.conn.cursor()#创建游标,返回元祖
#定义单条数据操作,增删改
def op_sql(self,query,param):
try:
self.cur.execute(query,param)#游标下执行sql语句
self.conn.commit()#提交游标数据到数据库
result = {'code': '0000', 'message': u'执行通用操作成功', 'data': []}
except pymysql.Error as e:
result = {'code': '9999', 'message': u'执行通用操作异常', 'data': []}
print("Mysql Error %d:%s"%(e.args[0],e.args[1]))
logging.basicConfig(filename=os.path.join(os.getcwd(),'./log.txt'),
level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
logger=logging.getLogger(__name__)
logger.exception(e)
return result
#查询表中单条语句
def selectOne(self,condition,param=None):
try:
self.cur.execute(condition,param)
results=self.cur.fetchone()#获取一条结果
result = {'code': '0000', 'message': u'执行单条查询操作成功', 'data': results}
except pymysql.Error as e:
result = {'code': '9999', 'message': u'执行单条查询异常', 'data': []}
print("Mysql Error %d:%s"% (e.args[0],e.args[1]))
logging.basicConfig(filename=os.path.join(os.getcwd(),'./log.txt'),
level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] % (levelname)s %(message)s')
logger =logging.getLogger(__name__)
logger.exception(e)
return result
#查询表中多条数据
def selectAll(self,condition):
try:
rows_affect=self.cur.execute(condition)
if rows_affect>0:
self.cur.scroll(0,mode='absolute')#光标回到初始位置
results=self.cur.fetchall()#返回游标中所有结果
result = {'code': '0000', 'message': u'执行批量查询操作成功', 'data': results}
else:
result = {'code': '0000', 'message': u'执行批量查询操作成功', 'data': []}
except pymysql.Error as e:
result = {'code': '9999', 'message': u'执行批量查询异常', 'data': []}
print ("Mysql Error %d:%s" % (e.args[0],e.args[1]))
logging.basicConfig(filename=os.path.join(os.getcwd(),'./log.txt'),
level=logging.DEBUG,format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s % (message)s')
logger=logging.getLogger(__name__)
logger.exception(e)
return result
#定义插入多条语句数据库操作
def insertMore(self,condition,params):#对应的params是个tuple或list
try:
results=self.cur.executemany(condition,params)
self.conn.commit()
result = {'code': '0000', 'message': u'执行批量查询操作成功', 'data': int(results)}
except pymysql.Error as e:
result= {'code': '9999', 'message': u'执行批量查询异常', 'data': []}
print ("Mysql Error %d:%s"%(e.args[0],e.args[1]))
logging.basicConfig(filename=os.path.join(os.getcwd(),'/log.txt'),
level=logging.DEBUG,format='%(asctime)s%(filename)s %(filename)s[line:%(lineno)d]% (levelname)s%(message)s' )
logger=logging.getLogger(__name__)
logger.exception(e)
return result
#数据库关闭
def __del__(self):
if self.cur !=None:
self.cur.close()#关闭游标
if self.conn !=None:
self.conn.close()#关闭数据库链接
if __name__=="__main__":
test=OperationDb_interface()#实例化类
result=test.selectAll("")
if result['code'] == '0000':
print(result['data'])
else:
print(result['message'])
导出excle文件Export_data.py
#-*- coding:utf-8 -*-
#__author__='hy'
from xlrd import open_workbook
from xlutils.copy import copy
import datetime,logging,os,Config
from Config import filed_excel
from Interface import OperationDb_interface
from mylogging import mylogger
class analyse_data(object):
#定义对接口测试数据分析的类
def __init__(self):
self.filed=Config.filed_excel #初始化config里面的数据,定义excle标题名称
#定义到处指定数据到excel表
def export2excel (self,name_export):
'''
:param name_export:待导出接口名称,列表形式数据
:return:
'''
counts_export=len(name_export)#导出总数
fail_export=[]#导出失败接口名汇总列表
try:
src=open_workbook(r'./excle/report_module.xls',formatting_info=True)#打开excle 相对目录,..两个点上级目录, formatting_info打开同时把格式也带过来
destination = copy(src)
dt=datetime.datetime.now().strftime("%Y%m%d%H%M%S")#获取当前时间格式,strftime()定义格式样式
filepath='./result/'+str(dt)+'.xls'#以时间戳命名excle并保存在相对目录result文件夹下
destination.save(filepath)#复制模板保存
for name_interface in name_export: #将参数name_export中接口名称进行循环保存
case_interface=operation_db.selectAll("select * from case_interface where case_status=0 and name_interface='%s'"
%(name_interface))#获取指定接口测试用例数
if len(case_interface['data'])!=0 and case_interface['code']=='0000':
src = open_workbook(filepath,formatting_info=True)#打开excle可以直接在里面写数据,但是不能在里面添加sheet所以要复制出来重新保存
destination = copy(src)
sheet=destination.add_sheet(name_interface,cell_overwrite_ok=True)#添加添加sheet,名称为name_interface
for name in range(0,len(self.filed)):
sheet.write(0,name,self.filed[name])#获取并写入字段到sheet中
for row in range(1,len(case_interface['data'])+1):#data获取用例表里面的数据
for col in range(0,len(self.filed)):
sheet.write(row,col,u'%s'% case_interface['data'][row-1][col])#写数据到对应的excle表中
destination.save(filepath)#保存覆盖我已经建好的excle
elif len(case_interface['data'])==0 and case_interface['code'=='0000']:#返回数据为空
fail_export.append(name_interface)
else:
fail_export.append(name_interface)
result={'code':'0000','message':u'导出总数:%s,失败数: %s ' %(counts_export,len(fail_export)),'data':fail_export}
except Exception as e:#记录日志到log.txt文件
result = {'code':'9999','message':u'导出总数: %s,成功数:%s' %(counts_export,len(fail_export)),'data':fail_export}
mylogger.info("[export2excel-(name_export %s)]"% str(name_export))
mylogger.exception(e)
return result
if __name__ == "__main__":
operation_db=OperationDb_interface(link_type=1)#需要返回元祖
name_export=operation_db.selectOne("select value_config from config_total WHERE key_config='name_export' ")#查询config_total表中接口名称
if name_export['code']=='0000':#判断查询结果
temp_export=eval(name_export['data'][0])#获取查询数据并将其转换为字典
test_analyse_data=analyse_data()#实例话类
result_export=test_analyse_data.export2excel(temp_export)#将查询结果temp_export传入函数export2excel导出结果
print(result_export)
执行结果
导出excle表中的数据
数据表case_interface中的数据