Python 测开28期 - 小锅巴 - unittest测试框架

Python内置框架:unittest

  • unittest包含4个部分:TestCase-编写测试用例、TestLoader-加载测试用例、TestSuit-测试套件、TextTestRunner-运行测试用例,结果保存在:TextTestResult
  • unitest框架编写测试用例,测试类必须继承:unittest.TestCase
  • 测试用例函数必须以:test 开头,代表是一个用例
  • unittest执行用例的顺序:ascii码一位一位去对比,小的先执行
前置与后置
  • 函数级别:setUp()、tearDown()
  • 类级别:setUpClass()、tearDownClass()–需要用:@classmethod 装饰器装饰
收集测试用例
  • 首先需要创建测试套件:suit = unittest.TestSuite()
  • 单个测试用例收集:suit.addTest(测试类("用例名"))
    • 按用例列表集合添加:testcase = [测试类(“用例名1”), 测试类(“用例名2”)] suit.addTests(testcase)
  • 按测试文件/路径收集:unittest.TestLoader()–测试加载,一般用例创建测试套件和加载测试用例,将搜索的测试用例加载到测试套件中。TestLoader()提供了以下加载测试用例的方式:
    • unittest.TestLoader().loadTestsFromTestCase(测试用例类) — 根据testcase类名寻找用例
    • unittest.TestLoader().loadTestsFromModule(模块名,pattern=None) — 根据testcase所在的文件名寻找用例
    • unittest.TetsLoader().loadTestsFromName(测试用例名,module=None) — 根据用例名称寻找用例
      • 用例名的写法:“文件名.类名.用例名”
    • unittest.TestLoader().loadTestsFromNames(names, module=None) — 根据多个用例名称寻找用例
    • unittest.defaultTestLoader().discover(start_dir,pattern="test*.py",top_level_dir=None) — 根据正则规则匹配路径下符合规则的文件及文件中所有的用例
    • 以上的方法步骤都一样,只是在加载用例的地方替换成对应的方法即可:如下代码示例:
      import unittest                     # 导入unittest
      from static.fff import example1    # 从 testcase目录下的fff.py文件中导入example1实例类
      from static import fff             # 从static目录下导入fff文件
      import os 
      
      current_directory_path = os.getcwd()    # 获取当前目录的路径,因为用例fff.py文件存放在当前目录下
      # -------------------------test loader部分---------------------
      load_case = unittest.defaultTestLoader.discover(start_dir=current_directory_path, pattern='fff*.py')    # 加载当前目录下的fff开头的文件下的测试用例
      
      # --------------------------test suit部分-----------------------------------------
      suite = unittest.TestSuite()        # 构建测试套件
      suite.addTest(load_case) 			# 添加test load收集到的test case到suite中
      
      # --------------------------test runner部分-------------------------------------
      runner = unittest.TextTestRunner(verbosity=0)
      runner.run(suite) 					# 将suit放入runner中执行
      # verbosity :表示测试结果的信息详细程,一共三个值,默认是1
      # 0 (静默模式):你只能获得总的测试用例数和总的结果 比如 总共100个 失败20 成功80
      # 1 (默认模式):非常类似静默模式 只是在每个成功的用例前面有个 . 每个失败的用例前面有个 F
      # 2 (详细模式):测试结果会显示每个测试用例的所有相关的信息
      
      
    • 步骤:
      • 加载测试用例
      • 创建测试套件
      • 将加载的测试用例添加到测试套件中
      • 创建运行用例示例
      • 将测试套件给run()方法,去执行用例
测试结果提取/测试报告
  • 执行用例代码:
    runner = unittest.TextTestRunner()
    result = runner.run()  # 返回的是:TextTestResult,父类是:TestResult。
    
  • 类:TextTestResult 父类:TestResult。有很多的方法和属性,可以获取执行完用例的结果的一些具体的信息
  • 测试报告:使用第三方库:BeautifulReport或HTMLTestRunner。以前者为例
    import unittest                     		# 导入unittest
    from testcase.fff import example1    		# 从 testcase目录下的fff.py文件中导入example1实例类
    from BeautifulReport import BeautifulReport # 导入BeautifulReport库
    
    # -------------------------test loader部分---------------------
    load_case = unittest.TestLoader().loadTestsFromTestCase(example1)   # 加载example1类下的所有用例
    
    # ------------------------test suit部分--------------------------
    suite = unittest.TestSuite()        # 构建测试套件
    suite.addTest(load_case)            # 将test_cases列表添加到suite中
    
    # ------------------------生成测试报告-----------------------------
    BeautifulReport(suite).report(filename='测试报告文件名称', description='测试报告标题', report_dir='.') # report_dir='.'把report放到当前目录下
    
数据驱动实现
  • unittest没有提供数据驱动,或者参数化的库,需要使用到第三方库:ddt、paramunittest
  • 用法示例:
     # 使用unittest前,需导入unittest库
    import unittest
     # 导入ddt
    import ddt
    
     # -------------------------参数化的参数-------------------
    test_data = [{'username':'张三', 'psw':'123456'},
                 {'username': '李四', 'psw': '321654'},
                 {'username': '王五', 'psw': '654321'},]
    
     # ---------------------------testcase部分-------------------
     # 实例化example类,并继承于unittest.TestCase
    @ddt.ddt
    class example1(unittest.TestCase):
        def test_a01(self):
            print('测试用例1')
    
        @ddt.data(*test_data)
        def test_a02(self, data):
            print('测试用例2')
            print(data)
    
     # ---------------------------test runner部分-------------------
    if __name__ == '__main__':
        # 执行当前文件的测试用例
        unittest.main()