码迷,mamicode.com
首页 > 其他好文 > 详细

ATP(excel测试及邮件发送)自己小框架

时间:2018-05-31 00:42:53      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:handlers   写入   报告   跳过   col   and   文档   ati   控制   

1.自我设计一个excel相关的测试框架。

分析所需封装的要求如

            1、获取用例

            2、调用接口

            3、校验结果的

            4、发送测试报告

            5、异常处理

            6、日志

2.具体设计(主要)

lib 目录下log.py(之前写好的日志类)

import logging,os
from logging import handlers
from conf import setting
class MyLogger():
def __init__(self,file_name,level=‘info‘,backCount=5,when=‘D‘):
logger = logging.getLogger() # 先实例化一个logger对象,先创建一个办公室
logger.setLevel(self.get_level(level)) # 设置日志的级别的人
cl = logging.StreamHandler() # 负责往控制台输出的人
bl = handlers.TimedRotatingFileHandler(filename=file_name, when=when, interval=1, backupCount=backCount, encoding=‘utf-8‘)
fmt = logging.Formatter(‘%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s‘)
cl.setFormatter(fmt) # 设置控制台输出的日志格式
bl.setFormatter(fmt) # 设置文件里面写入的日志格式
logger.addHandler(cl)
logger.addHandler(bl)
self.logger = logger

def get_level(self,str):
level = {
‘debug‘:logging.DEBUG,
‘info‘:logging.INFO,
‘warn‘:logging.WARNING,
‘error‘:logging.ERROR
}
str = str.lower()
return level.get(str)


path = os.path.join(setting.LOG_PATH,setting.LOG_NAME) #拼好日志的绝对路径
atp_log = MyLogger(path,setting.LEVEL).logger
#直接在这里实例化,用的时候就不用再实例化了

lib 目录下common.py #用来写主逻辑 读写excel
import xlrd
from xlutils import copy # 写入式需要修改所以需要导入copy模块。
from lib.log import atp_log #导入写好的log日志模块
import requests
class OpCase(object):
def get_case(self,file_path):

cases = [] #存放所有的case
if file_path.endswith(‘.xls‘) or file_path.endswith(‘.xlsx‘): #判断给出的文件是否是excel文件
try:
book = xlrd.open_workbook(file_path) #打开文件
sheet = book.sheet_by_index(0) #获取第一页的内容
for i in range(1,sheet.nrows): #数据从1开始,跳过标题
row_data = sheet.row_values(i) #获取每行的数据
cases.append(row_data[4:8]) #利用切片取到所使用4-7列的数据并加入list 应该是一个人二维数组
atp_log.info(‘共读取%s条用例‘%(len(cases))) #取list的长度为用例的个数。
self.file_path = file_path ##便于写excel时直接使用路径。
except Exception as e:
atp_log.error(‘【%s】用例获取失败,错误信息:%s‘%(file_path,e)) #处理打不开文件 比如文件损坏
else:
atp_log.error(‘用例文件不合法的,%s‘%file_path) #不是excel文件日志报错
return cases

def my_request(self,url,method,data): #用来调接口
method = method.upper() # 防止接口的大小写问题。都转化为大写
data = self.dataToDict(data) #将数据转化为zid
try :
if method==‘POST‘:
res = requests.post(url,data).text #res正常会返回一个字典,但如果结果110状态码就会报错,.text转化后就不报错,都能获取到值。
elif method==‘GET‘:
res = requests.get(url,params=data).text
else:
atp_log.warning(‘该请求方式暂不支持。。‘)
res = ‘该请求方式暂不支持。。‘ #没有res会报错 否者就没有res
except Exception as e:
msg = ‘【%s】接口调用失败,%s‘%(url,e) #处理接口未调用成功的信息
atp_log.error(msg)
res = msg
return res

