unittest工作原理
unittest中最核心的四部分是:TestCase,TestSuite,TestRunner,TestFixture
(1)一个TestCase的实例就是一个测试用例。测试用例就是指一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。单元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。
(2)而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。
(3)TestLoader是用来加载TestCase到TestSuite中的。
(4)TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法
(5)测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。
综上,整个流程就是首先要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。
用例编写
- 新建一个test_开头(必须)的.py文件,如
test_user_login.py
- 导入unittest
- 编写一个Test开头(必须)的类,并继承unittest.TestCase,做为测试类
- 在类中编写一个test_开头(必须)的方法,作为用例
用例断言
unittest提供了丰富的断言方法,常用为以下几种:
判断相等
assertEqual(a,b)/assertNotEqual(a,b): 断言值是否相等
assertIs(a,b)/assertIsNot(a,b): 断言是否同一对象(内存地址一样)
assertListEqual(list1, list2)/assertItemNotEqual(list1, list2): 断言列表是否相等
assertDictEqual(dict1, dict2)/assertDictNotEqual(dict1, dict2): 断言字典是否相等
是否为空
assertIsNone(a)/assertIsNotNone(a)
判断真假
assertTrue(a)/assertFalse(a)
是否包含
assertIn(a,b)/assertNotIn(a,b) # b中是否包含a
大小判断
assertGreater(a,b)/assertLess(a,b) : 断言a>b / 断言a<b
assertGreaterEqual(a,b)/assertLessEqual: 断言a>=b / 断言a<=b
类型判断
assertIsInstance(a,dict)/assertNotIsInstance(a,list) # 断言a为字典 / 断言a非列表
图片.png
Test Fixtures(用例包裹方法)
Test Fixtures即setUp(用例准备)及tearDown(测试清理)方法,用于分别在测试前及测试后执行
按照不同的作用范围分为:
setUp()/tearDown(): 每个用例执行前/后执行一次
setUpClass()/tearDownClass(): 每个测试类加载时/结束时执行一次
setUpMoudle()/tearDownMoudle(): 每个测试模块(一个py文件为一个模块)加载/结束时执行一次
'''
import unittest
def setUpModule(): # 当前模块执行前只执行一次
print('=== setUpModule ===')
def tearDownModule(): # 当前模块执行后只执行一次
print('=== tearDownModule ===')
class TestClass1(unittest.TestCase):
@classmethod # 声明为类方法(必须)
def setUpClass(cls): # 类方法,注意后面是cls,整个类只执行一次
print('--- setUpClass ---')
@classmethod
def tearDownClass(cls):
print('--- tearDownClass ---')
def setUp(self): # 该类中每个测试用例执行一次
print('... setUp ...')
def tearDown(self):
print('... tearDown ...')
def test_a(self): # 测试用例
print("a")
def test_B(self): # 大写B的ascii比小写a靠前,会比test_a先执行
print("B")
class TestClass2(unittest.TestCase): # 该模块另一个测试类
def test_A(self):
print("A")
if name == 'main':
unittest.main()
'''
网友评论