博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unittest框架扩展(自动生成用例)
阅读量:4551 次
发布时间:2019-06-08

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

一.思想:

 基于数据驱动和代码驱动结合的自动化测试框架。

二.自动化测试框架步骤:

1.获取用例,用例格式:.ymal

2.调用接口

3.校验结果

4.发送测试报告

5.异常处理

6.日志模块

三.基于上一篇文章中,使用unittest模块框架,编写自动化调用接口测试,拷贝生成用例的python文件作为模板,在conf下新建base.txt,只需每次修改文件中类名:和文件名:生成同样的python文件作为用例即可。

base.txt如下:

import unittest,requestsimport ddtfrom BeautifulReport import BeautifulReport as bffrom BeautifulReport import BeautifulReport as bffrom urllib import parsefrom conf.setting import BASE_URL@ddt.ddtclass %s(unittest.TestCase): #是百分号s指变量class_name    base_url = BASE_URL    @ddt.file_data(r'%s')#ddt帮你读文件,获取文件内容,循环调用函数 百分号s是指变量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)

四.自动化框架的文件布局:

五.写代码:

1.新建用例,举例:注册reg.yaml和注册login.yaml

 

reg.yaml:

 

2.配置setting文件,将所有文件中用到的变量定义在该文件,需要修改的时候,直接在该文件中修改即可。setting:

import osBASE_PATH = os.path.dirname(   #找到utp的目录    os.path.dirname(os.path.abspath(__file__)))MAIL_HOST='smtp.163.com'MAIL_USER='lix.xxxx@163.com'MAIL_PASSWRD = 'xxxxxxxxx1'TO = [    '5472xxxxx@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.xx.xx.xx' #接口的地址LOG_NAME='utp.log' #日志的文件名

3.在lib文件下新建tools.py:首先判断case_data下的.yaml文件个数,创建对应的python文件。具体:打开并读取base.txt文件,将文件中的类和文件名替换后,再创建python文件。生成用例-->运行所有用例:

import datetimeimport yagmailfrom lib.log import utp_log  #要用到日志文件from conf import setting  #要用到配置文件中的变量import osimport unittest  from BeautifulReport import BeautifulReport as bf  #生成报告def makeCase():  #生成用例    all_yaml = os.listdir(setting.YAML_PATH)  #获取所有的ymal文件    base_case_str = open(setting.CASE_TEMPLATE,encoding='utf-8').read()#读取到base.txt文件里的内容,写在循环外面    for yaml in all_yaml:  #判断读取的文件是否为.yaml或.yml        if yaml.endswith('.yaml') or yaml.endswith('.yml'):#判断是否是yml文件            class_name = yaml.replace('.yml','').replace('.yaml','').capitalize()#将文件名的后缀去掉获取类名,并首字母大写            file_name = os.path.join(setting.YAML_PATH,yaml)#拼接生成的ymal文件的绝对路径            content = base_case_str %(class_name,file_name)            py_file_name = os.path.join(setting.CASE_PATH,class_name)#拼好生成python文件的绝对路径            open('%s.py'%py_file_name,'w',encoding='utf-8').write(content)  #以w格式打开,保证每次打开ymal文件都会清空重新写def run_all_case():  #找到所有的python用例文件,并运行    suite = unittest.TestSuite()  #调用unittest模块的TestSuite(),实例化    all_py = unittest.defaultTestLoader.discover(setting.CASE_PATH,'*.py')  #在指定目录下找python文件:以.py结尾的python文件    #找到所有的python文件    [ suite.addTests(py) for py in all_py]  #这里用addTests,是因为py文件里可能有多个函数,都要添加进来    #列表生成式,添加文件里面的case到测试集合里面    # for py in all_py:  #等同于上面的列表生成式    #     suite.addTests(py)    run=bf(suite)    today = datetime.datetime.today().strftime('%Y%m%d%H%M%S')  #.strftime将时间格式化取到秒    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_pathdef sendmail(title,content,attrs=None):    try:        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)    except Exception as e:        msg = '邮件发送失败,%s'%e        utp_log.error(msg)

 

4.在bin文件下新建run.py,按照逻辑运行文件。分别调用生成用例,运行用例,发报告的类。

import os,sysimport datetimeBASE_PATH = os.path.dirname(  #因为run.py是入口文件,还没有加载setting文件,所以不能找到环境变量,需在此定义BASE_PATH找到utp目录    os.path.dirname(os.path.abspath(__file__)))sys.path.insert(0,BASE_PATH)from lib import toolsdef main():    tools.makeCase()#自动产生用例的python文件    pass_count,fail_count,abs_path = tools.run_all_case()#运行所有用例并获取其返回值    msg='''    各位好!        本次接口测试结果如下:            通过用例:%s条            失败用例:%s条            详细信息见附件【%s】。    '''%(pass_count,fail_count,os.path.basename(abs_path)) #os.path.basename()获取绝对路径的文件名    today = datetime.datetime.today().strftime('%Y%m%d%H%M%S')    title = '接口测试报告_%s'%today #邮件标题    tools.sendmail(title,msg,abs_path) #发送邮件,标题,提示信息,附件main()

5.生成的python文件举例,Login.py:

import unittest,requestsimport ddtfrom BeautifulReport import BeautifulReport as bffrom BeautifulReport import BeautifulReport as bffrom urllib import parsefrom conf.setting import BASE_URL@ddt.ddtclass Login(unittest.TestCase): #是百分号s指变量class_name    base_url = BASE_URL    @ddt.file_data(r'C:\Users\Fancy\Desktop\学习笔记\day11\utp\case_data\login.yaml')#ddt帮你读文件,获取文件内容,循环调用函数 百分号s是指变量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)

 

6.log.py,生生日志的文件:

import logging,osfrom logging import handlersfrom conf import settingclass 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) #拼好日志的绝对路径utp_log = MyLogger(path,setting.LEVEL).logger  #日志级别#直接在这里实例化,用的时候就不用再实例化了

总结:

该自动化框架是基于unittest重新封装的,也是基于数据驱动进行的,只是数据的格式不是excel而是yaml格式的。与第一篇自动化框架相比,不需要自己写框架。

转载于:https://www.cnblogs.com/yihan2018/p/9437745.html

你可能感兴趣的文章
20165301 2017-2018-2 《Java程序设计》第四周学习总结
查看>>
Vue的简单入门
查看>>
urllib 中的异常处理
查看>>
【SQL Server高可用性】高可用性概述
查看>>
通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?
查看>>
SQL优化:重新编译存储过程和表
查看>>
PCB“有铅”工艺将何去何从?
查看>>
Solr环境搭建
查看>>
垂直居中的几种实现方法
查看>>
UILabel标签文字过长时的显示方式
查看>>
H5离线缓存机制-manifest
查看>>
比较:I/O成员函数getline() 与 get()(第二种用法)的用法异同
查看>>
201671010118 2016-2017-2《Java程序设计》 第十一周学习心得
查看>>
Get Sauce(状压DP)
查看>>
Office2007 升级到 office2010
查看>>
SpringBoot整合Hibernate
查看>>
PPT1 例2
查看>>
extern外部方法使用C#简单例子
查看>>
血液循环结构
查看>>
SQL Server统计数据库中表个数、视图个数、存储过程个数
查看>>