zoukankan      html  css  js  c++  java
  • 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='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





     


  • 相关阅读:
    zw版【转发·台湾nvp系列Delphi例程】HALCON FillUp2
    zw版【转发·台湾nvp系列Delphi例程】HALCON FillUp1
    zw版【转发·台湾nvp系列Delphi例程】HALCON FillUpShape2
    zw版【转发·台湾nvp系列Delphi例程】HALCON DivImage2
    zw版【转发·台湾nvp系列Delphi例程】HALCON FillUpShape1
    zw版【转发·台湾nvp系列Delphi例程】HALCON DivImage1
    phpstorm10.0.1和webstorm11注册
    制作自己的Cydia发布源
    theos的makefile写法
    wdcp v3 Forbidden :You don't have permission to access /phpmyadmin on this server
  • 原文地址:https://www.cnblogs.com/cslw5566/p/9114117.html
Copyright © 2011-2022 走看看