一、摘要

单元测试里很重要的一个部分就是断言,unittest为我们提供了很多断言方法,断言方法分为三类,一种是用来断言被测试的方法的,另一种是测试是否抛正确异常的,第三种是用来断言日志是否包含应有信息的,方法很多

第一种很好理解,是用来判断我们的被测点是否达到预期用的。

第二种用来判断在某种情况下是否会抛出特定的异常,如果会抛出该特定异常,则会判断为断言成功,如果没抛出这种特定异常则会判断为断言失败。

第三种是用来断言日志是否包含应有信息的

assertEqual(a, b, msg=None)断言 a == b
assertNotEqual(a, b, msg=None)断言 a != b
assertTrue(expr, msg=None)断言 bool(expr) is True
assertFalse(expr, msg=None)断言 bool(expr) is False
assertIs(a, b, msg=None)断言 a is b
assertIsNot(a, b, msg=None)断言 a is not b
assertIsNone(expr, msg=None)断言 expr is None
assertIsNotNone(expr, msg=None)断言 expr is not None
assertIn(a, b, msg=None)断言 a in b
assertNotIn(a, b, msg=None)断言 a not in b
assertIsInstance(obj, cls, msg=None)断言 obj is cls instance
assertNotIsInstance(obj, cls, msg=None)断言 obj is not cls instance
assertRaises(exc, fun, *args, **kwds)断言 fun(*args, **kwds) 是否抛出正确异常, 否则抛出断言异常
assertRaisesRegex(exc, r, fun, *args, **kwds) 断言 fun(*args, **kwds) 是否抛出正确异常,同时可以用正则r去匹配异常信息exc,否则抛出断言异常
assertWarns(warn, fun, *args, **kwds)断言fun(*args, **kwds) raises warn
assertWarnsRegex(warn, r, fun, *args, **kwds)断言 fun(*args, **kwds) raises warn and the message matches regex r
assertLogs(logger, level) 断言log: 断言log里是否出现期望的信息,如果出现则通过,如果没出现,则断言失败抛出断言异常
assertAlmostEqual(a, b, msg=None, delta=None) round(a-b, 7) == 0 断言a-b约等于0,小数点后默认保留7位
assertNotAlmostEqual(a, b, msg=None, delta=None) round(a-b, 7) != 0 断言不是约等于的情况
assertGreater(a, b, msg=None) a > b 断言大于
assertGreaterEqual(a, b, msg=None) a >= b 断言大于等于
assertLess(a, b, msg=None, msg=None) a < b 断言小于
assertLessEqual(a, b, msg=None) a <= b 断言小于等于
assertRegex(text, regex, msg=None) r.search(s)
assertNotRegex(text, regex, msg=None) not r.search(s)
assertCountEqual(a, b, msg=None) a and b have the same elements in the same number, regardless of their order
assertMultiLineEqual(a, b, msg=None) strings 断言多行字符串
assertSequenceEqual(a, b, msg=None, seq_type=None) sequences 断言序列
assertListEqual(a, b, msg=None) lists 断言List
assertTupleEqual(a, b, msg=None) tuples 断言元组
assertSetEqual(a, b, msg=None) sets or frozensets 断言Set
assertDictEqual(a, b, msg=None) dicts 断言词典

在早期的python版本中,断言函数的写法有些已经被废弃了,如下对应关系所示,在我们使用编译器的时候经常会提示“Deprecated”这个单词,意味着有新的方式取代了当前的实现方法

Method Name             Deprecated alias         Deprecated alias
assertEqual() failUnlessEqual assertEquals
assertNotEqual() failIfEqual assertNotEquals
assertTrue() failUnless assert_
assertFalse() failIf
assertRaises() failUnlessRaises
assertAlmostEqual() failUnlessAlmostEqual assertAlmostEquals
assertNotAlmostEqual() failIfAlmostEqual assertNotAlmostEquals
assertRegex() assertRegexpMatches
assertNotRegex() assertNotRegexpMatches
assertRaisesRegex() assertRaisesRegexp

二、代码实例

