• python学习笔记:unittest单元测试


     

     

    单元测试:开发自测时写的代码

    unittest基本原理:

      ♦整个平台的搭建使用的是python的unittest测试框架,这里简单介绍下unittest模块的简单应用。

      ♦unittest是python的标准测试库,相比于其他测试框架是python目前使用最广的测试框架。

      几个概念:

      TestCase 也就是测试用例

      TestSuite 多个测试用例集合在一起

      TestLoader是用来加载TestCase到TestSuite中的

      TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息

     

    unitest的目录结构一般如下:重要

     unittest 测试

    def cal(a,b):
        return a+b
    #
    # res = cal(1,9)
    # if res == 3:
    #     print('成功')
    # else:
    #     raise Exception('测试失败')
    
    # unittest python中的单元测试框架
    import unittest
    
    class MyTest(unittest.TestCase):   #继承TestCase
        def test_a(self):   #函数的名字必须以test开头
            res = cal(1,2)
            self.assertEqual(3,res,msg='预期结果和实际结果不一致')
    
        def test_b(self):
            res = cal(9,3)
            self.assertEqual(3,res,msg='预期结果和实际结果不一致')
    
    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
    assertIs(a, b)           a is b
    assertIsNot(a, b)              a is not b
    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(a, b)       isinstance(a, b)
    assertNotIsInstance(a, b)      not isinstance(a, b)

     

    unittest 测试产生报告

    两种生成测试报告的方式:

    1、安装BeautifulReport模块

    2、把HTMLTestRunner.py 放到pyCharm的External Libraries中

    import unittest
    import HTMLTestRunner
    import BeautifulReport
    
    class MyTest(unittest.TestCase):
        def test_reg(self):
            '''注册'''       #加这一行会在报告中显示用例描述
            print('reg')
            self.assertEqual(1,1)
    
        def test_log(self):
            '''登录'''
            print('log')
            self.assertEqual(1,1)
    
        def test_buy(self):
            self.assertEqual(1,2,msg='购买失败')
    
        def test_z(self):
            self.assertIn(1,[1,2,3])
    
        def test_assert(self):
            res = False
            self.assertFalse(res,)
    
    #下面这一坨是用HTMLTestRunner,产生不好看的测试报告
    f = open('report.html','wb')
    runner = HTMLTestRunner.HTMLTestRunner(f,title='lhtest',description='XX接口测试')  #实例化一个runner,帮你跑测试用例
    suit = unittest.makeSuite(MyTest)  #MyTest类变成测试集合
    runner.run(suit)
    
    #下面这一坨是用BeautifulReport,产生不好看的测试报告
    suite = unittest.makeSuite(MyTest)   #变成测试集合
    report = BeautifulReport.BeautifulReport(suite)
    report.report(filename='bfreport.html',description='接口测试报告')
    
    # 测试集合:testsuite  多个用例放在一起
    # unittest  1、函数名必须是test开头,unittest才会帮你执行
    #           2、用例运行的顺序是按照函数的首字母排序的,a-z
    # testrunner  运行测试用例的
    # testloader  查找测试用例的

    如果我们有很多个模块,每个模块下面都写了很多python文件,每个python文件里面都有测试用例,那怎么把这个目录下的用例都执行了呢,就要先找到这个目录下的所有python文件,然后找到里面的测试用例,逐个执行,代码如下:

    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)
            #运行测试

    参数化

    安装nose-parameterized模块

    import unittest
    from parameterized import parameterized
    
    def login(username,password):
        print(username,password)
        print('=============')
        return 1
    
    class MyTest(unittest.TestCase):
        @parameterized.expand(
            [
               ['xiaodong','123','success'],
               ['yangfan','456','fail'],
               ['hailong','1273','success'],
               ['liurongxin','1273','success'],
            ]
        )
        def test_login(self,username,passwd,check):
            '正常登陆'
            res = login(username,passwd)
            self.assertEqual(check,res)
    
    unittest.main()

     setUp、tearDown、setUpClass、tearDownClass

    ① setup():每个用例执行前运行
    ② teardown():每个用例执行后运行

    ③ setUpClass():必须使用@classmethod 装饰器,所有用例执行前运行一次

    ④ tearDownClass():必须使用@classmethod装饰器,所有用例执行后运行一次

    import unittest
    
    class MyTest(unittest.TestCase):
        def setUp(self):#每条用例执行之前会执行setup
            print('这是setup')
        def tearDown(self):#每条用例执行之后都会执行teardown
            print('这是teardown')
        @classmethod
        def setUpClass(cls):#这个类里面的所有用例执行之前,最先执行它,最前面
            print('这是setupclass')
        @classmethod
        def tearDownClass(cls):#这个类里面所有的用例执行完之后执行它,最后面
            print('tearDownClass')
    
        def test_reg(self):
            print('============我是用例1================')
    
        def test_login(self):
            print('============我是用例2================')
    
    if __name__ == '__main__':
        unittest.main()

    运行结果:

    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    OK
    
    这是setupclass
    这是setup
    ============我是用例1================
    这是teardown
    这是setup
    ============我是用例2================
    这是teardown
    tearDownClass
  • 相关阅读:
    SpringMVC源码阅读-通过画图理解初始化(十一)
    通过Stratus 服务器在Flash Player中使用RTMFP 开发P2P应用
    Lucene 学习资料
    LIRe 源代码分析 3:基本接口(ImageSearcher)
    LIRe 源代码分析 2:基本接口(DocumentBuilder)
    LIRe 源代码分析 1:整体结构
    Media Player Classic
    ffdshow 源代码分析 5: 位图覆盖滤镜(总结)
    ITU-T Technical Paper: 测量QoS的基本网络模型
    ITU-T Technical Paper: QoS 测量 (目标,方法,协议)
  • 原文地址:https://www.cnblogs.com/haifeima/p/11271533.html
Copyright © 2020-2023  润新知