本文的主题是自动化测试框架的实现,在实现之前,先了解一下关于unittest模块的相关知识:

  Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。

  在说unittest之前,先说几个概念:

  TestCase 也就是测试用例

  TestSuite 多个测试用例集合在一起,就是TestSuite

  TestLoader是用来加载TestCase到TestSuite中的

  TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。

1.yaml测试用例文件

   unittest做自动化测试时,读取的测试用例文件是 ".yml"或者“.yaml”格式的用例文件,首先需要安装pyyaml,直接 pip install pyyaml等待安装完成即可;

   编写yaml格式的测试用例文件,我们以一个登录接口为例,来写测试用例,文件名是:login.yaml 如下是3条测试用例:

-url : /api/user/login  #接口地址method : post #请求方式detail : 正常登录 #用例描述data : #请求体
    username : niuhanyangpasswd : aA123456check : #预期结果- userId- sign-url : /api/user/loginmethod : postdetail : 密码错误data :username : niuhanyangpasswd : aA12333check :- 密码错误-url : /api/user/loginmethod : postdetail : 不传密码data :username : niuhanyangcheck :- 必填参数未填

2.框架搭建

(1)首先需要将框架的路径建好,我这个框架在utp目录里面,utp目录下的具体目录层次如下:

  

  bin目录存放执行的入口文件;

  case_data存放的是yaml或者yml的用例文件;

  case目录下存放自动生成的Python文件;

  conf目录存放的是配置文件;

  lib目录下存放的是主程序文件;

  logs目录下存放的是日志文件;

  report目录存放的是测试报告文件;

  readme是说明;

(2)设置配置文件,在conf目录下创建setting.py文件,具体配置文件内容如下:

