- setUpModule/tearDownModule:在整个模块的开始和结束时被执行。
- setUpClass/tearDownClass: 在测试类的开始和结束时被执行。
- setUp/tearDown:在测试用例的开始与结束时被执行
注意:setUpClass/tearDownClass的写法稍有不同,首先通过@classmethod进行装饰,其次方法的参数为cls,也可以是别的。每一个上面都要进行装饰
import unittest class MyTest(unittest.TestCase): # 继承unittest.TestCase def tearDown(self): # 每个测试用例执行之后做操作 print('111') def setUp(self): # 每个测试用例执行之前做操作 print('22222') @classmethod def tearDownClass(self): # 必须使用 @ classmethod装饰器, 所有test运行完后运行一次 print('4444444') @classmethod def setUpClass(self): # 必须使用@classmethod 装饰器,所有test运行前运行一次 print('33333') def test_a_run(self): self.assertEqual(1, 1) # 测试用例 def test_b_run(self): self.assertEqual(2, 2) # 测试用例 if __name__ == '__main__': unittest.main()#运行所有的测试用例
unittest框架默认根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以TestAdd会优于TestBdd类被执行,test_aaa()方法会优于test_ccc被执行,因而它并没有按照用例从上到下的顺序执行
如果要测试的函数里包含的函数会连接数据库,或者发起http请求。你不想出发真实的操作,或者你纯粹就是不行调用这个函数。那这时候就用到mock模块了。
==========常用的断言
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
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(obj,cls,msg=None)
assertNotIsInstance(obj,cls,msg=None)
==============
安装 HTMLTestRunner,使用执行测试用例就会生成一个html的测试报告,里面会有每个测试用例的执行结果
import HTMLTestRunner import unittest class MyTest(unittest.TestCase):#继承unittest.TestCase def tearDown(self): #每个测试用例执行之后做操作 print('111') def setUp(self): #每个测试用例执行之前做操作 print(22222) def test_run(self): # self.assertEqual(1,1) self.assertIs(1,1) #测试用例 def test_run2(self): # self.assertEqual(1,1) self.assertIs(1,1) #测试用例 def test_run3(self): # self.assertEqual(1,1) self.assertIs(1,1) #测试用例 def test_run1(self): # self.assertEqual(1,1) self.assertIs(1,1) #测试用例 if __name__ == '__main__': test_suite = unittest.TestSuite()#创建一个测试集合 test_suite.addTest(MyTest('test_run1'))#测试套件中添加测试用例 #test_suite.addTest(unittest.makeSuite(MyTest))#使用makeSuite方法添加所有的测试方法 fp = open('res.html','wb')#打开一个保存结果的html文件 runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='api测试报告',description='测试情况') #生成执行用例的对象 runner.run(test_suite) #执行测试套件
==============找到当前目录下所有测试用例
import unittest,HTMLTestRunner suite = unittest.TestSuite()#创建测试套件 all_cases = unittest.defaultTestLoader.discover('.','test_*.py') #找到某个目录下所有的以test开头的Python文件里面的测试用例 for case in all_cases: suite.addTests(case)#把所有的测试用例添加进来 fp = open('res.html','wb') runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='all_tests',description='所有测试情况') runner.run(suite) #运行测试
discover()方法中的start_dir只能加载当前目录下的.py文件,如果加载子目录下的.py文件,需在每个子目录下放一个_init_.py文件。
- discover(start_dir,pattern='test*.py',top_level_dir=None)
- start_dir:要测试的模块名或测试用例的目录
- pattern='test.py':表示用例文件名的匹配原则,此处文件名以“test”开头的“.py”类型的文件,“”表示任意多个字符。
- top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,默认为None.
===================