Unittest框架介绍及常用组件

本文介绍了Python自带的unittest单元测试框架。阐述了其常用组件,如TestCase、TextFixture、TestSuite等的功能和使用方法;说明了断言的使用,可采用Python自带或框架中的断言;还提及skip装饰器的四种用法。最后给出一个使用示例。

1、unittest框架介绍

        unittest是Python自带单元测试框架,提供丰富的用例管理、执行和断言操作。

2、unittest框架常用组件

        (1)TestCase,测试用例,继承于TestCase的类或者TestCase的实例就是一个测试例。在unittest中表示测试用例的方法都必须以test开头才能被执行,各个方法之间的执行顺序按照ASCII值排序。

import unittest
class TestDemo(unittest.TestCase):
    def test_case(self):
        print('测试用例方法......')
       
    def non_test(self):
        # 非test开头的测试用例在测试执行时不会被执行
        print('非测试用例方法')

if __name__ == '__main__':
    # 执行测试用例
    unittest.main()

        (2)TextFixture, 测试夹具。用于测试用例执行前前置条件的准备与执行完毕后的处理。提供以下常用方法:

         ·setUp(),表示每个测试用例执行前进行的操作

        ·tearDown(),表示每个测试用例执行完毕之后的操作

        ·setUpClass(),类方法,表示所有测试用例执行之前的操作,只执行一次

        ·tearDownClass(),类方法,表示所有测试用例执行完毕之后的操作,只执行一次

import unittest

