unittest和unittest2的区别差异

参考:https://pypi.org/project/unittest2/

unittest2是Python 2.7及更高版本中添加到unittest测试框架的新功能的反向移植。经测试可在Python 2.6、2.7、3.2、3.3、3.4和pypy上运行

要使用unittest2代替unittest,只需将import unittest替换为 import unittest2即可

unittest2中的类派生自unittest中的适当类,因此应该可以使用运行unittest2测试的基础结构,而不必立即将所有测试切换为使用unittest2。同样,您可以使用新的断言方法unittest2.TestCase与标准单元测试的测试运行的基础设施。并非unittest2中的所有新功能都可以与标准unittest测试加载器一起使用,但是运行器结果对象。

通常,有关unittest2的文档,请参见CPython的最新文档:

新功能包括:

  • addCleanups-更好的资源管理
  • 许多新的断言方法,包括比较列表,集合,字典unicode字符串等的更好默认值,以及指定用于比较特定类型的新默认方法的能力
  • assertRaises作为上下文管理器,此后可以访问异常
  • 测试发现和新的命令行选项(包括快速运行和测试运行期间对ctrl-C的更好处理)
  • 类和模块级别的固定装置:setUpClasstearDownClass, setUpModuletearDownModule
  • 测试跳过和预期的失败
  • 用于assertAlmostEqual的新的delta关键字参数,以进行更有用的比较和比较非数字对象(例如日期时间)
  • load_tests协议,用于从模块或包中加载测试
  • TestResult上的startTestRunstopTestRun方法
  • 其他各种API改进和修复

注意

命令行用法

在Python 2.7中,您可以使用python -m unittest <args>调用unittest命令行功能(包括测试发现)。由于unittest是一个程序包,并且使用python -m ...调用程序包的功能是Python 2.7中的新增功能,因此我们无法对unittest2执行此操作。

相反,unittest2带有脚本unit2。 命令行用法

unit2发现
unit2 -v test_module

该脚本还有一个名为unit2.py的副本,对Windows有用,该脚本使用文件扩展名而不是使用shebang行来确定使用哪个程序执行文件。这两个脚本都由distutils安装。

在我编写适当的文档之前,有关所有新功能的最佳信息是Python 2.7的Python文档的开发版本:

查找有关在Python 2.7中添加或更改的功能的注释。

注意

unittest2已经用于distutils2的开发。

unittest2的版本0.5.1有功能奇偶校验单元测试在Python 2.7决赛。如果要确保测试在unittest2和unittest中在Python 2.7中运行相同,则应使用unittest2 0.5.1。

更高版本的unittest2包括在Python 3.2中进行的unittest更改,以及Python 2.7发布后的更改。

差异性

Python 2.7中的unittest2和unittest之间的区别:

  1. assertItemsEqual不会使Py3k警告保持沉默,因为它使用了warnings.catch_warnings()(这是Python 2.6中的新功能(用作上下文管理器,要使用Python 2.4会很麻烦 ))。
  2. TestCase.longMessage默认为True,因为它更好。由于向后兼容的原因,它在Python 2.7中默认为False。
  3. python -m软件包在Python 2.7之前的Python版本中不起作用。unittest2的命令行特性由一个提供页免费(和 unit2.py)脚本来代替。
  4. unittest2包括一个非常基本的setuptools兼容测试收集器。在setup.py中指定 test_suite ='unittest2.collector'。这将从包含setup.py的目录中的默认参数开始测试发现,因此,它可能是最有用的示例(请参阅unittest2 / collector.py)。
  5. 在unittest2中,TextTestResult.stopTestRun负责调用printErrors。这是理想的行为,但是在Python 3.1中,TestResult.stopTestRun被记录为空,并且子类不需要调用它。这将使更改向后不兼容并且需要考虑。

问题

一个TestResult中有意想不到的成功对象返回True result.wasSuccessful() 。很难知道这是否是正确的行为。

如果将点路径名用于测试发现,则仍将使用全局安装的模块/程序包,而不是当前目录中的一个。从虚线路径名进行发现时,我们可以检查这种特定情况。

removeHandler装饰也可能是一个上下文管理器。

问题8313:单元测试回溯中的<unprintable AssertionError object>消息在2.7之前的Python版本中很难修复。Python 2.7中的修复依赖对跟踪模块和跟踪对象的更改。由于该问题很少见,因此我将其保留在unittest2中。