import os
BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))
)#基础路径,就是utp的路劲地址
MAIL_HOST='smtp.qq.com'
MAIL_USER='605130685@qq.com'
MAIL_PASSWRD = 'xxxxx'#邮箱的授权码
TO = ['lyxiehong@@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://127.0.0.1' #接口的地址
LOG_NAME='utp.log' #日志的文件名

(3)写好请求接口的测试脚本,以登录接口为列,测试脚本写为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')#ddt帮你读文件,获取文件内容,循环调用函数def test_request(self,**kwargs):detail = kwargs.get('detail','没写用例描述')self._testMethodDoc = detail  #动态的用例描述url = kwargs.get('url')#urlurl = parse.urljoin(self.base_url,url)#拼接好urlmethod = kwargs.get('method','get')#请求方式data = kwargs.get('data',{}) #请求参数header = kwargs.get('header',{})#请求头cookie = kwargs.get('cookie',{})#cookiecheck = 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).textexcept Exception as e:print('接口请求出错')res = efor c in check:self.assertIn(c,res,msg='预计结果不符,预期结果:'+c + '实际结果:' +res)

将此base.txt的文件放在cases目录下,后面会用到此文件作为基础文件进行copy成Python文件的测试用例。

在测试时,如果有多个接口需要进行测试,那么就需要在case_data目录下将每个接口的测试用例写好,每个接口写一个yaml用例文件,每个yaml文件中会有好几条用例,

例如登录接口中,1.登录成功,2密码错误,3.必填参数未填,这就有3条用例;在跑测试的时候,所有yaml文件中的用例总数加起来的数量就是执行的用例数量;

我们的思路是,在case_data目录下有几个yaml测试用例文件,就把base.txt文件自动生成几份Python测试文件,Python测试文件的名字以yaml的文件名作为文件名,然后把所有的Python测试文件都执行一遍,

然后得出测试报告,最后测试结果邮件。为了看出效果,我在case_data目录又写了一个注册接口的yaml测试用例文件,名字叫reg.yaml,这个文件中只写 了一条用例,如下:

-url : /api/user/user_regmethod : postdetail : 用户名字已经被注册的data :username : xiehongpasswd : aA123456cpasswd : aA123456check :- 用户已存在

(4)根据case_data目录下的yaml文件的数量,在lib目录下新建tools.py文件,写自动生成Python测试文件的代码,一般主体代码都写在lib目录下,如下:

import datetime,os,yagmail,unittest
from conf import setting
from BeautifulReport import BeautifulReport as bf
def makeCase(): #这个函数自动生成Python文件all_yaml = os.listdir(setting.YAML_PATH)#获取到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()#获取yaml文件的名字作为类名,并首字母大写file_name = os.path.join(setting.YAML_PATH,yaml)#拼接用例yaml文件的绝对路径content = base_case_str %(class_name,file_name)#将读取到的文件中字符格式化赋值,就是即将生成Python文件的类名和文件名py_file_name = os.path.join(setting.CASE_PATH,class_name)#拼好python文件的绝对路径open('%s.py'%py_file_name,'w',encoding='utf-8').write(content)#写文件,content是写的内容

上面已经根据yaml文件的数量2,自动生成了2个Python测试文件,并且放在了cases目录下面,Login.py是测试登录接口的,Reg.py 是测试注册接口的。截图如下:

(6)接着在tools.py中写代码用来执行cases下的测试用例文件并生成测试报告,如下:

def run_all_case():#这个函数是运行所有的测试用例并生成测试报告suite = unittest.TestSuite()#生成测试集合all_py = unittest.defaultTestLoader.discover(setting.CASE_PATH,'*.py')#找到CASE_PATH目录下的所有Python文件[ suite.addTests(py) for py in all_py]#列表生成式,添加文件里面的case到测试集合里面run=bf(suite)#执行测试用例today = datetime.datetime.today().strftime('%Y%m%d%H%M%S')#取当天的日期,精确到秒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#返回成功和失败数量,以及测试报告的路径

(7)用例执行完了测试报告也生成了,接下来就是要把测试结果发邮件,还是继续在tools.py文件中写发送邮件的代码,如下:

def sendmail(title,content,attrs=None):#这个函数发送测试结果邮件m = yagmail.SMTP(host=setting.MAIL_HOST,user=setting.MAIL_USER,password=setting.MAIL_PASSWRD,smtp_ssl=True )#调用配置文件的配置数据m.send(to=setting.TO,subject=title,contents=content,attachments=attrs)#setting.TO调用配置文件的配置数据

(8)主体代码基本上都写完了,接下来就要写执行文件了,也就是这些代码从哪调用连贯起来执行,需要提供一个执行的入口,这个入口文件就放在bin目录下,

我们把这个执行入口的文件起名叫run.py,具体代码:

import os,sys
import datetime
BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))
)
sys.path.insert(0,BASE_PATH)#将utp目录加入环境变量
from lib import tools
def mail():tools.makeCase()#调用函数自动产生python文件pass_count,fail_count,abs_path = tools.run_all_case()#调用函数运行用例,将返回结果赋值给pass_count,fail_count,abs_pathmsg='''各位好!本次接口测试结果如下:通过用例:%s条失败用例:%s条详细信息见附件【%s】。'''%(pass_count,fail_count,os.path.basename(abs_path))#获取abs_path的最后一级,就是报告的名称today = datetime.datetime.today().strftime('%Y%m%d%H%M%S')title = '接口测试报告_%s'%today #邮件标题tools.sendmail(title,msg,abs_path) #发送邮件
mail()

至此,一个自动化测试框架基本完成,如有错误,欢迎指出!

转载于:https://www.cnblogs.com/xiehong/p/9146688.html

