04-python导出数据到excle

思路

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表中的数据


导出到excle中的数据.png

数据表case_interface中的数据


接口用例表的储存的数据.png

你可能感兴趣的:(04-python导出数据到excle)