2022-02-21 15:03:20


unittest --- 单元测试框架 — Python 3.9.10 文档

可以自由选择版本文档查看

一、unittest概念

unittest是Python单元测试框架,类似于JUnit框架。

unittest中有4个重要的概念:test fixture, test case, test suite, test runner

  1. Testcase:一个TestCase的实例就是一个测试用例,也就是测试类,且执行顺序会按照方法名的ASCII值排序。
  2. Test suite:多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
  3. Test runner:是来执行测试用例集合的(testsuit),其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
  4. TestLoader:是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
  5. Test fixture:对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖 TestCase的setUp()和tearDown()方法来实现。

使用unittest编写python的单元测试代码,包括如下几个步骤:

1、定义测试类,编写一个python类,继承 unittest模块的TestCase类。unittest对测试类和测试文件的名称没有要求

2、定义测试方法,需要在测试类中定义测试方法,方法名要求以 test 开头,只有一个self参数。

3、执行 unittest.main() ,该函数会执行的功能,先实例化所有测试类,收集并运行其中所有测试方法。

class MyTest(unittest.TestCase):

    def test_bbb(self):
assert True @unittest.skip
def test_ddd(self):
passclass AAA(unittest.TestCase):
def test_zzz(self):
pass if __name__ == '__main__':
loader=unittest.TestLoader()
suit=unittest.TestSuite()
suit.addTest(loader.discover(os.path.abspath('.')))
# suit.addTests([MyTest('test_aaa'), MyTest('test_bbb'), MyTest('test_ccc')])
runner=unittest.TextTestRunner()
print(runner.run(suit))
unittest.main()

unittest的断言方法

方法 检查
assertEqual(a, b,msg=None) a ==b
assertNotEqual(a, b) a !=b
assertTrue(x) bool(x) is True
assertFalse(x) Bool(x) is False
assertIs(a, b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a,b)
assertNotIsInstance(a, b) not isinstance(a,b)

二、用例收集及执行过程函数

1、unittest.TestSuite():生成套件,并通过套件对象调用方法加载用例

生成套件对象suite

suite=unittest.TestSuite()

加载指定用例套件中

    suit.addTests([ BBB('test_bbb'), BBB('test_ddd')])
suit.addTest(AAA('test_zzz')) runner = unittest.TextTestRunner()
runner.run(suit)

加载TestLoader的对象查找到的用例

suit=unittest.TestSuite()  suit.addTest(loader.discover(os.path.abspath('.'),pattern='unit*.py'))

runner = unittest.TextTestRunner()
runner.run(suit)

2、unittest.TestLoader():查找用例并实例化用例

生成加载对象loader

loader=unittest.TestLoader()

loadTestsFromTestCase(self, testCaseClass):加载指定测试类的所有用例

AAA是测试类
case=loader.loadTestsFromTestCase(AAA) runner=unittest.TextTestRunner()
runner.run(case)

loadTestsFromModule(self, module, *args, pattern=None, **kws):加载指定测试文件的所有用例

unit.py文件是测试模块
case=loader.loadTestsFromModule(unit) runner=unittest.TextTestRunner()
runner.run(case)

loadTestsFromName(self, name, module=None):加载模块中指定名字的测试类或者测试方法,模块是必须的,name参数传str

test_zzz是测试方法,以下两种方式
# case=loader.loadTestsFromName('unit.AAA.test_zzz')
case=loader.loadTestsFromName('AAA',module=unit) runner=unittest.TextTestRunner()
runner.run(case)

loadTestsFromNames(self, name, module=None):加载模块中指定名字的测试类或者测试方法,模块是必须的,name参数传list

case=loader.loadTestsFromNames(['unit.AAA.test_zzz','unit.BBB.test_ddd'])
# case=loader.loadTestsFromNames(['AAA','BBB.test_bbb'],module=unit) runner=unittest.TextTestRunner()
runner.run(case)

discover(self, start_dir, pattern='test*.py', top_level_dir=None):加载指定路径下的所有用例

start_dir:查找用例的启动目录

pattern:匹配测试文件的表达式

top_level_dir:测试模块的顶级目录

loader=unittest.TestLoader()
case=loader.discover(os.path.abspath('.'),pattern='unit*.py') runner=unittest.TextTestRunner()
runner.run(case)

3、unittest.TextTestRunner():创建运行器

runner=unittest.TextTestRunner()
runner.run(case)

三、命令行

usage: python.exe -m unittest [-h] [-v] [-q] [--locals] [-f] [-c] [-b] [-k TESTNAMEPATTERNS] [tests ...]