unittest2(和unittest)中有几个地方会在异常上调用str(...)以获取异常消息。如果使用非ASCII Unicode创建异常,则失败。这很少见,除非将其实际报告为某人的问题,否则我不会解决。

文本或长序列的比较(使用assertSequenceEqual或 assertMultiLineEqual等)可能需要长时间才能为故障消息生成差异。这些方法使用prettyprintdifflib

pip install -e。除非已经安装了setuptools> 0.6.24,否则unittest2源中的Python3.2上的版本将失败。这是需要较新的setuptools(以避免使用execfile)和setup_requires回退到easy_install的组合,而后者不知道如何及时升级setuptools,从而无法在unittest2中对其进行修复。

unittest2框架------执行原理

使用unittest2框架,做简单的技术实验,了解框架基本使用及执行原理代码:

#一个自动化测试框架,关于用例执行的实验

#导入包
import unittest2 #创建类,并继承代码库中的TestCase,表示当前类,是测试用例类
class UnittestDemo(unittest2.TestCase): #重写setUpClass()方法
@classmethod
def setUpClass(cls):
print('setUpClass方法')
print('') def setUp(self):
print('在测试用例开始前,要做的初始化条件') def test_login(self):
print('以test开头的测试用例执行实验')
self.func_aa() def func_aa(self):
print('不以test开头的方法,是普通方法,只有被调用才会执行,放在test_login()里调用了!') def test_regi(self):
print('每条测试用例执行前,需要执行一次setUp()、tearDown()方法') def tearDown(self):
print('在测试用例结束后,要做的场景还原')
print('') #重写tearDownClass方法
@classmethod
def tearDownClass(cls):
print('tearDownClass方法') if __name__ == '__main__':
unittest2.main()

光标在main()方法处,运行结果:

setUpClass方法
在测试用例开始前,要做的初始化条件
以test开头的测试用例执行实验
不以test开头的方法,是普通方法,只有被调用才会执行,放在test_login()里调用了!
在测试用例结束后,要做的场景还原

在测试用例开始前,要做的初始化条件
每条测试用例执行前,需要执行一次setUp()、tearDown()方法
在测试用例结束后,要做的场景还原

tearDownClass方法

Ran 2 tests in 0.002s

OK

最后收尾的小结:

  • 按住ctrl键,点击unittest2.TestCase类,可以看到这个类中,继承了unittest.TestCase
  • 我们用的unittest2,是unittest的升级版本,unittest.TestCase打开这个类,可以找到**setUp()、tearDown()**是写的pass空方法,所以需要重写这两个方法
  • 按住ctrl键,点击unittest2.TestCase类,进入这个类中,还有两个方法setUpClass()、tearDownClass()、方法。这两个方法也需要重写,方法前要加注释器【@classmethod】
  • 重写父类中的setUpClass()方法,是类中,所有测试用例执行前,要做的初始化条件
  • 重写父类中的setUp()方法。在每条测试用例开始前,要做的预置条件
  • 声明一个以test开头的方法,表示这是一个测试用例方法,该方法可以直接运行。
  • test开头的测试用例执行顺序,按照test后的字母排列顺序执行
  • 声明一个不以test开头的方法,是普通方法,只有被调用才会执行
  • 重写父类中的tearDown()方法。在测试用例结束后,要做的场景还原
  • 重写父类中的tearDownClass()方法,是类中,所有测试用例执行后,要做的场景还原工作(比如注册后,再次注册不成功)
  • 每条测试用例执行前,需要执行一次setUp()、tearDown()方法
  • unittest2.main()解释:只有在当前文件运行,就会执行unittest2.main()。表示调用unittest2的主方法,执行当前类中的所有方法
  • 运行时,如果光标指在某一个test开头的测试类上,就只运行当前的测试类;如果光标在unittest2.main()处,就会执行所有的测试用例方法

