博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据驱动之 python + requests + Excel
阅读量:4704 次
发布时间:2019-06-10

本文共 6262 字,大约阅读时间需要 20 分钟。

数据驱动

是根据数据来测试的,如读取 excel表中的测试用例自动填写测试结果,发送测试报告
包括以下模块:
  • 1.获取用例
  • 2.调用接口
  • 3.校验结果
  • 4.发送测试报告
  • 5.异常处理
  • 6.日志模块

1. 首先设计好测试用例

2.建立文件结构

该自动化测试框架命名为:ATP,bin目录下写主程序,cases目录下放测试用例,conf目录下放配置文件,lib目录下放各个封装好的模块,logs目录下放日志文件,和readme文件。

3.封装模块

common.py:封装读取excel用例、调用接口、检验结果、写入报告这几个模块。

1 """ 2 第一步:读取excel中用例 3 第二步:根据用例发送请求 4 第三步:校验结果 5 第四步:将测试结果、返回报文写入excel 6 """ 7 import xlrd,requests 8 from xlutils import copy 9 from lib.log import atp_log10 11 class OpCase(object):12     def get_case(self,file_path):13         cases= []   #定义一个列表存放所有的cases14         if file_path.endswith('.xls') or file_path.endswith('.xlsx'):15            try:16                book = xlrd.open_workbook(file_path)17                sheet = book.sheet_by_index(0)18                for i in range(1,sheet.nrows):19                    row_data = sheet.row_values(i)   #获取的每一行数据存到列表row_data20                    cases.append(row_data[4:8])21                atp_log.info('共读取%s条用例'%(len(cases)))22                self.file_path = file_path   #因为该函数已经传了参数路径,为方便write_excel引用,在此实例化23            except Exception as e:24                atp_log.error('[%s]用例获取失败,错误信息:%s'%(file_path,e))25         else:26             atp_log.error('用例文件不合法,%s'%file_path)27         return cases28     def my_request(self,url,method,data):29         data = self.dataToDict(data)30         try:31             if method.upper() == 'POST':32                 res = requests.post(url,data).text33             elif method.uper() == 'GET':34                 res = requests.get(url,params=data).text35             else:36                 atp_log.warning('该请求方式暂不支持')37                 res = '该请求方式暂不支持'38         except Exception as e:39             msg = '【%s】接口调用失败,%s'%(url,e)40             atp_log.error(msg)41             res = msg42         return res43     def dataToDict(self,data):  #把数据转成字典。44         res = {}45         data = data.split(',')46         for d in data:  #47             k, v = d.split('=')48             res[k] = v49     def check_res(self,res,check):  #res:实际结果,check:预期结果50         res = res.replace('": "','=').replace('": ','=')51         for c in check.split(','):52             if c not in res:53                 atp_log.info('结果校验失败,预期结果:【%s】,实际结果【%s】'%(c,res))54                 return '失败'55             return '成功'56     def write_excel(self,case_res):57         book = xlrd.open_workbook(self.file_path)58         new_book = copy.copy(book)59         sheet = new_book.get_sheet(0)60         row = 161         for case_case in case_res:62             sheet.write(row,8,case_case[0])63             sheet.write(row,9,case_case[1])64             row += 165         new_book.save(self.file_path.replace('xlsx','xls'))

log.py:封装日志模块

1 import logging,os 2 from logging import handlers 3 from conf import setting 4 class Mylogger(): 5     def __init__(self,file_name,level='info',backCount=5,when='D'): 6         logger = logging.getLogger()  # 先实例化一个logger对象,先创建一个办公室 7         logger.setLevel(self.get_level(level))  # 设置日志的级别 8         # f1 = logging.FileHandler(filename='a.log',mode='a',encoding='utf-8')    #找到写日志文件的这个人 9         c1 = logging.StreamHandler()  # 负责往控制台输出的10         b1 = handlers.TimedRotatingFileHandler(filename=file_name, when=when, interval=1, backupCount=backCount, encoding='utf-8')11         fmt = logging.Formatter('%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s')12         c1.setFormatter(fmt)13         b1.setFormatter(fmt)14         logger.addHandler(c1)15         logger.addHandler(b1)16         self.logger = logger17     def get_level(self,str):18         level = {19             'debug':logging.DEBUG,20             'info':logging.INFO,21             'warm':logging.WARNING,22             'error':logging.ERROR23         }24         str = str.lower()25         return level.get(str)26 27 path = os.path.join(setting.LOG_PATH,setting.LOG_NAME)28 atp_log = Mylogger(path,'debug').logger29 #直接在这里实例化,用的时候不用再实例化了30 #别的地方用的时候,直接atp_log.warnning('xxxx')