positional arguments:
tests a list of any number of test modules, classes and test methods. optional arguments:
-h, --help 帮助
-v, --verbose 详细输出
-q, --quiet 静默输出
--locals 报错回溯中展示变量
-f, --failfast 遇到失败就停止程序执行
-c, --catch 可以允许crtl+c停止执行后输出已执行用例的报告,按下后会等待一会儿生成报告
-b, --buffer Buffer stdout and stderr during tests
-k TESTNAMEPATTERNS 仅运行匹配字符串的用例,注意大小写敏感
  discover
-s START, --start-directory START discover -s '.'默认从当前目录下启动查找用例-p PATTERN, --pattern PATTERN discover -p ’test*.py‘ 发现匹配的文件,默认匹配test开头的测试用例文件-t TOP, --top-level-directory TOP 最顶级目录,默认当前目录 Examples:
python.exe -m unittest test_module - 运行测试文件
python.exe -m unittest module.TestClass - 运行文件中的测试类
python.exe -m unittest module.Class.test_method - 运行指定的测试方法
python.exe -m unittest path/to/test_file.py - 运行指定路径的模块 usage: python.exe -m unittest discover [-h] [-v] [-q] [--locals] [-f] [-c] [-b] [-k TESTNAMEPATTERNS] [-s START]
[-p PATTERN] [-t TOP]

四、函数

1、前后置函数

测试类前后置方法注意要加类方法装饰器

class BBB(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print('测试类的前置') def setUp(self) -> None:
print('测试方法的前置') def tearDown(self) -> None:
print('测试方法的后置') @classmethod
def tearDownClass(cls) -> None:
print('测试类的后置')

2、跳过和期望失败

跳过测试类也是一样的写法

class BBB(unittest.TestCase):

    @unittest.expectedFailure
def test_aaa(self):
raise AssertionError @unittest.skip(reason='无条件跳过')
def test_bbb(self):
print('测试 bbb')
assert True def test_ccc(self):
     if True:
  self.skipTest("无条件跳过") @unittest.skipIf(condition=True,reason='条件为True跳过')
def test_ddd(self):
print('测试 ddd') @unittest.skipUnless(condition=False,reason='条件为False跳过')
def test_eee(self):
pass

3、子测试迭代subTest()

class BBB(unittest.TestCase):

    def test_eee(self):
for i in range(4):
with self.subTest(param=i): #将要迭代测试的参数传给param
self.assertEqual(i%2,0)

五、第三方库ddt做数据驱动

1、装饰器data使用unpack和*号解包的区别

*号解包:将数据包解包分开为多个用例数据,迭代传入

unpack解包:将数据包解包拆分一个用例数据,分别用不同的参数名传入测试方法中

@ddt.ddt
class CCC(unittest.TestCase):
testdata=[{'a':1,'b':2},{'a':3,'b':4}] @ddt.data(testdata)
def test1(self,value):
print("第一组不解包::value=",value) @ddt.data(testdata)
@ddt.unpack
def test2(self,value1,value2):
print(f"第二组unpack解包: value1={value1} value2={value2}") @ddt.data(*testdata)
def test3(self, value):
print(f"第三组*号解包::value={value}") @ddt.data(*testdata)
@ddt.unpack
def test4(self, a,b):
print(f"第四组*号解包::a={a} b={b}") 结果展示-------------------------------------------------- 第一组不解包:: [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}]
.第二组unpack解包: {'a': 1, 'b': 2} {'a': 3, 'b': 4}
.第三组*号解包:: {'a': 1, 'b': 2}
.第三组*号解包:: {'a': 3, 'b': 4}
.第四组*号解包::1 2
.第四组*号解包::3 4
.
----------------------------------------------------------------------
Ran 6 tests in 0.002s

2、file_data(value)文件上传数据

# data.json文件数据

[
{"a": 1,"b": 2},
{"a": 3,"b": 3}
] #data.yaml文件数据 -
a: 1
b: 2
-
a: 3
b: 4 代码示例: @ddt.ddt
class CCC(unittest.TestCase):
testdata = [{'a': 1, 'b': 2}, {'a': 3, 'b': 4}] @ddt.file_data(value=r'C:\Users\EDY\PycharmProjects\WEB_AUTO\data.json')
def test1(self, **fdata):
print("第一组json数据::value=", fdata) @ddt.file_data(value=r'C:\Users\EDY\PycharmProjects\WEB_AUTO\data.yaml')
def test2(self, **fdata):
print(f"第二组yaml数据: value1={fdata}") 结果展示------------------------------- 第一组json数据::value= {'a': 1, 'b': 2}
.第一组json数据::value= {'a': 3, 'b': 3}
.第二组yaml数据: value1={'a': 1, 'b': 2}
.第二组yaml数据: value1={'a': 3, 'b': 4}
.
----------------------------------------------------------------------
Ran 4 tests in 0.002s