unittest和unittest2的区别差异、unittest2框架------执行原理的更多相关文章

  1. ThinkPHP2.2框架执行流程图,ThinkPHP控制器的执行流程

    ThinkPHP2.2框架执行原理.流程图在线手册 ThinkPHP控制器的执行流程 对用户的第一次URL访问 http://<serverIp>/My/index.php/Index/s ...

  2. python 自动化测试框架unittest与pytest的区别

    前言: 有使用过unittest单元测试框架,再使用pytest单元测试框架,就可以明显感觉到pytest比unittest真的简洁.方便很多. unittest与pytest的区别: 主要从用例编写 ...

  3. (转)android平台phonegap框架实现原理

    (原文)http://blog.csdn.net/wuruixn/article/details/7405175 android平台phonegap框架实现原理 分类: Android2012-03- ...

  4. WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇]

    原文:WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇] 在[上篇]中,我们分别站在消息交换和编程的角度介绍了SOAP Fault和FaultException异常.在服务执行过 ...

  5. 黑马程序员—创建JDBC框架及原理分析

    对于Java数据库的连接,由最初学习的每次全部手工代码,到后面的不断利用知识简化代码量:这是不断学习的过程,就像人类由原始社会的钻木取火到当代的文明,都是一步步过来的! 本文不从最开始的JDBC入门开 ...

  6. Taro 框架实现原理

    Taro 框架实现原理 小程序 H5 RN Web 多端框架 Taro 1.x & Taro 2.x 编译型架构, 语法编译转换 Taro 1/2 属于编译型架构,主要通过对类 React 代 ...

  7. PHP框架模板原理

           PHP框架现在是一种很流行的东西了,很多朋友开发应用与网站都会选择一个PHP框架或模板了,下面我们来看看PHP框架是如何实现的吧. 本文主要来聊聊框架理论,但不针对任何一款框架,不过任何 ...

  8. android模拟器(genymotion)+appium+python 框架执行基本原理(目前公司自己写的)

    android模拟器(genymotion)+appium+python 框架执行的基本过程: 1.Push.initDate(openid)方法     //业务数据初始化 1.1   v5db.p ...

  9. mvc框架路由原理

    到目前为止已经使用过很多php框架,比如:Zendframework,ThinkPHP,YII,Slim.但还未静下心来研究过框架的原理. 今天首先来看一下mvc框架中路由的原理: 所谓路由,就是程序 ...

随机推荐

  1. C++-POJ1021-2D-Nim[hash]

    哈希,对于每个点哈希一次 哈希的方式:该点到联通分量边界(上下左右)的距离和 然后分别对两个图的n个点按hash值排序,判断是否相等即可 #include <set> #include & ...

  2. Python | 面向对象中的名词总结

    一.变量名称 (最前的序号表示将来用到的频繁程度) 5 全局变量: 1. 文件中出现的变量,不归属于函数及类:2.在函数用用global声明的变量 2 局部变量: 1.类的方法中没有self.,只能在 ...

  3. 图的bfs遍历模板(邻接矩阵存储和邻接表存储)

    bfs遍历图模板伪代码: bfs(u){ //遍历u所在的连通块 queue q; //将u入队 inq[u] = true; while (q非空){ //取出q的队首元素u进行访问 for (从u ...

  4. goahead web 服务器

    https://blog.csdn.net/xieyihua1994/article/details/74002413

  5. 测试理论 - Test Double

    概述 简述 test double mock, fake 之类的东西 背景 最近在看 google 软件测试之道 妈的 13 年的老书了 书里有提到 mock, fake, stub 刚好, 我又不太 ...

  6. 2019牛客多校第三场B Crazy Binary String 思维

    Crazy Binary String 思维 题意 给出01串,给出定义:一个串里面0和1的个数相同,求 满足定义的最长子序列和子串 分析 子序列好求,就是0 1个数,字串需要思考一下.实在没有思路可 ...

  7. springboot+jwt

    大概了解下SpringMVC和jwt,百度 代码: 1.整体框架 2.controller package com.yiyezhiqiu.jwt.jwt.controller; import com. ...

  8. Go_Redis

    Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,很多业务场景下的问题都可以很自然地映射到这些数据结构上.除此之外,通过复制.持久化和客户端分片等特性,我们可以 ...

  9. 解决:配置虚拟主机,重启apache,[warn] _default_ VirtualHost overlap on port 80, the first has precedence

    http://blog.csdn.net/kaizhu_qin/article/details/17506293 很多第一次配置apache的虚拟主机的时候,以为配置第一个虚拟主机完成以后,以后就不会 ...

  10. HTML5学习(4)文本元素

    使用VSCode编辑器,内置emmet插件. ctrl+/ 注释/取消注释 ctrl+enter 新起一行 ctrl+shift+enter 往上新起一行 h$*4>lorem10 <h1 ...