一、定义

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

unittest通过建立类并继承父类unittest.TestCase将用例组织起来,统一执行

示例:

import unittest
class Testcase(unittest.TestCase):#类继承unittest.TestCase
def setUp(self):#每条用例运行前,运行。一般可用来做些准备工作
print('我是setup,什么时候运行') def tearDown(self):#每条用例结束后,运行,一般可用来做些收尾工作
print('teardown什么时候运行')
def testa(self):
print('测试用例a')
self.assertEqual(1,2,'计算结果不正确')
#assertEqual是父类unittest.TestCase的函数,用来验证实际结果是否与预期结果相等
#第一个参数是预期结果,第二个参数是实际结果,第三个参数是当前面两个不相等时,回显示的提示信息。第三个参数是非必填的
def testb(self):
'''这里是测试用例的描述,会最终显示在测试报告中的,必须用三个单引号括起来才可以,用#d不行'''
print('测试用例b')
self.assertEqual(1,1)
def c(self):
print('c函数不是以test开头的,所以不会当做用例被执行')
# self.assertIn('a','abc')
@classmethod
def setUpClass(cls):#所有的用例运行前,运行setupClass
print('什么时候运行setupClass')
def tearDownClass(cls):#所有用例运行后,执行tearDownClass
print('什么时候运行tearDownClass') unittest.main()#执行当前python文件中的所有用例,会在控制台显示运行结果,不会产生测试报告
#运行的时候不要右键运行run unittest for...,这个是pycharm自己给运行的unittest,不会产生测试报告
# 应点击菜单栏中Run--run,弹出提示框后,选择自己要运行的文件进行run
#函数名用例必须以test开头,才会被执行

二、用例集suite+HTMLTestRunner/BeautifulReport

用例集即测试套件,可以吧所有的用例放入用例集当中执行,并结合HTMLTestRunner或者BeautifulReport产生出直观的漂亮的测试报告

#-------------------------------------------------------------------HTMLTestRunner写报告(丑)
#将下载好的HTMLTestRunner.py 放到 pycharm的External Libraries目录下的lib目录下,然后导入:import HTMLTestRunner,紧接着上面的代码:(把unittest.main注释掉)

suite=unittest.TestSuite()#定义用例集,是个list
suite.addTest(unittest.makeSuite(Testcase))#将类TestCase先变成一个用例集合,然后再加入到suite中
f=open('测试报告.html','wb')#建立一个测试报告文件
runner=HTMLTestRunner.HTMLTestRunner(f,title='测试报告标题',description='测试报告描述')#title和decription都是非必填。将用例结果写入测试报告.html
runner.run(suite)#运行用例集,用例执行的顺序是按照字母排序的

然后通过run-run选中要执行的当前文件,运行后,就会产生一个html格式的报告,可用浏览器打开,如下:

#--------------------------------------------------------BeautifulReport 报告(美)

#下载BeautifulReport ,解压后运行setup.py。可以将解压后的文件拷贝到pycharm中,然后运行setup.py也可。然后要导入:

from BeautifulReport import BeautifulReport as bf #bf就是个别名,方便使用

suite=unittest.TestSuite()#定义用例集,是个list
suite.addTest(unittest.makeSuite(Testcase))#将类TestCase先变成一个用例集合,然后再加入到suite中
report=bf(suite)##先实例化这个类
report.report(description='用例描述',filename='用例文件名字')
#description必填参数,log_path是非必写的,默认在当前目录下。也可以定义别的目录
#filename可写可不写,回自动生成个名字。名字后缀默认就是html。可写上也可不写

执行后,生成html格式报告:打开:

三、用unittest测接口示例

1、接口数据:yaml格式文件,存有3条用例数据

2、用ddt自动读取用例数据并传递给测试类中的测试用例函数

3、执行用例

4、写报告

用例数据

- #用减号-区分不同的用例。最终是个list,然后每个list是个字典:  [{}{}]
url: /api/user/login
detail: 正常登录
method: post
data:
username: aaa
passwd: aA123456
check:
- userId
- error_code -
url: /api/user/login
detail: 密码错误
method: post
data:
username: aaa
passwd: aA1234
check:
- 密码错误 -
url: /api/user/login
detail: 必填参数未填,用户名不传
method: post
data:
passwd: aA1234
check:
- 必填参数未填

接口测试代码:获取数据,执行测试用例并发送测试结果报告

import unittest
import ddt#自动读取文件内容,该模块需要先安装pip install ddt
import requests
from BeautifulReport import BeautifulReport as bf
from urllib import parse @ddt.ddt #声明这个类要用ddt
class Login(unittest.TestCase):
base_url='http://100.20.20.40'
@ddt.file_data('login1.yaml')#ddt自动读取文件,并获取内容传给下面的函数,循环调用.运行如果出现字符编码问题,就直接打开file_data源文件,搜索open,将打开文件的代码中,加上encoding=utf-8
def test_request(self,**kwargs):#**kwargs可以传入字典参数,不限个数.此处用来接收从login1.yaml中读出来的用例,是字典
detail=kwargs.get('detail','没写用例描述')#如果没有定义detail,默认给个值’没写用例描述‘
self._testMethodDoc=detail#设置用例描述 url=kwargs.get('url')
url=parse.urljoin(self.base_url,url)#自动拼接url,
method=kwargs.get('method','get')#method默认给个get方法
data=kwargs.get('data',{})#如果没给data,默认给个空字典
header=kwargs.get('header',{})#如果没有header参数,默认给个空字典
cookie=kwargs.get('cookie',{})
check=kwargs.get('check')#获取login1.yaml中的预期结果check,是list
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,cookies=cookie,headers=header).text
except Exception as e:
print('接口请求出错')
res=e
for c in check:#循环遍历check中的所有预期结果,判断是否包含在实际结果中
self.assertIn(c,res,msg='预期结果不符,预期结果%s,实际结果%s'%(c,res))#断言,如果预期结果在实际结果中,pass.否则断言失败并给出错误信息msg suite=unittest.TestSuite()
suite.addTest(unittest.makeSuite(Login))
run=bf(suite)
run.report('login_test','登录测试用例')#第一个是描述,第二个是文件名
print(run.success_count)#通过的次数
print(run.failure_count)#失败次数)