# encoding = utf-8
import unittest
import random
import logging mylogger = logging.Logger('TestToBeTest') # 被测试类
class ToBeTest(object):
@classmethod
def sum(cls, a, b):
return a + b @classmethod
def div(cls, a, b):
return a/b @classmethod
def return_none(cls):
return None # 单元测试类
class TestToBeTest(unittest.TestCase): # assertEqual()方法实例
def test_assertequal(self):
try:
a, b = 100, 200
sum = 300
# 断言a+b等于sum
self.assertEqual(a + b, sum, '断言失败,%s+%s != %s ' %(a, b, sum))
except AssertionError as e:
print(e)
# 断言log
with self.assertLogs('assertlog', level='INFO') as cm:
logging.getLogger('assertlog').info('first message')
logging.getLogger('assertlog.bar').error('second message')
self.assertEqual(cm.output, ['INFO:assertlog:first message', 'ERROR:assertlog.bar:second message']) # assertNotEqual()方法实例
def test_assertnotequal(self):
try:
a, b = 100, 200
res = -1000
# 断言a-b不等于res
self.assertNotEqual(a - b, res, '断言失败,%s-%s != %s ' %(a, b, res))
except AssertionError as e:
print(e) # assertTure()方法实例
def test_asserttrue(self):
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list2 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
list3 = list1[::-1]
print(list3)
try:
# 断言表达式为真
self.assertTrue(list3 == list2, "表达式为假")
except AssertionError as e:
print(e) # assertFalse()方法实例
def test_assertfalse(self):
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list2 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
list3 = list1[::-1]
try:
# 断言表达式为假
self.assertFalse(list3 == list1, "表达式为真")
except AssertionError as e:
print(e) # assertIs()方法实例
def test_assertis(self):
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list2 = list1
try:
# 断言list2和list1属于同一个对象
self.assertIs(list1, list2, "%s 与 %s 不属于同一对象" % (list1, list2))
except AssertionError as e:
print(e) # assertIsNot()方法实例
def test_assertisnot(self):
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list2 = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
try:
# 断言list2和list1不属于同一个对象
self.assertIsNot(list2, list1, "%s 与 %s 属于同一对象" % (list1, list2))
except AssertionError as e:
print(e) # assertIsNone()方法实例
def test_assertisnone(self):
try:
results = ToBeTest.return_none()
# 断言表达式结果是none
self.assertIsNone(results, "is not none")
except AssertionError as e:
print(e) # assertIsNotNone()方法实例
def test_assertisnotnone(self):
try:
results = ToBeTest.sum(4, 5)
# 断言表达式结果不是none
self.assertIsNotNone(results, "is none")
except AssertionError as e:
print(e) # assertIn()方法实例
def test_assertin(self):
try:
str1 = "this is unit test demo"
str2 = "demo"
# 断言str2包含在str1中
self.assertIn(str2, str1, "%s 不被包含在 %s中" %(str2, str1))
except AssertionError as e:
print(e) # assertNotIn()方法实例
def test_assertnotin(self):
try:
str1 = "this is unit test demo"
str2 = "ABC"
# 断言str2不包含在str1中
self.assertNotIn(str2, str1, "%s 包含在 %s 中" % (str2, str1))
except AssertionError as e:
print(e) # assertIsInstance()方法实例
def test_assertisinstance(self):
try:
o = ToBeTest
k = object
# 断言测试对象o是k的类型
self.assertIsInstance(o, k, "%s的类型不是%s" % (o, k))
except AssertionError as e:
print(e) # assertNotIsInstance()方法实例
def test_assertnotisinstance(self):
try:
o = ToBeTest
k = int
# 断言测试对象o不是k的类型
self.assertNotIsInstance(o, k, "%s 的类型是%s" % (o, k))
except AssertionError as e:
print(e) # assertRaises()方法实例
def test_assertraises(self):
# 测试抛出指定的异常类型
# assertRaises(exception)
with self.assertRaises(TypeError) as exc:
random.sample([1, 2, 3, 4, 5, 6], "j")
# 打印详细的异常信息
print(exc.exception)
# assertRaises(exception, callable, *args, **kwds)
try:
self.assertRaises(ZeroDivisionError, ToBeTest.div, 3, 0)
except ZeroDivisionError as e:
print(e) # assertRaisesRegexp()方法实例
def test_assertraisesregex(self):
# 测试抛出指定的异常类型,并用正则表达式去匹配异常信息
# assertRaisesRegex(exception, regexp)
with self.assertRaisesRegex(ValueError, "literal") as exc:
int("abc")
# 打印详细的异常信息
print(exc.exception) # assertRaisesRegex(exception, regexp, callable, *args, **kwds)
try:
self.assertRaisesRegex(ValueError, 'invalid literal for.*\'abc\'$', int, 'abc')
except AssertionError as e:
print(e) # assertLogs()方法实例
def test_assertlogs(self):
with self.assertLogs(mylogger) as log:
mylogger.error("打开浏览器")
mylogger.info('关闭并退出浏览器')
self.assertEqual(log.output, ['ERROR:TestToBeTest:打开浏览器', 'INFO:TestToBeTest:关闭并退出浏览器']) if __name__ == '__main__':
unittest.main()

三、代码解析