send_mail.py:封装发送邮件模块

1 import yagmail 2 from conf import setting 3 from lib.log import atp_log 4 def sendmail(title,content,attrs=None): 5     m = yagmail.SMTP(host=setting.MAIL_HOST,user=setting.MAIL_USER, 6                  password=setting.MAIL_PASSWRD,smtp_ssl=True) 7     m.send(to=setting.TO, 8            subject=title, 9            contents = content,10            attachments = attrs)11     atp_log.info('发送邮件完成')

4.配置文件

setting.py,配置文件:设置邮件地址、日志默认级别、用例存放路径、日志存放路径、日志文件名

1 import os 2 BASE_PATH = os.path.dirname( 3     os.path.dirname(os.path.abspath(__file__)) 4 )   #三层目录定位到ATP目录 5 MAIL_HOST = 'smtp.qq.com' 6 MAIL_USER='12*****89@qq.com' 7 MAIL_PASSWRD = 'gjn*****bcgh' 8 TO = [ 9     '12*****9@qq.com'10 ]11 LEVEL = 'debug' #设置日志默认级别12 13 LOG_PATH = os.path.join(BASE_PATH,'logs')   #日志文件在logs目录下14 CASE_PATH = os.path.join(BASE_PATH,'cases') #用例文件在cases目录下15 LOG_NAME = 'atp_log'    #设置日志文件名

5.将ATP文件Mark directory  as Sources Root

6.编写主程序

start.py

1 import os,sys 2 BASE_PATH = os.path.dirname( 3     os.path.dirname(os.path.abspath(__file__)) 4 ) 5 sys.path.insert(0,BASE_PATH) 6  7 from lib.common import OpCase 8 from lib.send_mail import sendmail 9 from conf import setting10 class CaseRun(object):11     def find_case(self):12         op = OpCase()13         for f in os.listdir(setting.CASE_PATH): #每次循环的时候读一个excel14             abs_path = os.path.join(setting.CASE_PATH,f)15             case_list = op.get_case(abs_path)16             res_list = []17             pass_count,fail_count= 0,018             for case in case_list:  #循环每一个excel里面的所有用例19                 url,method,req_data,check = case20                 res = op.my_request(url,method,req_data)    #调用完接口返回的结果21                 status = op.check_res(res,check)22                 res_list.append([res,status])23                 if status == '通过':24                     pass_count += 125                 else:26                     fail_count += 127             op.write_excel(res_list)28             msg = '''29             xx你好,30                 本次共运行%s条用例,通过%s条,失败%s条。31             '''%(len(res_list),pass_count,fail_count)32             sendmail('测试用例运行结果',content=msg,attrs=abs_path)33 34 CaseRun().find_case()

 

OK,数据驱动自动化测试框架编写完成,运行 start.py 程序,收到邮件内容如下:

 

 

 

 

 

 
 
 

转载于:https://www.cnblogs.com/pengzhuopeng/p/9118845.html

你可能感兴趣的文章
spring boot 错误处理之深度历险
查看>>
Linux--Centos7开机启动 mysql5.7.19
查看>>
2018-2019-1 20165220 《信息安全系统设计基础》第6周学习总结
查看>>
Java 获取汉字串首字母并大写和获取汉字的全拼,英文字符不变
查看>>
《构建之法》前三章的读后感
查看>>
12306
查看>>
Python的工具包[0] -> numpy科学计算 -> numpy 库及使用总结
查看>>
python newbie——PE No.9
查看>>
20165218 实验一 Java开发环境的熟悉
查看>>
map标签的详细使用参数
查看>>
MySQL对于有大量重复数据表的处理方法
查看>>
Android应用开发学习笔记之多线程与Handler消息处理机制
查看>>
ubuntu 设置环境变量
查看>>
JSTL详解(一)
查看>>
Manacher 算法
查看>>
Linux磁盘及文件系统(三)Linux文件系统
查看>>
SDWebImage源码阅读(二)NSData+ImageContentType
查看>>
别在最好的年纪辜负最好的自己
查看>>
年终总结
查看>>
==和equals区别
查看>>