Python单元测试unittest测试框架相关推荐

  1. python+selenium+unittest测试框架1-unittest单元测试框架和断言

    unittest单元测试框架和断言 一.unittest单元测试框架简介 1.导入unittest模块 import unittest 2.定义测试类 class Login(unittest.Tes ...

  2. 基于Python的接口自动化unittest测试框架和ddt数据驱动详解

    引言 在编写接口自动化用例时,我们一般针对一个接口建立一个.py文件,一条接口测试用例封装为一个函数(方法),但是在批量执行的过程中,如果其中一条出错,后面的用例就无法执行,还有在运行大量的接口测试用 ...

  3. 使用python构造大量测试数据_python实例编写(6)--引入unittest测试框架,构造测试集批量测试(以微信统一管理平台为例)...

    ---恢复内容开始--- 一.python单元测试实例介绍 unittest框架又叫PyUnit框架,是python的单元测试框架. 先介绍一个普通的单元测试(不用unittest框架)的实例: 首先 ...

  4. python的unittest测试类代码实例

    nittest单元测试框架不仅可以适用于单元测试,还可以适用WEB自动化测试用例的开发与执行,该测试框架可组织执行测试用例,并且提供了丰富的断言方法,判断测试用例是否通过,最终生成测试结果.今天笔者就 ...

  5. UnitTest测试框架全栈详解

    金字塔模型 从软件架构的⻆度来说,测试最重要的步骤是在软件开发的时候界入比较好,所以在早期测试的界入,从软件经济学的⻆度上来说,发现的问题解决成本低,投入的资源比较少.因此,对一个测试的系统,开始最佳 ...

  6. Python学习——UnitTest自动化测试框架

    UnitTest框架的基本使用 1.概念:UnitTest是Python自带的一个单元测试框架,用它来做单元测试 2.UnitTest框架的优势: 能够组织多个用例去执行 提供丰富的断言方法 能够生成 ...

  7. unittest 测试框架

    文章目录 一.unittest测试框架 1.测试固件 1.1 setUp() 1.2 tearDown() 2.unittest 基本使用 3.测试套件(suit) 3.1 测试用例执行顺序 3.2 ...

  8. 自动化测试unittest测试框架实例

    本文采用unittest测试框架搭建一个简单的自动化测试实例,完成readmine网站的登录和新建项目用例,并生成测试报告. test_login文件 import unittest from sel ...

  9. 8z Python编程语言与测试框架 - 软件测试

    软件测试所有内容笔记正在陆续更新中,笔记已经在本地记录,全部为自己手动记录的笔记及总结,正在开始更新中,后续会逐步更新并完善到 软件测试学习内容总结 专栏. 本节内容:Python编程语言与测试框架 ...

最新文章

  1. Windows 编程[9] - WM_CLOSE 消息
  2. CHIL-SQL-MIN() 函数
  3. Traffic Flow Forecasting: Comparison of Modeling Approaches文献阅读笔记(一)
  4. python itertool_函数式编程的Python实践(2):Itertool
  5. gRPC快速入门记录
  6. 项目管理(6):备战pmp
  7. 刚买的ubuntu服务器 为什么没有文件,新买的linux服务器怎么使用
  8. Java笔记-JNI中Java与C语言解决中文乱码问题
  9. 网格成就Web 2.0存储时代的路易XIV?
  10. Bootstrap 基础五表格
  11. Qt加载osgearth时报错:0x0000xxx处未经处理的异常:0xC00005:写入位置***发生冲突
  12. 一周最新示例代码回顾 (4/23–4/29)
  13. 用MapX与C#开发地理信息系统
  14. 【机器学习基石】感知机模型+PLA(二)
  15. LeetCode 845——数组中的最长山脉
  16. 自己的第一个windows程序
  17. 【Alist + Teracloud】WebDAV免费畅游互联网个人方案总结,一些支持WebDAV的应用推荐
  18. 西科大 软件体系结构内容总结
  19. 移植AT91Bootstrap1.15
  20. 计算机网络技术课程答案网课,《计算机网络技术》大学生网课答案.docx

热门文章

  1. 把英文单词转换成ASCII画
  2. c盘oracle文件夹,C盘的用户文件夹转移到其他分区
  3. C++ as3 socket服务端
  4. 电脑投屏到电视android,电脑怎么投屏到电视?看完这篇文章你就懂了
  5. 史上最简单的Spring Security教程(二十八):CA登录与默认用户名密码登录共存详细实现及配置
  6. 用inno Setup做应用程序安装包的示例脚本 .iss文件
  7. 余弦公式在c语言里面怎么用_C语言中求余弦值的相关函数总结
  8. Struts2中的OGNL表达式的详解
  9. 一文读懂rawRGB、RGB和YUV数据格式与转换
  10. E5 调用API续订服务:Microsoft 365 E5 Renew X