Python unittest 模块

news/2024/11/7 22:50:30/

一、Unittest 的几个基本概念

  • TestCase :要写的具体的测试用例
  • TestSuite: 多个测试用例集合(或测试套件/测试集)
  • TestLoader:用来加载 TestCase 到 TestSuite中的(更通俗一点,就是用来把符合我们定义的条件的测试用例组合起来,成为一个测试集),一般会以参数的形式传进去一些条件
  • TestRunner:是来执行测试用例的,测试的结果会保存到 TestResult 实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息

二、简单小示例

import unittestclass MyTest(unittest.TestCase):@classmethoddef setUpClass(self):"""测试用例执行之前执行"""print("UnitTest Begin...")@classmethoddef tearDownClass(self):"""测试用例执行之后执行"""print("UnitTest End...")def setUp(self):print("Begin...")def tearDown(self):print("End...")def test_1(self):self.assertEqual(1, 1)def test_2(self):self.assertEqual(1, 2)if __name__ == '__main__':unittest.main()

运行结果:

UnitTest Begin...Begin...
End...
Begin...
End...Ran 2 tests in 0.009sFAILED (failures=1)Failure
Traceback (most recent call last):File "C:\Users\hj\Anaconda3\Lib\unittest\case.py", line 59, in testPartExecutoryieldFile "C:\Users\hj\Anaconda3\Lib\unittest\case.py", line 605, in runtestMethod()File "E:\Python_virtualenvs\for_django\Projects\测试模块\1、小示例.py", line 23, in test_2self.assertEqual(1, 2)File "C:\Users\hj\Anaconda3\Lib\unittest\case.py", line 829, in assertEqualassertion_func(first, second, msg=msg)File "C:\Users\hj\Anaconda3\Lib\unittest\case.py", line 822, in _baseAssertEqualraise self.failureException(msg)
AssertionError: 1 != 2

测试发现有一个错误:1 != 2

参数说明

  • setUp()tearDown():测试用例执行之前和执行之后执行,一般用来做测试准备工作,如:连接(关闭)数据库、Web 登录等
  • 类方法 @classmethod:类在未实例化之前调用类方法将会报错:TypeError: setUpClass() missing 1 required positional argument: 'self'
  • test_1()test_2():具体的测试用例,函数名一般以 test 开头(更为规范)
  • self.assertEqual():断言方法,用于判断测试用例是否能通过

三、常用断言方法

断言方法返回值为布尔值,如果指定msg参数的值,则将该信息作为失败的错误信息返回:

断言方法断言描述断言方法
assertEqual(arg1, arg2, msg=None)验证 arg1 = arg2assertNotEqual(arg1, agr2, msg=None)验证 arg1 != arg2
assertTrue(expr, msg=None)验证 expr 表达式为 TrueassertFalse(expr, msg=None)验证 expr 为 False
assertIs(arg1, arg2, msg=None)验证 arg1 与 arg2 是同一对象assertIsNot(arg1, arg2, msg=None)验证 arg1 和 arg2 不是同一对象
assertIn(arg1, arg2, msg=None)验证 arg1 是 arg2 的子串assertNotIn(arg1, arg2, msg=None)验证 arg1 不是 arg2 的子串
assertIsInstance(obj, cls, msg=None)验证 obj 是 cls 的实例assertNotIsInstance(arg1, arg2, msg=None)验证 obj 不是 cls 的实例

如果程序要对异常、错误、警告和日志进行断言判断,TestCase 提供了如下所示的断言方法:

断言方法检查条件
assertRaises(exc, fun, *args, **kwds)fun(*args, **kwds) 引发 exc 异常
assertRaisesRegex(exc, r, fun, *args, **kwds)fun(*args, **kwds) 引发 exc 异常,且异常信息匹配 r 正则表达式
assertWarns(warn, fun, *args, **kwds)fun(*args, **kwds) 引发 warn 警告
assertWamsRegex(warn, r, fun, *args, **kwds)fun(*args, **kwds) 引发 warn 警告,且警告信息匹配 r 正则表达式
assertLogs(logger, level)With 语句块使用日志器生成 level 级别的日志

示例:

def func(a, b):"""一元一次方程"""if a == 0:raise ValueError('a 参数错误,不能为 0')else:return b // a
import unittestclass Test(unittest.TestCase):def test_fuc(self):self.assertEqual(func(2, 6), 3)# 检查 a = 0 时会不会引发 ValueErrorwith self.assertRaises( ):func(0, 9)

特定检查的断言方法:

断言方法检查条件
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)not r.search(s)
assertCountEqual(a, b)a、b 两个序列包含的元素相同,不管元素出现的顺序如何

当测试用例使用 assertEqual() 判断两个对象是否相等时,如果被判断的类型是字符串、序列、列表、元组、集合、字典,则程序会自动改为使用如下的断言方法进行判断。换而言之,下表断言方法其实没有必要使用,unittest 模块会自动应用它们:

断言方法用于比较的类型
assertMultiLineEqual(a, b)字符串(string)
assertSequenceEqual(a, b)序列(sequence)
assertListEqual(a, b)列表(list)
assertTupleEqual(a, b)元组(tuple)
assertSetEqual(a, b)集合(set 或 frozenset)
assertDictEqual(a, b)字典(dict)

运行测试的两种方法

1、调用 unittest.main() 来运行当前源文件中的所有测试用例

if __name__ == '__main__':unittest.main()

2、使用 unittest 模块运行测试用例

python -m unittest 测试文件

测试结果说明:


