UnitTest基本使用及如何生成测试报告

UnitTest:python自带的一个单元测试框架,用它来进行单元测试
UnitTes核心要素

TestCase(测试用例):

第一步:导入unittets模块
第二步:实现一个类,类必须继承unittest.TestCase类
第三步:类中每个方法代表一个测试用例,方法名必须以test开头
案例:

import unittest
# 测试用例1
def sum(a,b):
    return a+b
# 创建测试合集,继承unittest.TestCase
class my_test(unittest.TestCase):
    # 测试用例1
    def test001(self):
        # 断言是否相同
        self.assertEqual(sum(5,6),11)
    # 测试用例1
    def test002(self):
        # 断言是否相同
        self.assertEqual(sum(4,4),10)


if __name__ == '__main__':
    unittest.main()

TestSuite(测试套件,把多个TestCase集成到一个测试TestSuite):

使用场景:将所有测试用例进行集合为测试套件(包括不同py文件下的测试合集与测试用例)
使用方式:
注意先导入需要集合的py文件
比如 from test_001 import *
1.实例化:suite=unittest.TestSuite()
2.添加用例:suite.addTest(ClassName(“MethodName”))
(ClassName:为类名;MethodName:为方法名)
3.添加测试合集:
python2写法:suite.addTest(unittest.makeSuite(ClassName))
python3写法:suite.addTest(unittest.TestLoader().loadTestsFromTestCase(ClassName))
4.执行在suite中的用例:
实例化TextTestRunner对象runner=unittest.TextTestRunner()
调用run方法runner.run(suite)
(suite:为suite测试套件)
案例:

import unittest
from 杂项.test_unittest import *
suite=unittest.TestSuite()
# 添加用例-用于添加单个用例
suite.addTest(my_test('test001'))
suite.addTest(my_test('test002'))
# 添加扩展-用于添加多个用例
suite.addTest(unittest.TestLoader().loadTestsFromTestCase(my_test))
# 实例化TextTestRunner对象
runner=unittest.TextTestRunner()
# 调用对象的run方法
runner.run(suite)
unittest 断言:

assertEqual(a, b) # 判断a和b是否相等

assertNotEqual(a, b) # 判断a不等于b

assertTrue(a) # 判断a是否为Ture

assertFalse(a) #判断a是否为False

assertIn(a, b) # 判断a 包含在b里面

asserNotIn(a, b) # 判断a 不包含在b里面
案例:

import unittest


# 测试用例1a
def test(a):
    return a


# 继承unittest.TestCase
class MyTest(unittest.TestCase):
    # 测试用例1
    def test001(self):
        # 判断a和b是否相等
        self.assertEqual(test(1), 1)

    # 测试用例1
    def test002(self):
        # 判断a不等于b
        self.assertNotEqual(test(1), 2)

    def test003(self):
        # 判断返回为True
        self.assertTrue(test(True))

    def test004(self):
        # 判断返回为False
        self.assertFalse(test(False))

    def test005(self):
        # 判断a 包含在b里面
        self.assertIn(test("1"), "123456")

    def test006(self):
        # 判断a 不包含在b里面
        self.assertNotIn(test("1"), "23456")


if __name__ == '__main__':
    unittest.main()

TestLoader(自动从代码中加载多个测试用例TestCase):

使用场景:从指定目录查找指定py文件的所有测试用例并自动加载到Testsuite中

