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

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='[email protected]' #用户名
MAIL_PASSWRD = 'sdjfkls32432' #授权码
TO = [
'[email protected]', #发送
]
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





 


猜你喜欢

转载自www.cnblogs.com/cslw5566/p/9114117.html
今日推荐