def check_res(self,res,check): # 校验结果 实际结果和预期结果
res = res.replace(‘": "‘,‘=‘).replace(‘": ‘,‘=‘) #替换符号为=号,两次替换
for c in check.split(‘,‘):
if c not in res: #判断该字符串是否存在(a=b)整体是否存在
atp_log.info(‘结果校验失败,预期结果:【%s】,实际结果【%s】‘%(c,res))
return ‘失败‘
return ‘成功‘

def write_excel(self,cases_res): #结果写入excel
# [ [‘dsfd‘,"通过"] ,[‘sdfsdf‘,‘失败‘] ]
book = xlrd.open_workbook(self.file_path) #打开文档
new_book = copy.copy(book)
sheet = new_book.get_sheet(0) #获取sheet页
row = 1
for case_case in cases_res:
sheet.write(row,8,case_case[0]) #写第8列
sheet.write(row,9,case_case[1]) #写第9列
row+=1
new_book.save(self.file_path.replace(‘xlsx‘,‘xls‘)) #结尾必须以xls结尾才能保存

def dataToDict(self,data): #处理参数输入的格式 一般要求a=b之类的简单格式如何转换为可以发送的数据格式。
#把数据转成字典
res = {}
data = data.split(‘,‘)
for d in data:
#a= 没值时后面为空 不需要处理
k,v = d.split(‘=‘)
res[k]=v
return res
函数之间没一栏 耦合性比较好

lib 目录下send mail.py  ##用来发送邮件
import yagmail
from conf import setting #配置文件
from lib.log import atp_log
def sendmail(title,content,attrs=None):
m = yagmail.SMTP(host=setting.MAIL_HOST,user=setting.MAIL_USER
,password=setting.MAIL_PASSWRD
) #sllm = ture 有些需要 连接数据库
m.send(to=setting.TO,subject=title,
contents=content,
attachments=attrs) #这里可以try要一下
atp_log.info(‘发送邮件完成‘)

cinf 目录下settting.py
import os
BASE_PATH = os.path.dirname(
os.path.dirname(os.path.abspath(__file__)) #便于将日志重放logs文件中,这里取到该父文件夹的地址
)
MAIL_HOST=‘smtp.163.com‘ #host
MAIL_USER=‘uitestp4p@163.com‘ #用户名
MAIL_PASSWRD = ‘sdjfkls32432‘ #授权码
TO = [
‘511402865@qq.com‘, #发送
]
LEVEL = ‘debug‘ #日志级别

LOG_PATH = os.path.join(BASE_PATH,‘logs‘) #存放日志的路径,经过拼接
CASE_PATH = os.path.join(BASE_PATH,‘cases‘) #存放日志的路径,经过拼接
LOG_NAME=‘atp.log‘ #日志的文件名,定义在这比较好修改

bin 目录下start.py   #用来将写好的模块整合
import os,sys
BASE_PATH = os.path.dirname(
os.path.dirname(os.path.abspath(__file__))
)
sys.path.insert(0,BASE_PATH) #这个作用可以在其他环境中运行,手动加入环境变量

from lib.common import OpCase
from lib.send_mail import sendmail
from conf import setting
class CaseRun(object):
def find_cases(self):
op = OpCase() #实例化
for f in os.listdir(setting.CASE_PATH):#每次循环的时候读一个excel
abs_path = os.path.join(setting.CASE_PATH,f) #拼接绝对路径
case_list = op.get_case(abs_path) #获取每个list中case
res_list = []
pass_count,fail_count = 0,0 #可以写为1行
for case in case_list:#循环每个excel里面所有用例
url,method,req_data,check = case #用多个变量接函数结果
res = op.my_request(url,method,req_data) #调用完接口返回的结果
status = op.check_res(res,check) #校验结果
res_list.append([res,status]) #结果存入list中
if status==‘通过‘: #循环每次判断(这里可以考虑三元运算???)
pass_count+=1
else:
fail_count+=1
op.write_excel(res_list) #写入excel 放在循环外面最后写一次就可
msg = ‘‘‘
xx你好:
本次共运行%s条用例,通过%s条,失败%s条。
‘‘‘%(len(res_list),pass_count,fail_count)
sendmail(‘测试用例运行结果‘,content=msg,attrs=abs_path)


CaseRun().find_cases() #检查是否可用

casese 目录下存放测试用例的excel





 


ATP(excel测试及邮件发送)自己小框架

标签:handlers   写入   报告   跳过   col   and   文档   ati   控制   

原文地址:https://www.cnblogs.com/cslw5566/p/9114117.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!