python--unittest单元测试框架

2023-10-28

1. 简介

unittest单元测试框架是受到 JUnit(JAVA) 的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。

2. 构成

静态类图
在这里插入图片描述

2.1 fixture

test fixture 表示为了开展一项或多项测试所需要进行的准备工作,以及所有相关的清理操作。举个例子,这可能包含创建临时或代理的数据库、目录,再或者启动一个服务器进程。

  • 应用级别为每个测试用例, 在用例 test1 test2 test3执行前后会分别执行setUp tearDown方法
import unittest

class TestDemo(unittest.TestCase):
    """Test demo.py"""

    def setUp(self):
        print("do something before test.Prepare environment.")
    
    def tearDown(self):
        print("do something after test.Teardown environment.")
        
    def test1(self):
        pass
    
    def test2(self):
        pass
    
    def test3(self):
        pass
  • 应用级别为测试类,在TestDemo测试类执行前后分别执行一次setUpClass tearDownClass

即使在这个测试类中有三个测试用例,但是fixture是 class 级别,所以只执行一次。

  • 重写类级别的fixture的时候需要使用@classmethod装饰器
import unittest

class TestDemo(unittest.TestCase):
    """Test demo.py"""
    
	@classmethod
    def setUpClass(cls):
        print("This setUpClass() method only called once.")

    @classmethod
    def tearDownClass(cls):
        print("This tearDownClass() method only called once too.")
        
    def test1(self):
        pass
    
    def test2(self):
        pass
    
    def test3(self):
        pass

2.2 test case

一个测试用例是一个独立的测试单元。它检查输入特定的数据时的响应。unittest提供一个基类:TestCase,用于新建测试用例。

  • 编写一个基于TestCase的测试类,类名一定要Test开头,里面的测试用例(类中方法)也是test开头,这样会被unittest识别并执行测试。
import unittest

class TestDemo(unittest.TestCase):
    """Test demo.py"""
    
    def test1(self):
        """make some assert"""
        self.assertEqual(1 > 2) 
    
    def test2(self):
        pass
    
    def test3(self):
        pass

2.3 test suite

test suite是一系列的测试用例,或测试套件,或两者皆有。它用于归档需要一起执行的测试。

  • 在编写完测试用例后,可以将需要执行测试的用例加入到test suite中,以便执行测试
  • suite中可以嵌套suite
import unittest

class TestDemo(unittest.TestCase):
    """Test demo.py"""
    
    def test1(self):
        """make some assert"""
        self.assertEqual(1 > 2) 
    
    def test2(self):
        pass
    
    def test3(self):
        pass
    

if __name__ == "__main__":
    # 创建一个 test suite
    suite = unittest.TestSuite()
	# 组成一个用例列表
    tests = [TestDemo("test1"), TestDemo("test2"), TestDemo("test3")]
    # 使用 .addTests 方法将列表中的用例添加至 suite 中
    suite.addTests(tests)
	# 执行用例
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

2.4 test runner

test runner是一个用于执行和输出测试结果的组件。这个运行器可能使用图形接口、文本接口,或返回一个特定的值表示运行测试的结果。
在上面的代码中已经有使用到 TextTestRunner

  • 首先创建一个 runner 对象
  • 执行 runner.run() 方法即可执行测试用例,参数为 test suite

2.5 assert

  • 常规断言方法
    | 方法 | 例子 |
    | — | — |
    | assertEqual(a,b) | a==b |
    | assertNotEqual(a,b) | a!=b |
    | assertTrue(x) | bool(x)isTrue |
    | assertFalse(x) | bool(x)isFalse |
    | assertIs(a,b) | aisb |
    | assertIsNot(a,b) | aisnotb |
    | assertIsNone(x) | xisNone |
    | assertIsNotNone(x) | xisnotNone |
    | assertIn(a,b) | ainb |
    | assertNotIn(a,b) | anotinb |
    | assertIsInstance(a,b) | isinstance(a,b) |
    | assertNotIsInstance(a,b) | notisinstance(a,b) |

  • 模糊断言方法
    | 方法 | 例子 |
    | — | — |
    | assertAlmostEqual(a,b) | round(a-b,7)==0 |
    | assertNotAlmostEqual(a,b) | round(a-b,7)!=0 |
    | assertGreater(a,b) | a>b |
    | assertGreaterEqual(a,b) | a>=b |
    | assertLess(a,b) | a<b |
    | assertLessEqual(a,b) | a<=b |
    | assertRegex(s,r) | r.search(s) |
    | assertNotRegex(s,r) | notr.search(s) |
    | assertCountEqual(a,b) | a and b have the same elements in the same number, regardless of their order. |

