unittest详解
前言
unittest原名为PyUnit,是由java的JUnit衍生而来。unittest是python内置的单元测试框架,具备编写用例、组织用例、执行用例、输出报告等自动化框架的条件。unittest作为官方的测试框架,在测试方面非常基础,可以在此基础上进行二次开发。
unittest工作原理
unittest结构图:
- test case :一个完整的测试单元,执行该测试单元可以完成对某一个问题的验证,完整体现在:测试前环境准备(setUp),执行测试代码(run),及测试后环境还原(tearDown);
- test suite :多个测试用例的集合,测试套件或测试计划;
- testLoader :加载TestCase到TestSuite中的,其中loadTestsFrom__()方法用于寻找TestCase,并创建它们的实例,然后添加到TestSuite中,返回TestSuite实例;
- test runner :执行测试用例,并将测试结果保存到TextTestResult实例中,包括运行了多少测试用例, 成功了多少,失败了多少等信息;
- test fixture:一个测试用例的初始化准备及环境还原,主要是setUp() 和 setDown()方法;
unittest简单示例
先通过一个简单的示例,对unittest有一个直观的了解:
import unittestclass Mytest1(unittest.TestCase):def setUp(self) -> None:print("===== setUp =====")def tearDown(self) -> None:print("===== tearDown =====")@classmethoddef setUpClass(cls) -> None:print("===== setUpClass =====")@classmethoddef tearDownClass(cls) -> None:print("===== tearDownClass =====")def test_add(self):print("测试函数add")self.name = "Aaa"def test_down(self):print("测试函数down")self.name = "Bbb"# 文件内执行方式
if __name__ == "__main__":unittest.main()# 命令行执行,scratch_11.py为包含
python -m unittest scratch_11.py
执行结果:
===== setUpClass =====
===== setUp =====
测试函数add
===== tearDown =====
===== setUp =====
测试函数down
===== tearDown =====
===== tearDownClass =====
通过上面的例子,我们可以总结:
- setUpClass:整个测试开始后执行,只执行一次
- tearDownClass:整个测试完成后执行,只执行一次
- setUp:每运行一次用例前都会执行一次
- tearDown:每运行一次用例后都会执行一次
- 测试用例的命名规则为test_xxx,不以test_xxx命名的函数是方法,方法是不能被执行的
断言方法
测试中,我们会经常用到判断某个函数的返回结果是否等于某个值或者等于某个类型这种情况,非常适合使用断言来判断。在UnitTest中,TestCase 已经提供有封装好的断言方法进行断言校验。断言强调的是对于整个测试流程的结果进行判断,所以断言的内容是极为核心的。
- assertEqual(a,b) a==b 值是否相等
- aassertNotEqual(a,b) a!=b 值是否不相等
- aasserIs(a,b) a is b 值是否相同
- aassertIsNot(a,b) a is not b 值是否不同
- assertIn(a,b) a in b a是否包含b
- assertNotIn(a,b) a not in b a是否不包含b
- ssertTrue(a) bool(a) is true 是否为真
- assertFalse(a) bool(a)is false 是否为假
- assertIsNone(a) a is None 是否为空
- assertIsNotNone(a) a is None 是否不为空
- assertIsInstance(a,b) Instance(a,b) a与b的数据类型一样
- assertNotIsInstance(a) not Instance(a,b) a与b的数据类型不一样
unittest各种用法
UnitTest.skip
有时候,测试用例很多,有些需要执行,有些不想执行,那就需要跳过一些测试用例,这时候就需要用到skip,skip用法:
- 无条件跳过,unittest.skip(“xxx”)
- 条件为True跳过,unittest.skipIf(1 < 2, ‘xxx’)
- 条件为False跳过,unittest.skipUnless(1 > 2, ‘xxx’)
- 执行失败不计入case总数中,unittest.expectedFailure
示例如下:
import unittestclass Mytest1(unittest.TestCase):def setUp(self) -> None:print("===== setUp =====")def tearDown(self) -> None:print("===== tearDown =====")@classmethoddef setUpClass(cls) -> None:print("===== setUpClass =====")@classmethoddef tearDownClass(cls) -> None:print("===== tearDownClass =====")@unittest.skip("直接跳过")def test_1(self):print("test_1")@unittest.skipIf(1<2,"条件为True则跳过")def test_2(self):print("test_2")@unittest.skipUnless(1<2,"条件为False则跳过")def test_3(self):print("test_3")@unittest.expectedFailuredef test_4(self):print("test_4")self.assertEqual(4,5)if __name__ == "__main__":unittest.main()
执行结果如下,可以看到跳过了2个,对应test_1、test_2,test_3不满足条件,没有跳过,test_4执行错误,但是没有计入错误总数中:
ss.x
----------------------------------------------------------------------
Ran 4 tests in 0.000sOK (skipped=2, expected failures=1)
===== setUp =====
test_3
===== tearDown =====
===== setUp =====
test_4
===== tearDown =====
结果中ss.x代表的意思:
- . 表示通过 或者 pass
- S 表示跳过
- x 表示忽略错误
- F False, 表示断言没有通过
- E Error, 表示程序内部发生了错误
unittest.TestSuite
上面的TestCase例子中,4个测试方法的执行顺序是按照1 2 3 4的顺序,如果我们想自定义执行顺序怎么办,比如2可能依赖于1,在unittest中解决用例执行顺序的问题是使用TestSuite,测试套件TestSuite的作用:
- 用于给测试用例进行排序
- 管理测试用例
先看一个简单的示例:
from unittest import TestSuitesuite = TestSuite()# 添加单个测试用例
suite.addTest(Mytest1("test_3"))
suite.addTest(Mytest1("test_1"))
suite.addTest(Mytest1("test_2"))# 添加多个测试用例
cases = [Mytest1('test_3'), Mytest1('test_1'), Mytest1('test_2')]
suite.addTests(cases)# 执行测试,unittest.TextTestRunner功能相当于unittest.main
runner = unittest.TextTestRunner()
runner.run(suite)
生成html格式测试报告
有时候我们需要更好的结果展示方式,可以使用HtmlTestRunner模块生成html格式的报告,安装后导入该模块,使用HTMLTestRunner代替默认的TextTestRunner()执行测试用例即可。
pip install html-testRunner
安装HtmlTestRunner模块。
示例如下:
from unittest import TestSuite
from HtmlTestRunner import HTMLTestRunnerclass Mytest1(unittest.TestCase):def test_1(self):print("test_1")def test_2(self):print("test_2")def test_3(self):print("test_3")def test_4(self):print("test_4")if __name__ == "__main__":# 创建一个测试套件 suitesuite = TestSuite()# 添加单个测试用例suite.addTest(Mytest1("test_3"))suite.addTest(Mytest1("test_1"))suite.addTest(Mytest1("test_2"))# 执行测试并输出html报告,output输出到xx目录下runner = HTMLTestRunner(output="result")runner.run(suite)
然后就可以在对应目录下查看执行的结果了:
ddt模块
有时我们需要对大量的数据进行同一种逻辑函数测试,这时候可以用到ddt模块。
ddt,是一种 数据驱动测试 思想,数据和用例进行分离,通过外部数据去生成测试用例,可以快速的对大量数据和不同情况进行测试。
首先我们需要在python中安装ddt模块:pip install ddt
。
数据引入的方式主要有以下几种:
- 通过@data装饰器的方式
- json文件
- yaml文件
- 其他
使用方法
照常先使用一个简单示例来演示:
使用data装饰器
import unittest
from ddt import ddt, data, unpack# 先定义@ddt,用于表示要使用ddt了
@ddt
class Mytest1(unittest.TestCase):# data用于设定参数@data("a", "b", "c")def test_1(self, text):self.assertEqual("a", text)if __name__ == "__main__":unittest.main()
使用json文件
先编写一个json文件:
[{"name": "test","age": 18},{"name": "test1","age": 20}
]
编写测试代码:
import unittest
from ddt import ddt, file_data@ddt
class Mytest1(unittest.TestCase):@file_data("/Users/tangliqi/Desktop/个人文档/json文件/test.json")def test_1(self, **text):print(text)print(type(text))if __name__ == "__main__":unittest.main()
输出结果:
{'name': 'test', 'age': 18}
<class 'dict'>
{'name': 'test1', 'age': 20}
<class 'dict'>
使用yaml文件
编写一个yaml文件:
# "-"表示一个列表-name: 'test1'age: 18-name: 'test2'age: 20
编写测试代码:
import unittest
from ddt import ddt, file_data@ddt
class Mytest1(unittest.TestCase):@file_data("/Users/tangliqi/Desktop/个人文档/json文件/test.yaml")def test_1(self, **text):print(text)print(type(text))if __name__ == "__main__":unittest.main()
执行结果:
{'name': 'test1', 'age': 18}
<class 'dict'>
{'name': 'test2', 'age': 20}
<class 'dict'>
unittest详解相关推荐
- python单元测试框架Unittest详解
前言 我们今天来聊聊Python中的单元测试框架unittest,大家都知道在Python中比较热门的测试框架除了pytest就是unittest,我之前有讲过pytest所以今天想讲unittest ...
- Python单元测试框架 unittest详解
一 整体结构概览 unittest原名为PyUnit,是由java的JUnit衍生而来.对于单元测试,需要设置预先条件,对比预期结果和实际结果. TestCase :通过继承TestCase类,我们可 ...
- python语言入门详解-Python unittest详解一(基础入门)
unittest单元测试框架最初受JUnit启发,与其他语言的主要单元测试框架具有相似的风格. 它支持测试自动化,支持开启或关闭某个测试,支持结合测试.另外它可以生成各个单元测试的报告.为了实现以上功 ...
- python测试框架untest_Python单元测试框架 unittest详解
以上是函数的测试,类的测试与函数的测试及其相似 1 import unittest2 3 #-*-coding:utf-8-*- 4 classAnonymousSurvey():5 "&q ...
- python 参数拼接token_对python的unittest架构公共参数token提取方法详解
额...每个请求都有token值的传入,但是token非常易变,一旦变化,所有的接口用例都得改一遍token,工作量太大了... 那么有没有一种方法能把token提取出来,作为一个全局变量,作为一个参 ...
- python gpu加速库比matlab快吗_Python之Unittest和Requests库详解
1.按类来执行 import unittest class f1(unittest.TestCase): def setUp(self): pass def tearDown(self): pass ...
- unittest之TestSuite类详解
TestSuite 测试套件类,如何理解测试套件这个概念呢,从它的类定义来看,可以理解为:多个独立的测试用例(test case)或者多个独立的测试套件(test suite,可以理解为子套件)可以构 ...
- python测试之道进阶,Pytest-Mock 进阶用法详解
一.什么是 Mock 测试? Mock测试就是在 测试过程 中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是Mock对象.Mock对象就是真实对 ...
- [crypto]-02-非对称加解密RSA原理概念详解
说明:本文使用的数据来自网络,重复的太多了,也不知道哪篇是原创. 算法原理介绍 step 说明 描述 备注 1 找出质数 P .Q - 2 计算公共模数 N = P * Q - 3 欧拉函数 φ(N) ...
最新文章
- 窗口子类化-实例应用
- 5月26 留言板练习题
- X11: Linux跨网络运行XWindow程序
- php stortime,文件存储 | 综合话题 | Laravel 5.3 中文文档
- 大规模部署桌面虚拟化时的问题
- 题解: 区间合并(opj 2-4-7620)
- java visualvm远程监控_如何监控和诊断堆外内存使用
- 美国重金投资3D芯片项目!MIT+美独资公司攻关,旨在继续领先中国
- Oracle 10g 完全卸载
- HTTP缓存ETAG和Last-Modified
- 【原创】关于数字万用表的知识-2021-02-15
- 易支付v5.8个人二维码免签系统破解版
- [QCTF2018]Xman-RSA
- TRIZ系列-创新原理-18-机械振动原理
- 开发一款APP需要阿里云服务器多大配置
- Android studio: The number of method references in a .dex file cannot exceed 64K. Learn how to resol
- Android 沉浸式(透明)状态栏细研-超级细还附 Demo
- 华大芯片入坑系列-1
- 2022年iFLYTEKA.I.开发者大赛疫情微博情绪识别挑战赛
- python教材知乎_关于 Python 的经典入门书籍有哪些?
热门文章
- 秒懂算法 | 搜索基础
- 店盈通:拼多多要怎么做才可以快速获取自然流量?
- react 前端 实现打印机打印功能
- Lattice FPGA ecp5u mico32软核使用
- 在无法进行微信应用的调试和无法使用微信的web开发工具的时候我们怎么才能调试...
- 编写程序计算长方体的体积python_编写程序,计算圆柱体、球体、正方体和长方体的表面积和体积...
- 图说微积分(四)三角函数
- DSPack各种使用方法
- 用vue3实现根据出生年月计算年龄
- 如何选择IIOT数据采集解决方案:公有或私有?