python 杂记-unittest

  • 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.

===================

猜你喜欢

转载自www.cnblogs.com/testzcy/p/11220953.html