单元测试框架之unittest(五)的更多相关文章

  1. Python单元测试框架:unittest(一)

    Python单元测试框架unittest使用方法讲解 主要介绍了Python单元测试框架unittest使用方法讲解,本文讲解了unittest概述.命令行接口.测试案例自动搜索.创建测试代码.构建测 ...

  2. unittest单元测试框架之unittest 框架的总结(七)

    1. Unittest 是 python 自带的单元测试框架,可以用其作为自动化框架来组织测试用例(测 试用例的执行顺序)的执行. 2. Unittest 框架的流程: 写好 TestCase 通过 ...

  3. 单元测试框架之unittest(七)

    一.摘要 前篇文章已经详细介绍了unittest框架的特性,足以满足我们日常的测试工作,但那并不是unittest的全部,本片博文将介绍一些应该知道但未必能经常用到的内容 然而,想全部掌握unitte ...

  4. 单元测试框架之unittest(一)

    一.单元测试的含义 unittest单元测试框架的设计灵感来源于Junit(Java语言的单元测试框架),它与其他语言的单元测试框架风格相类似,支持自动化测试.为测试共享setUp和shutDown. ...

  5. unittest单元测试框架之unittest 框架的总结2(八)

    unittest 下的属性 1.Unittest.TestCase:所有测试用例类继承的基本类 2.Unittest.main():将一个单元测试模块变为可直接运行的测试脚本 If __name__ ...

  6. 单元测试框架之unittest(六)

    一.摘要 本片博文将介绍unittest框架的一些轻便有效的特性,在我们的测试中经常可以用到 如果有一些测试方法不想执行,如果有些测试方法在某些条件下不执行 该当如何? 如果有些方法未在unittes ...

  7. 单元测试框架之unittest(二)

    一.摘要 本章笔者将详细介绍组织测试代码的相关内容,所用的测试例子会是冒泡排序,笔者在从业这么久之后回想很多面试都要问冒泡排序,虽然不知道为什么要问这个,但还是希望大家掌握,它与自动化测试关系不大属于 ...

  8. 单元测试框架之unittest(四)

    一.摘要 假设我们有一组测试方法差别非常小,比如仅仅是所需要的参数有少许变化时,我们的自动化测试如何进行?unittest框架为这种场景提供了一种方式,它允许我们用subTest()上下文管理器在一个 ...

  9. 单元测试框架之unittest(三)

    一.摘要 前边的文章我们看到执行测试用例的是通过调用unittest.mian()函数,它会将模块的测试用例收集起来并执行,然而当我们的测试用例增多了以后,这样的执行非常不灵活而且没有效率,我们更愿意 ...

随机推荐

  1. Egret入门学习日记 --- 第三篇 (书中 3.4 内容)

    第三篇 (书中 3.4 内容) 今天还是要把昨天项目运行后,EXML文件里的界面没有出现的问题解决了才行. 去了群里,没人回.去了官网看文档,看不懂. 不过倒是看到了一个好东西: 还挺便宜啊,一个月要 ...

  2. leetcode1105 Filling Bookcase Shelves

    思路: dp[i]表示摆放好前i本书所需要的最小代价. 实现: class Solution { public: int minHeightShelves(vector<vector<in ...

  3. 【C/C++开发】内存对齐(内存中的数据对齐)、大端模式及小端模式

    数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍.DWORD数据的内存起始地址能被4除尽,WORD数据的内存起始地址能被2除尽.X86 CPU能直接访问对齐的数据,当它试图访问一个未对齐的数据 ...

  4. javascript 数组和对象的浅复制和深度复制 assign/slice/concat/JSON.parse(JSON.stringify())

    javascript 数组和对象的浅度复制和深度复制在平常我们用 ‘=’来用一个变量引用一个数组或对象,这里是‘引用’而不是复制下面我们看一个例子引用和复制是什么概念 var arr=[1,2,3,' ...

  5. OpenCV Python 4.0安装

    1.安装OpenCV-Python 如果你是第一次使用OpenCV Python开发包,想要安装OpenCV Python4.0只要执行如下命令行即可: pip install opencv-pyth ...

  6. 乐字节Java构造器(构造方法|构造函数)、方法与内存分析

    一. 构造器(构造方法|构造函数) 在创建对象时(new),必会调用一个特殊的方法,这个方法是初始化对象信息的为new服务的.这个方法称为“构造器” 使用 new + 构造方法创建一个新的对象. 构造 ...

  7. SAS学习笔记41 宏变量存储及间接引用

    Macro Variables存储在“Symbol Table”中.它是由Macro Processor在SAS启动时自动创建并维护的.SAS提供了一张视图来供我们查看Symbol Table中的内容 ...

  8. java异常那些事

    异常的基本定义: 异常情形是指阻止当前方法或者作用域继续执行的问题.在这里一定要明确一点:异常代码某种程度的错误,尽管Java有异常处理机制,但是我们不能以“正常”的眼光来看待异常,异常处理机制的原因 ...

  9. 数据库开启最小补充日志hang住

    一.场景说明: 客户环境需要部署OGG,同事在数据库中执行添加最小补充日志,会话Hang住 二.环境测试 本次测试环境进行模拟,添加最小补充日志的操作,怎么会被Hang住呢? 2.1 模拟会话hang ...

  10. ggplot2|详解八大基本绘图要素

    本文首发于微信公众号 *“ 生信补给站 ” ,期待您的关注!!!* 原文链接:https://mp.weixin.qq.com/s?__biz=MzIyNDI1MzgzOQ==&mid=265 ...