Python doctest模块:文档测试(超级详细)
前面在查看 Python 的模块文档时,经常会看到如下信息:
>>>os.path.commonprefix (['/usr/lib','/usr/local/lib'])
'/usr/1'
>>>os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
上面的说明就是文档测试的注释,文档测试工具可以提取说明文档中的测试用例,其中“>>>”之后的内容表示测试用例,接下来的一行则代表该测试用例的输出结果。文档测试工具会判断测试用例的运行结果与输出结果是否一致,如果不一致就会显示错误信息。
现在定义一个简单的模块,该模块包含一个函数和一个类,程序为该函数和该类提供了说明文档,该文档中包含了测试用例。程序代码如下:
def square (x): ''' 一个用于计算平方的函数 例如 >>> square(2) 4 >>> square(3) 9 >>> square(-3) 9 >>> square(0) 0 ''' return x * 2 # ①、故意写错的 class User: ''' 定义一个代表用户的类,该类包含如下两个属性: name - 代表用户的名字 age - 代表用户的年龄 例如 >>> u = User('fkjava', 9) >>> u.name 'fkjava' >>> u.age 9 >>> u.say('i love python') 'fkjava说: i love python' ''' def __init__(self, name, age): self.name = 'fkit' # ②、故意写错的 self.age = age def say(self, content): return self.name + '说: ' + content if __name__=='__main__': import doctest doctest.testmod()上面第一段注释代码就是程序为 square() 函数提供的测试用例,在文档中一共为该函数提供了 4 个测试用例;第二段注释代码是程序为 User 类提供的测试用例,在文档中一共为该类提供了 3 个测试用例,分别用于测试用户的 name 、age 和 say() 方法。
程序最后几行代码进行了判断,如果是直接使用 python 命令来运行该程序(__name__ 等于 __main__),程序将导入 doctest 模块,并调用该模块的 testmod() 函数。
从上面程序可以看到,Python 为文档测试提供了 doctest 模块,该模块的用法非常简单,程序只要调用该模块的 testmod() 函数即可。
运行上面程序,可以看到如下输出结果:
**********************************************************************
File "C:\Users\mengma\Desktop\1.py", line 25, in __main__.User
Failed example:
u.name
Expected:
'fkjava'
Got:
'fkit'
**********************************************************************
File "C:\Users\mengma\Desktop\1.py", line 29, in __main__.User
Failed example:
u.say('i love python')
Expected:
'fkjava说: i love python'
Got:
'fkit说: i love python'
**********************************************************************
File "C:\Users\mengma\Desktop\1.py", line 8, in __main__.square
Failed example:
square(3)
Expected:
9
Got:
6
**********************************************************************
File "C:\Users\mengma\Desktop\1.py", line 10, in __main__.square
Failed example:
square(-3)
Expected:
9
Got:
-6
**********************************************************************
2 items had failures:
2 of 4 in __main__.User
2 of 4 in __main__.square
***Test Failed*** 4 failures.
上面显示的测试输出结果也很清晰,每个测试用例结果都包含如下 4 部分:
- 第一部分:显示在哪个源文件的哪一行。
- 第二部分:Failed example,显示是哪个测试用例出错了。
- 第三部分:Expected,显示程序期望的输出结果。也就是在“>>>命令”的下一行给出的运行结果,它就是期望结果。
- 第四部分:Got,显示程序实际运行产生的输出结果。只有当实际运行产生的输出结果与期望结果一致时,才表明该测试用例通过。
将上面程序中 ① ② 两行代码修改正确,再次使用 python 命令来运行程序,将看不到任何输出结果,说明文档测试中的所有测试用例都通过了。
由此可见,Python 为文档注释提供了 doctest 模块,该模块的用法非常简单,程序只要导入该模块,并调用该模块的 testmod() 函数即可。testmod() 函数会自动提取该模块的说明文档中的测试用例,并执行这些测试用例,最终生成测试报告。如果存在没有通过的测试用例,程序就会显示有多少个测试用例没有通过;如果所有测试用例都能通过测试,则不生成任何输出结果。
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频