class TestDemo(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print('running setUpClass...')

    def setUp(self) -> None:
        print('running setUp...')

    def tearDown(self) -> None:
        print('running tearDown...')

    @classmethod
    def tearDownClass(cls) -> None:
        print('running tearDownClass...')

    def test_case(self):
        print('测试用例方法......')

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

        (3)TestSuite,测试套件,把需要执行的测试用例放在一起。有两种常用方式来创建测试套件。

        ·使用TestSuite类直接构建

         suit = unittest.TestSuite(tests=()) 直接传入要执行的测试用例tests, tests必须是一个包含单独测试用例的可迭代对象或者其他测试套件 如:

suit = unittest.TestSuite((TestDemo.test_case,))

        ·使用TestSuite类实例对象的addTest()与addTests()方法构建

        addTest() ,一次只能添加一条测试用例

suit = unittest.TestSuite() 
suit.addTest(TestLogin('test_1'))  # 添加TestLogin类的test_

         addTests()  一次可以添加多条测试用例

suit = unittest.TestSuite() 
# 添加TestLogin类的test_1 test_2
suit.addTests([TestLogin('test_1'), TestLogin('test_2')])  

        (4)TestRunner,测试执行器 执行测试用例,并返回测试用例的执行结果,还能将结果以HTML或者Text形式展示出来。即HTMLTestRunner与TextTestRunner

        ·HTMLTestRunner

# 以HTML形式显示测试报告
# 1、创建执行器 
runner = HTMLTestRunner( 
        stream=xxx ,  # 指定输出方式 
        tester=xxx ,   # 测试人员     
        description=xxx ,  # 测试报告描述信息 
        title=xxx ,  # 测试报告标题 
        verbosity=num ,  # 测试报告详细程度, 有3个值(0 1 2默认2(最详细)) ) 

# 2、启动执行器运行测试用例, suit即上文装载了测试用例的TestSuite
runner.run(suit)

        ·TextTestRunner

# 以Text形式显示测试报告
# 1、创建执行器 
runer = TextTestRunner( 
    stream=xxx, # 指定输出方式(默认为None, 输出到控制台) 
                 # 输出到文件 with open('file',''wb) as file_name, stream=file_name                  
    verbosity=num ,  # 测试报告详细程度, 有3个值(0 1 2默认2(最详细)) 
    description=xxx ,  # 测试报告描述信息 
) 

# 2、启动执行器运行测试用例 
runner.run(suit)

        (5)TestLoader,测试装载器,用来将TestCase添加到TestSuite中,有以下几种常用方式         ·loadTestsFromTestCase()  通过类名将测试用例添加到测试套件中

suit = unittest.TestLoader().loadTestsFromTestCase(TestCaseClass)

         ·loadTestsFromModule()  通过模块名将测试模块添加到测试套件中

suit = unittest.TestLoader().loadTestsFromModule(TestCaseModuleName)

         ·loadTestsFromName()  通过名字将测试用例添加到测试套件中,可以是模块,测试用例类或者测试用例类中测试方法

suit = unittest.TestLoader().loadTestsFromName(class.method)
suit = unittest.TestLoader().loadTestsFromName(module.class)
...

         ·loadTestsFromNames()  将序列中的测试用例添加到测试套件中

suit = unittest.TestLoader().loadTestsFromNames(['test_1', 'tesst_2' [,...]])

         ·discover() 将指定路径下指定开头的文件添加到测试套件中(也可以使用unittest中的defaultTestLoader的discover方法)

suit = unittest.TestLoader().discover( 
    start_dir=xxx ,   # 测试用例所在路径 
    pattern=xxx ,   # 匹配规则,符合条件的加入到TestSuite中 
    top_level_dir=xxx ,  # 顶层目录名称,默认None
)

# 执行测试用例
runner = unittest.TextTestRunner()
runner.run(suit)

3、断言

        断言在测试中用来判断实际结果与预期结果是否相等,在unittest框架中,可以使用Python自带的断言,也可以使用unittest框架中的断言。

        ·Python中断言 直接使用 assert 表达式即可

        ·unittest中断言

assertEqual(a, b,msg=None) 
assertNotEqual(a, b,msg=None) 
assertIn(a, b) ...

 4、其他

        (1) skip装饰器

        skip装饰器可以跳过某些测试用例,skip主要有四种用法:

        ·@unittest.skip(reason) 无条件跳过,reason描述跳过的原因

        ·@unittest.skipIf(condition, reason) 有条件跳过,当条件满足时跳过该测试用例

        ·@unittest.skipUnless(condition, reason) 有条件跳过,当condition条件不满足时跳过该测试用例

        ·@unittest.exceptedFailure 用于标记期望执行失败的测试方法,如果该测试方法执行失败则被认为成功,如果执行成功则被认为是失败。

5、一个例子

import unittest

class TestLogin(unittest.TestCase):
    def setUp(self) -> None:
        # 创建套件,每次执行用例前都会执行一次
        print("测试用例执行前准备条件...")

    def test_name(self):
        # 创建第一个测试方法
        assert 'Tom' == 'Bob'

    def test_id(self):
        # 创建第二个测试方法
        self.assertEqual('2983', '2983')

    @unittest.skipIf('test' in 'python test', reason='满足条件跳过该用例')
    def test_time(self):
        self.assertNotEqual('B','C')

if __name__ == '__main__':
    # 创建测试套件,并装载测试用例
    suit = unittest.TestLoader().loadTestsFromTestCase(TestLogin)
    
    # 创建执行器
    runner = unittest.TextTestRunner(
        stream=None,  # 输出到终端
        descriptions='unittest 测试框架',
        verbosity=2
    )
    # 执行测试用例
    runner.run(suit)

 

 

 

 

<think>好的,我现在需要回答用户关于Pythonunittest框架的问题。用户想了解它的概念和用途,以及具体用法。首先,我得回想一下自己之前对unittest的了解,并结合提供的引用资料来组织答案。 首先,根据引用[1],unittestPython的标准测试库,被广泛使用。这应该是框架的基本介绍部分。接下来,需要说明它的主要用途,比如单元测试、自动化测试、回归测试等。这部分可能需要结合常见的测试场景来阐述。 然后,关于核心概念,引用[2]和[3]提到了测试类继承TestCase,测试方法以test_开头,还有断言方法。这些需要详细说明,比如TestCase类的作用,测试用例的组织方式。断言方法比如assertEqual、assertTrue等,这些是测试中常用的方法,需要举例说明。 关于用法步骤,用户提供的引用中有示例代码,比如导入unittest、创建测试类、写测试方法、执行测试用例。我需要把这些步骤分解开来,每一步做什么,比如导包、继承TestCase、方法命名规则、执行方式(命令行或使用TestLoader)。此外,引用[4]提到HTMLTestRunner生成测试报告,这也是一个重要的用法,可以提到扩展功能。 在结构上,需要分点说明概念、用途、核心组件和用法步骤,保持清晰。同时,按照用户的要求,行内公式用$...$,但这里可能涉及较少数学内容,但如果有的话要注意格式。例如,如果提到测试覆盖率等可能需要数学表达式,但暂时可能不需要。 然后要生成相关问题,可能涉及单元测试的意义、断言方法、生成报告的方法,以及unittest与其他框架的比较,比如pytest。这些问题需要基于回答内容自然延伸。 需要确保引用正确,每个引用在回答中适当的位置标注。比如在提到测试类继承TestCase时引用[2],生成报告时引用[4]。 另外,用户提供的示例代码中有测试方法的例子,比如test_method1和test_method2,这些可以引用到回答中作为示例,说明如何编写测试用例。同时,注意代码块的格式是否正确,使用三个反引号包围,并标注语言类型。 最后,检查是否符合所有系统级指令:中文回答、LaTeX正确、引用标识自然、结构清晰。确保没有使用任何Markdown格式,除了用户允许的代码块和引用标识。同时,回答要真实可靠,基于提供的引用资料,不添加未提及的信息。 现在开始组织内容,先介绍概念和用途,再讲核心组件,然后分步骤说明用法,最后示例代码和生成相关问题。确保每个部分都有对应的引用支持。</think>Python的`unittest`框架是用于编写和运行单元测试的标准库,支持自动化测试、用例组织及结果验证。以下是详细介绍: --- ### 一、概念与用途 1. **单元测试**:验证代码的最小可测单元(如函数、类)的行为是否符合预期[^1]。 2. **自动化测试**:通过脚本批量执行测试用例,减少人工干预。 3. **回归测试**:确保代码修改后原有功能不受影响。 4. **测试报告生成**:支持生成HTML等格式的测试报告,便于结果分析[^4]。 --- ### 二、核心组件 1. **`TestCase`类**:用户自定义的测试类需继承`unittest.TestCase`,每个测试方法以`test_`开头[^2]。 ```python import unittest class TestAdd(unittest.TestCase): def test_method1(self): self.assertEqual(add(1,2), 3) # 断言方法 ``` 2. **断言方法**: - `assertEqual(a, b)`:验证$a = b$ - `assertTrue(x)`:验证$x$为真 - `assertRaises(ErrorType)`:验证是否抛出特定异常 3. **`TestSuite`与`TestRunner`**: - `TestSuite`:聚合多个测试用例。 - `TestRunner`:执行测试并输出结果,如`HTMLTestRunner`可生成可视化报告。 --- ### 三、使用步骤 1. **导入库**: ```python import unittest ``` 2. **定义测试类**: ```python class TestMath(unittest.TestCase): def test_add(self): self.assertEqual(1+1, 2) # 断言加法结果 ``` 3. **执行测试**: - **命令行**:`python -m unittest 文件名` - **代码内执行**: ```python if __name__ == '__main__': unittest.main() ``` 4. **批量运行用例**: ```python suite = unittest.defaultTestLoader.discover('.', 'test_*.py') # 匹配所有测试文件 runner = HTMLTestRunner(f, title='测试报告') # 生成HTML报告 runner.run(suite) ``` --- ### 四、示例代码 ```python import unittest from math_functions import add class TestAdd(unittest.TestCase): def test_add_positive(self): self.assertEqual(add(3, 5), 8) # 测试正数相加 def test_add_negative(self): self.assertEqual(add(-2, -3), -5) # 测试负数相加 if __name__ == '__main__': unittest.main() ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值