单元测试unittest(基于数据驱动的框架:unittest+HTMLTestRunner/BeautifulReport+yaml+ddt)的更多相关文章

  1. unittest使用数据驱动ddt

    简介 ddt(data driven test)数据驱动测试:由外部数据集合来驱动测试用例,适用于测试方法不变,但需要大量变化的数据进行测试的情况,目的就是为了数据和测试步骤的分离 由于unittes ...

  2. Python必会的单元测试框架 —— unittest

    用Python搭建自动化测试框架,我们需要组织用例以及测试执行,这里博主推荐Python的标准库——unittest. unittest是xUnit系列框架中的一员,如果你了解xUnit的其他成员,那 ...

  3. 单元测试框架unittest

    单元测试:单元测试,是指对软件中的最小可测试单元进行检查和验证,对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义如:c语言中单元指一个函数,java里单元指一个类,图形化的软件中可以 ...

  4. Python单元测试框架——unittest

    测试的常用规则 一个测试单元必须关注一个很小的功能函数,证明它是正确的: 每个测试单元必须是完全独立的,必须能单独运行.这样意味着每一个测试方法必须重新加载数据,执行完毕后做一些清理工作.通常通过se ...

  5. 广深小龙-基于unittest、pytest自动化测试框架之demo来学习啦!!!

    基于unittest.pytest自动化测试框架之demo,赶紧用起来,一起学习吧! demo分为两个框架:①pytest    ②unittest demo 中 包含 web.api 自动化测试框架 ...

  6. Python单元测试框架unittest之深入学习

    前言 前几篇文章该要地介绍了python单元测试框架unittest的使用,本篇文章系统介绍unittest框架. 一.unittest核心工作原理 unittest中最核心的四个概念是:test c ...

  7. Python单元测试框架unittest之单用例管理(一)

    一.概述 本文介绍python的单元测试框架unittest,unittest原名为PyUnit,是由java的JUnit衍生而来,这是Python自带的标准模块unittest.unittest是基 ...

  8. Python单元测试框架 unittest详解

    一 整体结构概览 unittest原名为PyUnit,是由java的JUnit衍生而来.对于单元测试,需要设置预先条件,对比预期结果和实际结果. TestCase :通过继承TestCase类,我们可 ...

  9. django的单元测试框架unittest、覆盖率

    django的单元测试 指定测试范围: 指定运行某些测试文件./manage.py test --pattern="tests_*.py" -v 2 运行所有测试文件./manag ...

随机推荐

  1. Assembly.LoadFrom() 方法加载程序集,无法转换类型

    有些情况在开发一个C#框架的时候,要用到反射加载另外程序集,这是必然考虑的事情.这样做的好处就是多个工程同时作业的时候,可以互不干扰,替换DLL文件即可. Assembly.Load();这个方法只能 ...

  2. 2020-06-13:Redis底层数据结构?

    福哥答案2020-06-13: 福哥口诀法:简链字跳整 压快压 SDS simple synamic string:简单动态字符串.支持自动动态扩容的字节数组 .list :链表 .双端链表.dict ...

  3. C#LeetCode刷题之#661-图片平滑器( Image Smoother)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3730 访问. 包含整数的二维矩阵 M 表示一个图片的灰度.你需要 ...

  4. super与this的区别,更进一步的区别!——Java学习

    文章目录 this与super的含义 前言 例证 this super 总结 this与super的含义 在Java中,this有两层含义: 指示隐式参数的引用(就是当前对象的引用) 调用该类的其他构 ...

  5. Centos搭建go环境以及go入门

    引言 本文主要聚焦于 如何在centos上搭建go环境以及go入门, 包括搭建go环境,hello world运行, 创建包等操作,初步入门go语言. 安装环境 在管理员权限下, 也就是root用户 ...

  6. 超详细的阿里字节Spring面试技术点总结(建议收藏)

    前言 Spring作为现在最流行Java开发技术,其内部源码设计非常优秀. Spring这个词对于Java开发者想必不会陌生,可能你每天都在使用Spring,享受着Spring生态提供的服务.现在很多 ...

  7. cpu相关信息(进程、线程、核...)

    cpu的相关信息. 1.cpu 1.1 物理cpu 实际Server中插槽上的CPU个数.物理cpu数量,可以数不重复的 physical id 有几个 1.1.1 查看物理CPU的个数 cat /p ...

  8. 使用dd命令快速生成大文件或者小文件

    使用dd命令快速生成大文件或者小文件 需求场景: 在程序的测试中有些场景需要大量的小文件或者几个比较大的文件,而在我们的文件系统里一时无法找到那么多或者那么大的文件,此时linux的dd命令就能快速的 ...

  9. python编程入门笔记

    一.作用域 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我们要理解两点: a.在全局不能访问到局 ...

  10. Mybatis—curd

    Mybatis简介: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为 ...