2.6 skip

当测试中出现某些原因我们不得不跳过一些测试用例的时候,需要用到skip()的一些方法。

  • @unittest.skip(reason)

跳过被此装饰器装饰的测试。reason为测试被跳过的原因。

  • @unittest.skipIf(condition,reason)

condition为真时,跳过被装饰的测试。

  • @unittest.skipUnless(condition,reason)

跳过被装饰的测试,除非condition为真。

  • @unittest.expectedFailure

将测试标记为预期的失败或错误。如果测试失败或错误,它将被视为成功。如果测试通过,它将被视为失败。

  • exceptionunittest.SkipTest(reason)

引发此异常以跳过一个测试。
通常来说,你可以使用TestCase.skipTest()或其中一个跳过测试的装饰器实现跳过测试的功能,而不是直接引发此异常。

被跳过的测试的**setUp()****tearDown()**不会被运行。被跳过的类的**setUpClass()****tearDownClass()**不会被运行。被跳过的模块的**setUpModule()****tearDownModule()**不会被运行。

官方文档

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python--unittest单元测试框架 的相关文章

  • 熊猫按 n 最大总和分组

    我正在尝试使用groupby nlargest and sum在 Pandas 中一起运行 但在运行时遇到困难 State County Population Alabama a 100 Alabama b 50 Alabama c 40
  • 如何把父母和孩子联系起来?

    有两个简单的类 一个只有parent属性 并且两者兼而有之parent and children属性 这意味着同时具备两者的人parent and children继承自唯一的parent 这是只有parent属性 我们就这样称呼它吧Chi
  • 在函数内的 for 循环上使用 tqdm 来检查进度

    我正在使用 for 循环迭代目录树内的一大组文件 这样做时 我想通过控制台中的进度条来监视进度 因此 我决定使用 tqdm 来实现此目的 目前 我的代码如下所示 for dirPath subdirList fileList in tqdm
  • 从所有数据帧列中删除子字符串

    我有一个单词列表 大约 1000 个单词 我称之为负面单词 CAST ARTICLES SANITARY JAN CLAUSES SPECIAL ENDORSEMENT 我很快就会用这个单词列表制作一个数据框 我还有一个数据框 看起来像 F
  • App Engine 上的 Django 与 webapp2 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何通过 python 中的函数运行列表?

    我试图通过我创建的函数运行我的列表 但不断收到错误 我不知道出了什么问题 温度 F temp f 19 21 21 21 23 功能 def fahrToCelsius tempFahrenheit return tempFahrenhei
  • Python,Google Places API - 给定一组纬度/经度查找附近的地点

    我有一个由商店 ID 及其纬度 经度组成的数据框 我想迭代该数据框 并使用 google api 为每个商店 ID 查找附近的关键地点 例如输入 Store ID LAT LON 1 1 222 2 222 2 2 334 4 555 3
  • 获取 Keras model.summary() 作为表

    我在 Keras 中创建了相当大的模型 我正在用 LaTeX 写一篇关于它的文章 为了很好地描述 LaTeX 中的 keras 模型 我想用它创建一个 LaTeX 表 我可以手动实现它 但我想知道是否有任何 更好 的方法来实现这一点 我四处
  • 使用 ElementTree 在 python 中解析 xml

    我对 python 很陌生 我需要解析一些脏的 xml 文件 这些文件需要先清理 我有以下 python 代码 import arff import xml etree ElementTree import re totstring wit
  • 将图与热图(可能是对数)配对?

    How to create a pair plot in Python like the following but with heat maps instead of points or instead of a hex bin plot
  • 如何将 URL 添加到 Telegram Bot 的 InlineKeyboardButton

    我想制作一个按钮 可以从 Telegram 聊天中在浏览器中打开 URL 外部超链接 目前 我只开发了可点击的操作按钮 update message reply text Subscribe to us on Facebook and Te
  • 在Python中使用pil读取tif图像时出现值错误?

    我必须读取尺寸的tif图像2200 2200并输入 uint16 我将 PIL 库与 anaconda python 一起使用 如下所示 from PIL import Image img Image open test tif img i
  • 将 Django 中的所有视图限制为经过身份验证的用户

    我是 Django 新手 我正在开发一个项目 该项目有一个登录页面作为其索引和一个注册页面 其余页面都必须仅限于登录用户 如果未经身份验证的用户尝试访问这些页面 则必须将他 她重定向到登录页面 我看到 login required装饰器会将
  • 从给定的项目列表创建子列表

    我首先要说的是以下问题不是为了家庭作业目的即使因为我几个月前就完成了软件工程师的工作 无论如何 今天我正在工作 一位朋友向我询问了这个奇怪的排序问题 我有一个包含 1000 行的列表 每行代表一个数字 我想创建 10 个子列表 每个子列表都
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • py2exe ImportError:没有名为 的模块

    我已经实现了一个名为 myUtils 的包 它由文件夹 myUtils 文件 组成 init py 和许多名称为 myUtils 的 py 文件 该包包含在 myOtherProject py 中 当我从 Eclipse 运行它们时可以找到
  • ProcessPoolExecutor 传递多个参数

    ESPN播放器免费 class ESPNPlayerFree def init self player id match id match id team 团队名单1 277906 cA2i150s81HI3qbq1fzi za1Oq5CG
  • 从 Django 运行 shell 命令

    我正在 Django 中开发一个网页 使用 apache 服务器 需要调用 shell 命令来启用 禁用一些守护进程 我尝试这样做 os system service httpd restart 1 gt HOME out 2 gt HOM
  • Tkinter 将鼠标点击绑定到框架

    我一定错过了一些明显的东西 我的 Tkinter 程序中有两个框架 每个框架在网格布局中都有一堆标签 我想将鼠标点击绑定到其中一个而不是另一个 我目前使用 root bind
  • 使用 python 将 CSV 文件上传到 Microsoft Azure 存储帐户

    我正在尝试上传一个 csv使用 python 将文件写入 Microsoft Azure 存储帐户 我已经发现C sharp https blogs msdn microsoft com jmstall 2012 08 03 convert

