Python—Unittest单元测试框架基础教程

本文详细介绍了Python的unittest单元测试框架,包括unittest的基本概念、核心组件如测试装置、测试用例、测试套件和测试运行器。讲解了如何创建测试用例、断言方法、setUp/tearDown方法,以及如何跳过测试。还提到了HTML测试报告的生成和unittest框架的优缺点。是学习unittest的入门教程。
摘要由CSDN通过智能技术生成
文档:unittest单元测试框架
源代码:Lib/unittest/init.py
安装: pip install unittest
一.unittest概念

unittest 单元测试框架是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的风格。其支持测试自动化,配置共享和关机代码测试。支持将测试样例聚合到测试集中,并将测试与报告框架独立。

二.属性导图

在这里插入图片描述

三.核心组件
  1. test fixture:测试装置(执行测试用例前后的环境准备工作;例如:创建临时或代理的数据库、目录,再或者启动一个服务器进程。)
  2. testcase:测试用例(新建测试用例。)
  3. testsuit:测试套件(归档需要一起执行的测试;组合一系列测试用例。)
  4. test runner:测试运行器(执行和输出测试结果的组件;使用图形接口、文本接口,或返回一个特定的值表示运行测试的结果。)
四.属性方法
  1. 创建测试用例:

    写一个类继承 unittest.TestCase 就创建了一个测试样例。类方法的命名都以 test 开头。 这个命名约定告诉测试运行者类的哪些方法表示测试。

  2. 断言:

    [1] 官方文档:断言方法
    [2] 常用断言

    序号 断言方法 断言描述
    1 assertEqual(arg1, arg2, msg=None) 验证arg1==arg2,不等则fail
    2 assertNotEqual(arg1, arg2, msg=None) 验证arg1 != arg2, 相等则fail
    3 assertTrue(expr, msg=None) 验证expr是true,如果为false,则fail
    4 assertFalse(expr,msg=None) 验证expr是false,如果为true,则fail
    5 assertIs(arg1, arg2, msg=None) 验证arg1、arg2是同一个对象,不是则fail
    6 assertIsNot(arg1, arg2, msg=None) 验证arg1、arg2不是同一个对象,是则fail
    7 assertIsNone(expr, msg=None) 验证expr是None,不是则fail
    8 assertIsNotNone(expr, msg=None)) 验证expr不是None,是则fail
    9 assertIn(arg1, arg2, msg=None)) 验证arg1是arg2的子串,不是则fail
    10 assertNotIn(arg1, arg2, msg=None) 验证arg1不是arg2的子串,是则fail
    11 assertIsInstance(obj, cls, msg=None) 验证obj是cls的实例,不是则fail
    12 assertNotIsInstance(obj, cls, msg=None) 验证obj不是cls的实例,是则fail
  3. setUp() / tearDown() :

    可以设置测试方法开始前与完成后需要执行的指令;若 setUp() 方法引发异常,测试框架会认为测试发生了错误,因此测试方法不会被运行。若 setUp() 成功运行,无论测试方法是否成功,都会运行 tearDown() 。这样的一个测试代码运行的环境被称为 test fixture 。

  4. setUpClass()/tearDownClass():

    在运行单个类中的测试前后调用的类方法。 setUpClass/tearDownClass以类作为唯一参数调用,并且必须修饰为classmethod():

  5. unittest.main() :

    提供了一个测试脚本的命令行接口。当在命令行运行该测试脚本,上文的脚本格式的输出。

  6. 跳过测试:

    [1] @unittest.skip(reason):跳过被此装饰器装饰的测试。 reason 为测试被跳过的原因。
    [2] @unittest.skipIf(condition, reason):当 condition 为真时,跳过被装饰的测试。
    [3] @unittest.skipUnless(condition, reason):跳过被装饰的测试,除非 condition 为真。
    [4] @unittest.expectedFailure:将测试标记为预期的失败或错误。如果测试失败或出错,将被视为成功。如果测试通过,将被视为失败。
    [5] exception unittest.SkipTest(reason):引发此异常以跳过一个测试。通常来说,你可以使用 TestCase.skipTest() 或其中一个跳过测试的装饰器实现跳过测试的功能,而不是直接引发此异常。
    [注意]:被跳过的测试的 setUp() 和 tearDown() 不会被运行。被跳过的类的 setUpClass() 和 tearDownClass() 不会被运行。被跳过的模组的 setUpModule() 和 tearDownModule() 不会被运行。

  7. 检查异常、警告和日志消息的生成:

    序号 方法 描述
    1 assertRaises(exc, fun, *args, **kwds) fun(*args, **kwds)提高EXC
    2 assertRaisesRegex(exc, r, fun, *args, **kwds) fun(*args, **kwds)提高EXC
    3 assertWarns(warn, fun, *args, **kwds) fun(*args, **kwds)提出警告
    4 assertWarnsRegex(warn, r, fun, *args, **kwds) fun(*args, **kwds)引发警告 ,并且消息匹配正则表达式r
    5 assertLogs(logger, level) 该with块 以最低级别登录到记录器

    注:详情请参考官方文档

  8. 测试框架可以使用以下方法来收集有关测试的信息

    [1]countTestCases():返回此测试对象表示的测试数量。对于 TestCase情况下,这将永远是1。
    [2]defaultTestResult():返回应用此测试用例类的测试结果类的实例,如果未向该run()方法提供其他结果实例 ;对于TestCase情况 下,这将永远是一个实例 TestResult; 的子类TestCase应在必要时覆盖此子类。
    [3]id():返回标识特定测试用例的字符串。这通常是测试方法的全名,包括模块和类名。
    [4]shortDescription():返回测试的描述;或者None没有提供描述。此方法的默认实现返回测试方法第一行。
    [5] …

  9. 分组测试:

    [0]unittest.TestSuite(tests =()): 此类表示各个测试用例和测试套件的集合。该类提供测试运行程序所需的接口,以使其能够像其他任何测试用例一样运行。运行TestSuite实例与遍历套件(分别运行每个测试)相同。
    [1]addTest(测试): 将TestCase或添加TestSuite到套件。
    [2]addTests(测试): 将来自所有可迭代的TestCase和TestSuite 实例的测试添加到该测试套件中。
    [3]run(结果): 运行与此套件相关的测试,将结果收集到作为result传递的测试结果对象中。请注意,不同于 TestCase.run(),TestSuite.run()需要传递结果对象。
    [4]countTestCases(): 返回此测试对象表示的测试数量,包括所有单个测试和子套件。

  10. 协程,信号处理,加载运行等方法请参考官方文档。

五.基本实例

一. 测试方法

# Test_func_demo.py

def add(a, b):
    return a + b


def minus(a, b):
    return a - b


def multi(a, b):
    return a * b


def divide(a, b):
    return a / b

二.简单实例

# Test_unittest_demo.py
import unittest
from Test_func_demo import *


# 继承 unittest.TestCase 就创建了一个测试样例
class TestFun(unittest.TestCase):

    def test_add(self):
        """验证加法"""
        self.assertEqual(4, add(2, 2))
        self.assertNotEqual(3, add(2, 2))

    def test_minus(self):
        """验证减法"""
        self.assertEqual(1, minus(2, 1))

    def test_multi
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值