zoukankan      html  css  js  c++  java
  • python 杂记-unittest

    介绍单元测试的好文:https://mp.weixin.qq.com/s/njxc8GXSlc3z_RibK70ROg

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

    可能有人会好奇,为什么不使用内置断言语句 assert,而要额外提供这么多断言方法并使用呢?原因是通过使用 unittest 提供的断言方法,测试框架在运行结束后,能够聚合所有的测试结果并产生信息丰富的测试报告。而直接使用 assert 虽然也可以达到验证被测对象是否符合预期的目的,但在用例出错时,报错信息不够丰富

    unittest 支持用例自动(递归)发现:
    
    默认发现当前目录下所有符合 test*.py 测试用例
    
    使用 python -m unittest 或 python -m unittest discover
    
    通过 -s 参数指定要自动发现的目录, -p 参数指定用例文件的名称模式
    
    python -m unittest discover -s project_directory -p "test_*.py"
    
    通过位置参数指定自动发现的目录和用例文件的名称模式
    
    python -m unittest discover project_directory "test_*.py"
    
    unittest 支持执行指定用例:
    
    指定测试模块
    
    python -m unittest test_module1 test_module2
    
    指定测试类
    
    python -m unittest test_module.TestClass
    
    指定测试方法
    
    python -m unittest test_module.TestClass.test_method
    
    指定测试文件路径(仅 Python 3)
    
    python -m unittest tests/test_something.py

    如果我们希望每个测试方法之前前后分别执行测试前置和清理方法,那么需要在测试类中定义好 setUp()[11] 和 tearDown()[12]

    如果我们希望单个测试类中只执行一次前置方法,再执行该测试类中的所有测试,最后执行一次清理方法,那么需要在测试类中定义好 setUpClass()[13] 和 tearDownClass()[14]

    如果我们希望单个测试模块中只执行一次前置方法,再执行该模块中所有测试类的所有测试,最后执行一次清理方法,那么需要在测试模块中定义好 setUpModule()[15] 和 tearDownModule()[16]

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

    安装 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()#生成执行用例的对象 
    runner.run(test_suite) #执行测试套件

     ==============找到当前目录下所有测试用例

    import unittest
    import HtmlTestRunner
    if __name__ == '__main__':
    suite = unittest.TestSuite()#创建测试套件
    all_cases = unittest.defaultTestLoader.discover('.','test_*.py')
    #找到某个目录下所有的以test开头的Python文件里面的测试用例
    for case in all_cases:
    suite.addTests(case)#把所有的测试用例添加进来
    myrunner = HtmlTestRunner.HTMLTestRunner()
    myrunner.run(suite)
    print 'over'

     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.

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

  • 相关阅读:
    Android碰撞检测——Region碰撞检查
    游戏音乐MediaPlayer和SoundPool常用的一些方法
    游戏框架SurfaceView的简单运用
    Android碰撞检测——矩形检查
    View框架下实现角色的上下左右移动
    数据库导出到Excel前后端代码
    jQuery打印插件PrintArea实现
    showModalDialog 传值及刷新
    文件夹中文件夹(文件)按时间排序,读取最新的文件夹(文件)
    .NET分布式开发报错:“与基础事务管理器的通信失败”的解决方法
  • 原文地址:https://www.cnblogs.com/testzcy/p/11220953.html
Copyright © 2011-2022 走看看