随机推荐

  • 视觉深度伪造检测技术综述

    来源 专知 本文约600字 建议阅读5分钟 本文基于视觉深度伪造技术研究进行综述 随着生成式深度学习算法的发展 深度伪造技术发展并应用于各个领域 深度伪造技术的滥用使人们逐渐意识到其带来的威胁 伪造检测技术随之而生 本文基于视觉深度伪造技术
  • 计算计( ji suan ji)

    计算是对世界的解释和说明 算计则是对世界的行动与改造 新逻辑不但涉及计算的传统逻辑还将涉及算计的超逻辑 不能在理性之外研究博弈 就不是生态开放的博弈 没有人性的逻辑 就不是真实的博弈智能 理性会压制感性 也会让想象力进入牢笼区间 失去博弈的
  • 《MySQL实战45讲》学习笔记

    MySQL实战45讲 学习笔记 文章目录 MySQL实战45讲 学习笔记 01 基础架构 一条SQL查询语句是如何执行的 02 日志系统 一条SQL更新语句是如何执行的 更新语句的执行流程 重要的日志模块 redo log 重要的日志模块
  • python内置函数

    python内置函数 一 序列处理函数 1 map函数 对序列每个元素执行同一个函数 m map lambda x x 1 1 2 3 4 5 对序列每个数值 print type m
  • STM32相关手册使用记录

    目录 一 概述 二 手册获取 2 1 芯片手册 2 2 库手册和官方DEMO 三 手册内容 3 1 数据手册 3 1 1 查看外设挂载哪条总线 3 2 参考手册 3 2 1 查看芯片flash页大小 最小存储单位 3 2 2 STM32G0
  • python中right是什么意思_Python turtle.right方法代码示例

    本文整理汇总了Python中turtle right方法的典型用法代码示例 如果您正苦于以下问题 Python turtle right方法的具体用法 Python turtle right怎么用 Python turtle right使用
  • Python绘图:使用subplots函数在matplotlib中创建子图并添加主标题

    Python绘图 使用subplots函数在matplotlib中创建子图并添加主标题 在数据可视化过程中 有时需要将多个图形并排展示以比较和分析数据 在Python的matplotlib库中 可以使用subplots函数创建包含多个子图的
  • 【定位导航算法】粒子滤波基础认识

    粒子滤波基础认识 粒子滤波粒子核心思想 粒子滤波步骤 粒子滤波的优缺点 粒子滤波常用方法 马尔科夫模型 粒子滤波粒子核心思想 基于贝叶斯概率 随机采样 重要采样进行估算 关键 重要性密度函数的选择 粒子滤波步骤 根据初始化状态变量 gt 生
  • 判断主机操作系统的三种方法

    方法1 14分 通过更改URL大小写判断 服务器是linux还是winds 方法2 15分 可以通过TTL判断操作系统是linux还是windows https blog csdn net woshiwumingshi1 article d
  • Reference to '*****' is ambiguous;之类的问题解决

    造成这个问题的原因是 在一个以上的命名空间内被定义 使得有多个 同时满足 系统不知具体使用哪一个 如boost和std中都定义了function函数类型模板 如果在程序开头 同时使用using namespace std 和 using n
  • C++逐行解析Txt文本文件,并将相应的字符串转换为double等类型

    直接上代码 ReadTxt cpp 此文件包含 main 函数 程序执行将在此处开始并结束 include
  • 正则表达式匹配IPv4,IPv6

    简单学习了一下正则表达式 感觉IPv4 IPv6匹配挺实用的 记录一下 IPv4 25 0 5 2 0 4 d 1 d 2 1 9 d 3 25 0 5 2 0 4 d 1 d 2 1 9 d String IPv4Regex 25 0 5
  • 函数调用栈——初探!

    好些日子以前 我接触了Java 当时碰到一个问题 方法调用栈 当时不太明白 直到前段时间学了 数据结构 中的 栈 才略微的明白了一些 先将这个曾经不懂的地方总结一下 首先 必须对 栈 这种结构的特性有所了解 栈的特性 后进先出 在程序中 调
  • 万字超详细解析!Spring之基于注解的声明式事务

    14 1 概述 14 1 1 编程式事务 事务功能的相关操作全部通过自己编写代码来实现 Connection conn try 开启事务 关闭事务的自动提交 conn setAutoCommit false 核心操作 提交事务 conn c
  • iOS 16适配

    IDE环境相关升级 Xcode 14 0 macOS 12 4 Xcode 14 Beta 3 传送门 https developer apple com services account download path Developer T
  • Elasticsearch新手入门教程(已经是最简洁版)

    1 配置JDK环境 建议1 7以上 2 官网下载ES https www elastic co cn 3 解压启动 用dos命令进入压缩包里面 这里可修改端口 补充 插件使用 这里使用的elasticsearch head master 插
  • win10+wsl2+ubuntu+zsh+Powerlevel10k+nerd fonts

    wsl2 是适用于 linux 的 windows 子系统的新版本 是相对于 wsl1 的升级 简单理解就是 wsl2 是可以在 windows 下进行 linux 开发 在我开来 wsl2 和虚拟机没什么区别 wsl2 就是一个交互性优化
  • 信息收集----谷歌语句

    信息收集的方式可以分为两种 主动和被动 主动的信息收集方式 通过直接访问 扫描网站 这种将流量流经网站的行为 被动的信息收集方式 利用第三方的服务对目标进行访问了解 比如 Google搜索 通过搜索引擎 有时会给我们带来意想不到的效果 下面
  • thinkphp5 切换多语言

    请求时候 1 header中增加 Accept Language 语言 2 在请求地址中增加 lang 语言参数
  • python--unittest单元测试框架

    1 简介 unittest单元测试框架是受到 JUnit JAVA 的启发 与其他语言中的主流单元测试框架有着相似的风格 其支持测试自动化 配置共享代码测试 支持将测试样例聚合到测试集中 并将测试与报告框架独立 2 构成 静态类图 2 1