【unittest】unittest基础01
一、什么是unittest
unittest是Python单元测试框架,类似于JUnit框架。
unittest中有4个重要的概念:test fixture、 test case、 test suite,、test runner
Testcase:一个TestCase的实例就是一个测试用例(包括测试前准备环境的搭建(setUp),执行测试代码 (run),以及测试后环境的还原(tearDown)。
Test suite:多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
Test runner:其中的run(test)会执行TestSuite/TestCase中的run(result)方法。
Test fixture:对一个测试用例环境的搭建和销毁,是一个fixture,通过覆盖 TestCase的setUp()和tearDown()方法来实现
TestLoader:是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。
二、简单用法
unittest是python自带的一个单元测试框架,类似于java的junit,基本结构是类似的。基本用法如下:
1 2 3 4 5 6 7 8 9 10 11 | 1. 用 import unittest导入unittest模块 2. 定义一个继承自unittest.TestCase的测试用例类,如 class xxx(unittest.TestCase): 3. 定义setUp和tearDown,这两个方法与junit相同,即如果定义了则会在每个测试case执行前先执行setUp方法,执行完毕后执行tearDown方法。 4. 定义测试用例,名字以test开头,unittest会自动将test开头的方法放入测试用例集中。 5. 一个测试用例应该只测试一个方面,测试目的和测试内容应很明确。主要是调用assertEqual、assertRaises等断言方法判断程序执行结果和预期值是否相符。 6. 调用unittest.main()启动测试 |
三、unittest模块的常用方法
1 2 3 4 5 6 7 | assertEqual(a, b) a = = b assertNotEqual(a, b) a ! = b assertTrue(x) bool (x) is True assertFalse(x) bool (x) is False |
实例展示01:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import unittest class TestSample(unittest.TestCase): #类共享的fixture,在整个测试类开头执行一次 @classmethod def setUpClass( cls ): print ( '整个测试类只执行一次 --start' ) #测试用例fixture def setUp( self ): print ( '每给测试开始前执行一次' ) #测试用例默认以test开头 def test_equal( self ): self .assertEqual( 1 , 1 ) def test_not_equal( self ): self .assertNotEqual( 1 , 0 ) #测试用例fixture def tearDown( self ): print ( '每个测试结束后执行一次' ) #整个测试列结束执行一次 @classmethod def tearDownClass( cls ): print ( '整个测试类只执行一次 --End' ) if __name__ = = '__main__' : unittest.main() |
实战参考代码:
新建lagouTest项目:
itesting_test代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import unittest class ITestingTest(unittest.TestCase): @classmethod def setUpClass( cls ) - > None : print ( "整个测试类支持一次 --start" ) def setUp( self ) - > None : print ( '整个测试开始前执行一次' ) # 测试用例默认以test开头 def test_equal( self ): self .assertEqual( 1 , 1 ) def test_not_equal( self ): self .assertNotEqual( 1 , 0 ) # 测试用例fixture def tearDown( self ): print ( '每个测试结束后执行一次' ) # 整个测试列结束执行一次 @classmethod def tearDownClass( cls ): print ( '整个测试类只执行一次 --End' ) |
test_to_run代码参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import unittest class TestToRun(unittest.TestCase): def setUp( self ) - > None : #setUp()方法,通常打开浏览器,初始化API请求或者准备测试数据 pass def testAssertNotEqual( self ): #这里具体的测试方法,此处只是演示 self .assertEqual( 1 , 2 ) def testAssertEqual( self ): self .assertEqual( 1 , 1 ) def tearDown( self ) - > None : #定义测试后的清理动作 pass |
main.py文件:
解析tests文件夹,手动查找并加载测试用例到测试套件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | import os import unittest import importlib.util #解析tests文件夹并且返回module的字符列表 def get_module_name_string(file_dir): return_list = [] for root,dirs, file in os.walk(file_dir): #root 所指的是当前正在遍历的这个文件夹的本身的地址 #dirs 是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录) #file 同样是 list , 内容是该文件夹中所有的文件(不包括子目录) for i in file : if not (i.endswith( '__init__.py' ) or i.endswith( '.pyc' )) and i.startswith( 'test' ): f = os.path.join(root,i) mod = 'tests.' + f.split( '\\tests\\')[1].replace(' .py ',' ') return_list.append(mod) return return_list if __name__ = = '__main__' : #定义suite测试套件 suites = unittest.TestSuite() #使用package.mod方式获取所有模块的string #os.path.join(os.path.dirname(__file__) 获取当前目录 mod_sting_list = get_module_name_string(os.path.join(os.path.dirname(__file__), 'tests' )) print (mod_sting_list) #遍历每一个mod string 先导入再把他加入测试用例 for mod_string in mod_sting_list: print (mod_string) #m为对应的test用例文件目录 m = importlib.import_module(mod_string) #测试加载器TestLoader test_case = unittest.TestLoader().loadTestsFromModule(m) #添加测试用例到测试套件 suites.addTest(test_case) #runner测试运行器,指定runner为TextTestRunner runner = unittest.TextTestRunner(verbosity = 2 ) #运行suite runner.run(suites) |
动态加载文件
1 2 3 4 5 6 7 8 9 | if __name__ = = '__main__' : #动态查找测试用例文件 loader = unittest.defaultTestLoader #生成测试suite #os.path.join(os.path.dirname(__file__) 起始文件位置,top_level_dir必须指定 suite = loader.discover(os.path.join(os.path.dirname(__file__), 'tests' ),pattern = 'test*.py' ,top_level_dir = None ) #runner测试运行器,指定runner为TextTestRunner runner = unittest.TextTestRunner(verbosity = 2 ) runner.run(suite) |
执行结果展示(两种方式结果一样):
本文来自博客园,作者:橘子偏爱橙子,转载请注明原文链接:https://www.cnblogs.com/xfbk/p/15962388.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人