Ran 1 test in 0.002sOK
  • .:代表测试通过。
  • F:代表测试失败,F 代表 failure。
  • E:代表测试出错,E 代表 error。
  • s:代表跳过该测试,s 代表 skip。

四、常见测试写法

方法一

搜索该模块下所有以 test 开头的测试用例方法,并自动执行它们:

import unittestclass Test(unittest.TestCase):def setUp(self):self.num = input('请输入一个数字:')self.num = int(self.num)print('测试开始')def test_case1(self):print(self.num)self.assertEqual(self.num, 10, msg='你输入的不是 10')def test_case2(self):print(self.num)self.assertEqual(self.num + 10, 20, msg='你输入的不是 20')@unittest.skip('暂时跳过用例3的测试')def test_case3(self):print(self.num)self.assertNotEqual(self.num, 30, msg='你输入的不是 30')def tearDown(self):print('测试结束')if __name__ == '__main__':unittest.main()

五、TestSuite测试包及用法

测试包(TestSuite)可以组织多个测试用例,组建好测试包后再用测试运行器(TestRunner)来运行该测试包所包含的所有测试用例。

下面来组建一个测试包,包含两个测试用例:

1、s1.py

def func(a, b):"""一元一次方程"""if a == 0:raise ValueError('a 参数错误,不能为 0')else:return b // a

2、t1.py

import unittest
from s1 import *class Test(unittest.TestCase):def test_fuc(self):self.assertEqual(func(2, 6), 3)with self.assertRaises(ValueError):func(0, 9)

3、s2.py

def say_hello():return 'Hello'

4、t2.py

import unittest
from s2 import *class TestHello(unittest.TestCase):def test_say_hello(self):self.assertEqual(say_hello(), 'Hello')

我们将在 t3.py 中组建一个测试包,同时测试 t1、t2:

# t3.py
import unittest
from t1 import Test
from t2 import TestHellotest_case = (Test, TestHello)
def build_suite():# 创建测试加载器loader = unittest.TestLoader()# 创建测试包suite = unittest.TestSuite()# 遍历所有测试类for test_class in test_case:# 从测试类中加载测试用例tests = loader.loadTestsFromTestCase(test_class)# 将测试用例添加到测验包中suite.addTests(tests)return suiteif __name__ == '__main__':# 创建测试运行器 (TestRunner)	runner = unittest.TextTestRunner(verbosity=2)		# verbosity=2 测试结果显示详细信息runner.run(build_suite())

运行结果如下:

test_fuc (t1.Test) ... ok
test_say_hello (t2.TestHello) ... ok----------------------------------------------------------------------
Ran 2 tests in 0.001sOK

如果希望直接生成文件格式的测试报告,可 指定 TextTestRunner 对象的 stream 属性:

if __name__ == '__main__':with open('abc.txt', 'a') as f:# 创建测试运行器(TestRunner),将测试报告输出到文件中runner = unittest.TextTestRunner(verbosity=2, stream=f)runner.run(build_suite())

http://www.ppmy.cn/news/31654.html

相关文章

Linux进程学习【进程地址】

✨个人主页&#xff1a; Yohifo &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f38a;每篇一句&#xff1a; 图片来源 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 Perseverance is not a long race; it is many short races one after another…

COLMAP

简介&#xff1a;在使用instant-ngp过程中需要使用COLMAP得到模型的必要输入&#xff0c;比如模型需要的相机外参我们就可以通过COLMAP中的sparse reconstruction稀疏重建得到&#xff1b;而对于depth map深度图我们则需要dense reconstruction稠密重建得到&#xff0c;下面我们…

2023-3-8 刷题情况

礼盒的最大甜蜜度 题目描述 给你一个正整数数组 price &#xff0c;其中 price[i] 表示第 i 类糖果的价格&#xff0c;另给你一个正整数 k 。 商店组合 k 类 不同 糖果打包成礼盒出售。礼盒的 甜蜜度 是礼盒中任意两种糖果 价格 绝对差的最小值。 返回礼盒的 最大 甜蜜度。…

【改机教程】iOS系统去除小黑条,改拍照声、拨号音、键盘音,不用越狱,支持所有机型

大家好&#xff0c;上次给大家分享了几个iOS系统免越狱改机教程 今天带来最新的教程&#xff0c;这次修改利用的是同一个漏洞&#xff0c;由外网大神 tamago 开发&#xff0c;国内大神冷风 进行汉化和优化 可以修改的地方包括 去除底部小黑条 dock栏透明 桌面文件夹透明 桌面…

在空投之后,Blur能否颠覆OpenSea的主导地位?

Mar. 2023, Daniel数据源&#xff1a; NFT Aggregators Overview & Aggregator Statistics Overview & Blur Airdrop一年前&#xff0c;通过聚合器进行的NFT交易量开始像滚雪球一样增长&#xff0c;有时甚至超过了直接通过市场平台的交易量。虽然聚合器的使用量从10月到…

华为OD机试题 - 打印文件(JavaScript)| 机考必刷

更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:打印文件题目输入输出示例一输入输出示例二输入输出Code代码解析…

双馈风力发电机-900V直流混合储能并网系统MATLAB仿真

MATLAB2016b主体模型&#xff1a;双馈感应风机模块、采用真实风速数据。混合储能模块、逆变器模块、转子过电流保护模块、整流器控制模块、逆变器控制模块。直流母线电压&#xff1a;有功、无功输出&#xff08;此处忘记乘负一信号输出&#xff09;&#xff0c;所以是负的。蓄电…

计算机图形学09:二维观察之点的裁剪

作者&#xff1a;非妃是公主 专栏&#xff1a;《计算机图形学》 博客地址&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、二维观察基本…