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. 解决无法将“babel”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

    错误截图: 第一反应想到的是环境变量没有配置好,再仔细检查一下,并没有错误 在cmd窗口运行命令“ babel --version ”,如果出现对应的版本号,那就说明环境变量是正确的 解决方案: 用管 ...

  2. asp.net使用wsdl文件调用接口,以及调用SSL接口报错“根据验证过程 远程证书无效”的处理

    1.调用wsdl接口,首先需要将wsdl文件转换为cs文件: 进入VS 开发人员命令提示行,输入如下命令: c:/Program Files/Microsoft Visual Studio 8/VC& ...

  3. centos7 源码编译安装nginx教程 nginx安装脚本 lua-nginx-module

    安装nginx需要pcre zlib openssl的库,下文都是在官网直接下载用作编译安装 该nginx安装教程,有安装maxmind IP 库 该nginx安装教程有安装lua-nginx-mod ...

  4. JS字符串的不可变性

    js中的字符串特性->不可变性,字符串的值是不可变的 1.改变字符串中的字符 var str = "hello"; str[1] = "W"; conso ...

  5. js的全局变量与var关键字

    var a = '1'; 如果定义在函数外,就是全局变量.如果定义在函数内,就不是全局变量,只能在函数内调用. 但是:如果在函数内定义变量,没有加var关键字,默认表示该变量是全局的.

  6. 一个实例 ---灵活使用jquery选择器实现input一个key,多个value 。 用ajax传递对象到后台控制器

    标题可能不是很清晰,我们看实例: 简单来说就是需要实现sku的功能...一件商品可以有多个属性, 一个属性可以有多个值  . 最后以json格式存到数据库 难点一: 如何实现input输入框的弹性使用 ...

  7. 什么是JWT令牌认证?

    当下,JWT(JSON Web Token)令牌认证已经变得越来越流行.本文主要介绍JWT令牌认证与传统的Session会话认证机制的区别. 为什么需要认证? HTTP是一种无状态协议,那就意味着当前 ...

  8. vue 项目太大, 导致 javascript heap out of memory

    原因: node 环境, 对单个进程的内存是有限制的, 但是现在前端项目太大, 所以我们需要根据当前机器环境, 手动加大node的内存限制 安装包 npm i increase-memory-limi ...

  9. no module named系列问题解决

    持续更新中~~~ 1.终端指令错误:no module named 'gdbm' 解决办法: sudo apt-get install python3.6-gdbm 2.终端无法定位软件包 解决办法: ...

  10. Opencv模块

    参考博客:https://blog.csdn.net/u012679707/article/details/79505279