zoukankan      html  css  js  c++  java
  • 自我框架utp

    1.针对自动读取yml文件进行接口测试并产生报告发送文件。

    1)read.me

    # 依赖软件
    基于python3的
    pip install requests
    pip install pyyaml
    pip install ddt
    pip install nnlog
    pip install btbf #好看的报告模块
    pip install yagmail
    2)conf --》base.txt #此文件便于替换其中的类名和文件名
    import unittest,requests
    import ddt
    from BeautifulReport import BeautifulReport as bf
    from urllib import parse
    from conf.setting import BASE_URL #导入配置文件并从中获取
    @ddt.ddt
    class %s(unittest.TestCase):
    base_url = BASE_URL
    @ddt.file_data(r'%s')#注意加r防止转义,ddt帮你读文件,获取文件内容,循环调用函数 #这里不用{file_name}是因为下面有几个{}会都认为是所需参数。
    def test_request(self,**kwargs):
    detail = kwargs.get('detail','没写用例描述')
    self._testMethodDoc = detail #动态的用例描述
    url = kwargs.get('url')#url
    url = parse.urljoin(self.base_url,url)#拼接好url
    method = kwargs.get('method','get')#请求方式
    data = kwargs.get('data',{}) #请求参数
    header = kwargs.get('header',{})#请求头
    cookie = kwargs.get('cookie',{})#cookie
    check = kwargs.get('check')
    method = method.lower() #便于处理
    try:
    if method=='get':
    res = requests.get(url,params=data,cookies=cookie,headers=header).text
    #因为接口有异常的情况下, 可能返回的不是json串,会报错
    else:
    res = requests.post(url,data=data,cookies=cookie,headers=header).text
    except Exception as e:
    print('接口请求出错')
    res = e
    for c in check:
    self.assertIn(c,res,msg='预计结果不符,预期结果:'+c + '实际结果:' +res) #不用%s是应为格式化时候会有多余%s值影响上面取值
    3. cases-- 用来存放不同用例的yaml文件 比如login和reg
    ###login.yaml
    -
    url : /api/user/login
    method : post
    detail : 正常登录
    data :
    username : niuhanyang
    passwd : aA123456
    check :
    - userId
    - sign

    -
    url : /api/user/login
    method : post
    detail : 密码错误
    data :
    username : niuhanyang
    passwd : aA12333
    check :
    - 密码错误

    -
    url : /api/user/login
    method : post
    detail : 不传密码
    data :
    username : niuhanyang
    check :
    - 必填参数未填

    #####reg.yaml
    -
    url : /api/user/user_reg
    method : post
    detail : 用户名字已经被注册的
    data :
    username : niuhanyang
    passwd : aA123456
    cpasswd : aA123456
    check :
    - 用户已存在
    4. lib-->tools.py

    import datetime

    import yagmail

    from conf import setting

    import os   #

    import unittest

    from BeautifulReport import BeautifulReport as bf

    def makeCase():

             all_yaml = os.listdir(setting.YAML_PATH)    #获取该路径所有文件

             base_case_str = open(setting.CASE_TEMPLATE,encoding='utf-8').read()#读取到文件里的东西

             for yaml in all_yaml:

                       if yaml.endswith('.yaml') or yaml.endswith('.yml'):#判断是否是yml文件

                                class_name = yaml.replace('.yml','').replace('.yaml','').capitalize()#获取类名,并首字母大写 类名一般首字母大写   不用字符分割防止a.b.c之类结构

                                file_name = os.path.join(setting.YAML_PATH,yaml)#拼接绝对路径

                                content = base_case_str %(class_name,file_name)   #将参数写入已读取的base文件内容中  这里不用str.format是因为{}

                                py_file_name = os.path.join(setting.CASE_PATH,class_name)#拼好python文件的绝对路径,便于写

                                open('%s.py'%py_file_name,'w',encoding='utf-8').write(content)

    def run_all_case():    #执行目录下py文件的所有用例

             suite = unittest.TestSuite()

             all_py = unittest.defaultTestLoader.discover(setting.CASE_PATH,'*.py')  #寻找测试用例,可以规则如test_*.py

             #找到所有的python文件

             [ suite.addTests(py) for py in all_py]     #每个py文件可能有多个类所以这里用addTests  一个可不加s

             #列表生成式,添加文件里面的case到测试集合里面

             run=bf(suite)

             today = datetime.datetime.today().strftime('%Y%m%d%H%M%S')  #导入模块可以ctrl加回车添加

             title = '%s_接口测报告.html'%today

             report_abs_path = os.path.join(setting.REPORT_PATH,title) #

             run.report(title,filename=title,log_path=setting.REPORT_PATH)

             return run.success_count,run.failure_count,report_abs_path  #报告的绝对路径可用于发送邮件

    def sendmail(title,content,attrs=None):

             m = yagmail.SMTP(host=setting.MAIL_HOST,user=setting.MAIL_USER

                                          ,password=setting.MAIL_PASSWRD

                                          )

             m.send(to=setting.TO,subject=title,

                          contents=content,

                          attachments=attrs)

    5.conf-->setting.py

    import os
    BASE_PATH = os.path.dirname(
    os.path.dirname(os.path.abspath(__file__))
    )
    MAIL_HOST='smtp.163.com'
    MAIL_USER='uitestp4p@163.com'
    MAIL_PASSWRD = 'houyafan123'
    TO = [
    '511402865@qq.com',
    ]
    LEVEL = 'debug' #日志级别

    LOG_PATH = os.path.join(BASE_PATH,'logs') #存放日志的路径
    CASE_PATH = os.path.join(BASE_PATH,'cases') #存放用例的路径
    YAML_PATH = os.path.join(BASE_PATH,'case_data') #存放yaml文件的路径
    CASE_TEMPLATE = os.path.join(BASE_PATH,'conf','base.txt') #用例模板的路径
    REPORT_PATH = os.path.join(BASE_PATH,'report') #存放报告的目录
    BASE_URL = 'http://118.24.3.40' #接口的地址
    LOG_NAME='utp.log' #日志的文件名

    6.report 存放报告

  • 相关阅读:
    百度云管家开机启动如何取消
    双语小说阅读:《谁动了我的奶酪》
    [Swift]方法
    Swift中的类型属性(静态变量)
    Swift 学习之二十一:?和 !(详解)
    苹果Swift可为Windows/Android开发软件了
    iOS7下滑动返回与ScrollView共存二三事
    swift c++ oc 混编
    RTOS
    STM32 RTC
  • 原文地址:https://www.cnblogs.com/cslw5566/p/9142678.html
Copyright © 2011-2022 走看看