【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.用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模块的常用方法
assertEqual(a, b) a == b assertNotEqual(a, b) a != b assertTrue(x) bool(x) is True assertFalse(x) bool(x) is False
实例展示01:
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代码:
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代码参考:
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文件夹,手动查找并加载测试用例到测试套件
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)
动态加载文件
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