六、用execl文件或者csv做关键字驱动

unittest学习总结的更多相关文章

  1. Python unittest 学习

    import unittest class UTest(unittest.TestCase): def test_upper(self): self.assertEqual('foo'.upper() ...

  2. unittest学习5-断言

    unittest提供了以下断言方式: 方法 检查 新进 assertEqual(a, b) a == b   assertNotEqual(a, b) a != b   assertTrue(x) b ...

  3. unittest学习4-跳过用例执行

    unittest支持跳过单个测试方法,甚至整个测试用例,还支持将测试用例标记为“测试失败” 基本跳过如下: import unittestimport requests,sys class MyTes ...

  4. unittest学习3-测试组件setup、teardown

    unittest的测试用例执行时都可以设置setup.teardown,用来初始化测试开始和测试结束关闭,例如: import unittest class MyTestCase(unittest.T ...

  5. unittest学习笔记

    File "C:\Program Files\Python36\lib\site-packages\selenium\webdriver\remote\errorhandler.py&quo ...

  6. unittest学习

    unittest的四大特点 TestCase:测试用例.所有的用例都是直接继承与UnitTest.TestCase类. TestFixture:测试固件.setUp和tearDown分别作为前置条件和 ...

  7. ios UnitTest 学习笔记

    一.运行第一个单元测试: 1.在Xcode 5中新建一个工程默认自带一个单元测试的文件夹,IDE自动生成了一个实现XCTestCase的.m文件,里面有一个失败测试(早期版本中实现的是SenTestC ...

  8. ios UnitTest 学习笔记1

    一.运行第一个单元测试: 1.在Xcode 5中新建一个工程默认自带一个单元测试的文件夹,IDE自动生成了一个实现XCTestCase的.m文件,里面有一个失败测试(早期版本中实现的是SenTestC ...

  9. 12.unittest的学习

    unittest学习后的总结,记录各个主要内容

  10. appium学习记录2

    unittest 学习 每执行一次 testcase 就会调用一次 setUP 与teardown 类方法只会执行一次 开始 与结束时候执行 类似反射方法 __init__ 与 __del__ set ...

随机推荐

  1. FTP客户端c代码功能实现

    现在市面上有很多免费的FTP软件:如FileZilla ,那如果想自己在代码中实现与ftp服务器的上传下载文件该如何实现那? 本质上ftp协议就是TCP基础上建立的一种协议,具体如下. FTP 概述 ...

  2. JZOJ 1077. 【GDKOI2006】防御力量

    \(\text{Solution}\) 首先这个题目描述得不清不楚 反正做法是过 \(A\) 城引一条直线,算出直线两侧点数的 \(min\) 找到最优直线,即 \(min\) 最小的 那么重点在判断 ...

  3. Vulhub 漏洞学习之:Redis

    Vulhub 漏洞学习之:Redis 1 Redis简介 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库.Redis 与其他 key - value 缓存产品 ...

  4. 3D模型在线查看工具

    3D场景工具推荐:NSDT场景编辑器. glTF Viewer 2.0是一个可以在线查看GLTF格式3D模型的,可以对模型进行显示设置.灯光设置来查看模型效果,除此之外还可以对模型进行性能分析和模型验 ...

  5. 空间数据库中ST_开头的来由

    1. 引言 在使用空间数据库(如,PostGIS)时,我们经常使用的空间函数(如,ST_Distance(geometry, geometry).ST_Area(geometry)等)都是以ST_开头 ...

  6. No.2.3

    PC端网页和移动端网页的有什么不同? PC屏幕大,网页固定版心 手机屏幕小,网页宽度多数为100% 如何在电脑里面写代码边调试移动端网页效果? 谷歌模拟器 了解屏幕尺寸概念 屏幕尺寸:指的是屏幕对角线 ...

  7. ACE下载地址

    https://download.dre.vanderbilt.edu/previous_versions/ 在某n中找了大半天愣是没人贴出来

  8. allure+junit5遇到的一些问题

    java+junit5+allure 之前引testng,还比较顺利,见上一篇博客,然后testng的注解和junit不一样,感觉junit5更好用一些,所以尝试java+junit5+allure ...

  9. centos安装Jenkins报错

    [SKIPPED] jenkins-2.249.3-1.1.noarch.rpm: Already downloaded warning: /var/cache/dnf/jenkins-0919f06 ...

  10. netmiko批量操作网络设备_pandas版

    from concurrent.futures import ThreadPoolExecutor import netmiko import os from threading import Loc ...