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。