Python 内置测试(调试)方法

本文介绍了Python内置的doctest和unittest模块,doctest用于在代码中嵌入测试用例,进行交互式调试和验证模块的更新。unittest则提供了自动化测试支持,包括测试环境、测试用例、测试集和测试执行者。此外,文章还提及Django和Flask的测试方法,Django使用unittest,而Flask推荐使用pytest。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 内置测试(调试)方法

主要介绍Python 内置原生支持的测试模块:

doctest
doctest 模块主要是在Python 代码中将测试参数和预期结果使用文本标记,然后会查找标注的测试块并执行,执行方式类似于交互式的调试场景;如给定一个输入,执行被测代码确认结果是否与预期输出一致。常见的测试方法和场景如下:
1. 通过确认内置描述文本中的测试实例是否任然可以执行来检查该模块(描述或声明)是否保持更新
2. 通过执行测试文件或测试对象中内置的doctest事例是否符合预期结果做回归测试
3. 用来给python包,库,写一个输入输出的使用教程。当然也要考虑这种“走读测试”或“可执行的文本说明”是否有必要去做。

  • 典型实例:
"""
This is the "example" module.

The example module supplies one function, factorial().  For example,

>>> factorial(5)
120
"""

def factorial(n):
    """Return the factorial of n, an exact integer >= 0.

    If the result is small enough to fit in an int, return an int.
    Else return a long.

    >>> [factorial(n) for n in range(6)]
    [1, 1, 2, 6, 24, 120]
    >>> [factorial(long(n)) for n in range(6)]
    [1, 1, 2, 6, 24, 120]
    >>> factorial(30)
    265252859812191058636308480000000L
    >>> factorial(30L)
    265252859812191058636308480000000L
    >>> factorial(-1)
    Traceback (most recent call last):
        ...
    ValueError: n must be >= 0

    Factorials of floats are OK, but the float must be an exact integer:
    >>> factorial(30.1)
    Traceback (most recent call last):
        ...
    ValueError: n must be exact integer
    >>> factorial(30.0)
    265252859812191058636308480000000L

    It must also not be ridiculously large:
    >>> factorial(1e100)
    Traceback (most recent call last):
        ...
    OverflowError: n too large
    """

    import math
    if not n >= 0:
        raise ValueError("n must be >= 0")
    if math.floor(n) != n:
        raise ValueError("n must be exact integer")
    if n+1 == n:  # catch a value like 1e300
        raise OverflowError("n too large")
    result = 1
    factor = 2
    while factor <= n:
        result *= factor
        factor += 1
    return result


if __name__ == "__main__":
    import doctest
    doctest.testmod()
  • 执行方法
    1、在cmd或shell 下用python执行:
	$ python example.py

2、在第一种执行中,如果测试PASS将没有任何输出,如果想要看到所有的输出打印,则需要加 ‘-v’ 选项

	$ python example.py -v
	Trying:
	    factorial(5)
	Expecting:
	    120
	ok
	Trying:
	    [factorial(n) for n in range(6)]
	Expecting:
	    [1, 1, 2, 6, 24, 120]
	ok
	Trying:
	    [factorial(long(n)) for n in range(6)]
	Expecting:
	    [1, 1, 2, 6, 24, 120]
	ok

2.unittest
基于PyUnit,使用Python 写的JUnit。支持自动化测试,对于每个测试用例或脚本共享SETUP和SHUTDOWN, 支持测试(根据功能模块或目的划分的测试用例子集)集管理,测试脚本(用例)执行与测试报告框架是独立的。提供很多方法类。
unittest包含很多重要的测试概念:

  • 测试环境(test fixture):
    执行测试用例前需要做的一些准备,或者一些清理。一般包括创建临时文件,数据,路径,服务进程,需要的创建,不需要的药清除。

  • 测试用例(脚本)(test case):
    最小的测试块(事务,动作),如检查特定操作(输入)后的响应(输出)。unittest 提供了一个testcase 类可用创建新的testcase

  • 测试集(test suite):
    测试用例的集合,比如完成某个功能模块必须要(同时)执行的一些测试用例。

  • 测试执行者(test runner):
    测试执行者(实体) 由执行用例,和提供或输出测试数据给用户这两部分组成。执行者(实体)可以使用图形界面接口,文本接口,或是通过特殊返回值,提供测试执行的结果


  • Django 的单元测试采用 Python 的标准模块: unittest。也提供了testtool:django.test.Client, 类似轻巧的 web 浏览器可测试视图,高级的测试方法django.test也有 request factory,testcase.
  • Flask 官方文档使用 pytest,用到了 pytest fixtures
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值