import unittest
# 获取当前目录下以test开头的py文件
suite=unittest.TestLoader().discover("./","test*.py")
# 实例化TextTestRunner对象
runner=unittest.TextTestRunner()
# 调用对象的run方法
runner.run(suite)
Fixture(UnitTest特性):
  • 使用场景:可以在测试用例执行前或执行结束后自动调用指定的函数
  • 控制方法:
    • 方法级:每个方法执行前和执行结束后都调用的函数

      • setUp():每个方法执行前都需要执行这个函数
      • tearDown():每个方法执行结束后都需要执行这个函数
        案例:
        import unittest
        
        # 测试用例1a
        def test(a):
            return a
        
        # 继承unittest.TestCaseU
        class MyTest(unittest.TestCase):
            def setUp(self):
                print('方法级别脚本初始化')
            def tearDown(self):
                print('方法级别脚本结束处理')
            # 测试用例1
            def test001(self):
                # 判断a和b是否相等
                self.assertEqual(test(1), 1)
        
            # 测试用例1
            def test002(self):
                # 判断a不等于b
                self.assertNotEqual(test(1), 2)
        	```
        
        
    • 类级:每个类执行前和执行结束后都调用的函数

      • @classmethod setUpClass(cls):每个方法执行前都需要执行这个函数
      • @classmethod tearDownClass(cls):每个方法执行结束后都需要执行这个函数
      • 案例:
      import unittest
      
      # 测试用例1a
      def test(a):
          return a
      
      # 继承unittest.TestCaseU
      class MyTest(unittest.TestCase):
          @classmethod
          def setUpClass(cls):
              print('类级别脚本初始化')
      
          @classmethod
          def tearDownClass(cls):
              print('类级别脚本结束处理')
          # 测试用例1
          def test001(self):
              # 判断a和b是否相等
              self.assertEqual(test(1), 1)
      
          # 测试用例1
          def test002(self):
              # 判断a不等于b
              self.assertNotEqual(test(1), 2)
      
      
    • 模块级:每个模块(一个模块就是一个py文件)执行前和执行结束后都调用的函数

    • setUpModule():每个模块执行前都需要执行这个函数

    • tearDownModule():每个模块执行后都需要执行这个函数

    • 案例:

      import unittest
      
      
      # 测试用例1a
      def test(a):
         return a
      
      
      def setUpModule():
         print('模块级别脚本初始化')
      
      
      def tearDownModule():
         print('模块级别脚本结束处理')
      
      
      # 继承unittest.TestCaseU
      class MyTest(unittest.TestCase):
      
         # 测试用例1
         def test001(self):
             # 判断a和b是否相等
             self.assertEqual(test(1), 1)
      
         # 测试用例1
         def test002(self):
             # 判断a不等于b
             self.assertNotEqual(test(1), 2)
      

参数化的使用:

使用场景:多次执行的重复的函数,且只有传递的参数不一样时可使用参数化
安装parameterized:pip install parameterized
导包:from parameterized import parameterized

  • 使用@parameterized.expand()装饰器进行参数化
    使用:@parameterized.expand([(数据1),(数据2),(数据3)])
    注意:元组内的数据必须要有2个,假如只有一个会报错比如@parameterized.expand([(1),(2),(3)])
    案例:
    import unittest
    from parameterized import parameterized
    
    # 测试用例1a
    def test(a):
        return a
    # 继承unittest.TestCaseU
    class MyTest(unittest.TestCase):
    
        # 参数化的使用
        @parameterized.expand([(1,2),(4,4),(5,6)])
        def test001(self,a,b):
            # 判断a和b是否相等
            self.assertEqual(test(a), b)
    

用例的跳过:

使用场景:有些用例在某些场景不用执行时可使用 @unittest.skip()跳过该用例
直接跳过:@unittest.skip(str)
条件达成时跳过:@unittest.skipIf(条件,str)
案例:

import unittest


# 测试用例1
def test(a):
    return a
# 继承unittest.TestCaseU
class MyTest(unittest.TestCase):
    p=1
    @unittest.skip('跳过这个用例')
    def test001(self):
        # 判断a和b是否相等
        self.assertEqual(test(1), 1)
    @unittest.skipIf(p==1,'因为p==1所以跳过该用例')
    def test002(self):
        # 判断a和b是否相等
        self.assertEqual(test(1), 1)


生成测试报告:

在实例化对象中stream变量设置为需要打开的文件位置即可:

  • 生成txt文件测试报告:
    案例:
    import unittest
    # 获取当前目录下以test开头的py文件
    suite=unittest.TestLoader().discover("./","test*.py")
    # 设置测试报告的地址及编码格式
    file=open("test01.txt","w",encoding='utf-8')
    # 实例化TextTestRunner对象
    runner=unittest.TextTestRunner(stream=file,verbosity=2)
    # 调用对象的run方法
    runner.run(suite)
    
  • 生成html文件的测试报告(重点):
    使用UnitTestReport测试报告模块进行生成,
    项目地址:https://github.com/musen123/UnitTestReport
    unittestreport是基于python3.6开发的,安装前请确认你的python版本>3.6
    安装:pip install unittestreport
    案例:
    	import unittest
    	from unittestreport import TestRunner
    	
    	# 获取当前目录下以test开头的py文件
    	suite=unittest.TestLoader().discover("./","test*.py")
    	# 生成实例
    	run=TestRunner(suite)
    	run.run()
    
  • TestRunner初始化参数:
    在使用TestRunner创建测试运行程序时,可以通过以下参数来,自定义报告的相关内容
    suites: 测试套件(必传)
    filename: 指定报告文件名
    report_dir:指定存放报告路径
    title:指定测试报告的标题
    templates: 可以指定1,2,3三个风格的模板
    tester:测试人员名称
    import unittestreport
    # 1、加载测试用例到套件中
    suite = unittest.defaultTestLoader.discover(r'C:\project\open_class\Py0507\testcase')
    
    # 2、创建一个用例运行程序
    runner = unittestreport.TestRunner(suite,
                                       tester='测试人员名称',
                                       filename="C:\project\",
                                       report_dir=".",
                                       title='这里设置报告标题',
                                       desc='测试生成的报告描述',
                                       templates=2
                                       )
    
    # 3、运行测试用例
    runner.run()
    
  • 用例描述:
    只需要在测试函数下,用三个单引号里面写用例描述即可比如:
class Test001(unittest.TestCase):
   def setUp(self):
      pass

   def tearDown(self):
      pass

   def test_API001(self):
       '''用例描述001'''     #用例描述,在函数下,用三个单引号里面写用例描述
       self.assertTrue(True)
       pass


if __name__ == '__main__':
   unittest.main()

报告结果:
在这里插入图片描述

  • templates: 指定1,2,3三个风格的模板样式分别如下,
    测试报告样式示例图:
    报告样式一:
    在这里插入图片描述

    报告样式二:
    在这里插入图片描述

    报告样式三:
    在这里插入图片描述

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当面试中提到unittest测试框架时,通常会问到以下几个问题: 1. 什么是unittest测试框架? unittest是Python中的一个内置模块,用于编写和运行单元测试。它提供了一组用于编写测试用例、执行测试和生成测试报告的方法和工具。 2. unittest框架有哪些主要的组成部分? unittest框架主要由以下几个组成部分构成: - 测试用例(TestCase):定义测试用例的基本单位,包含一组测试方法。 - 测试套件(TestSuite):包含一组测试用例或者其他测试套件的容器,用于组织和管理多个测试用例。 - 测试运行器(TestRunner):执行测试用例或者测试套件,并生成测试报告。 - 断言方法(Assertion Methods):用于判断测试结果是否符合预期的方法,如assertEqual、assertTrue等。 - 测试装置(Test Fixture):在测试方法执行前后进行准备和清理工作的方法,如setUp、tearDown等。 3. 如何使用unittest框架编写和执行测试用例? 使用unittest框架编写和执行测试用例的一般步骤如下: - 创建一个继承自unittest.TestCase的测试类。 - 在测试类中定义一组以test开头的测试方法。 - 在每个测试方法中,使用断言方法判断测试结果是否符合预期。 - 创建一个测试套件,将测试类中的测试方法添加到套件中。 - 创建一个测试运行器,执行测试套件,并生成测试报告。 4. unittest框架中常用的断言方法有哪些? unittest框架提供了多种断言方法,常用的断言方法包括: - assertEqual(a, b):判断a和b是否相等。 - assertNotEqual(a, b):判断a和b是否不相等。 - assertTrue(x):判断x是否为True。 - assertFalse(x):判断x是否为False。 - assertIn(a, b):判断a是否在b中。 - assertNotIn(a, b):判断a是否不在b中。 这些是面试中常见的unittest测试框架相关问题,希望能对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值