文档章节

Python 各种测试框架简介(一):doctest

lionets
 lionets
发布于 2014/05/24 17:02
字数 805
阅读 12935
收藏 12

doctest 是一个 Python 发行版自带的标准模块。本篇将分别对使用 doctest 的两种方式——嵌入到源代码中和做成独立文件做基本介绍。 <br /> ##doctest 的概念模型

在 Python 的官方文档中,对 doctest 的介绍是这样的:

doctest 模块会搜索那些看起来像交互式会话的 Python 代码片段,然后尝试执行并验证结果

即使从没接触过 doctest,我们也可以从这个名字中窥到一丝端倪。“它看起来就像代码里的文档字符串(docstring)一样” 如果你这么想的话,就已经对了一半了。

doctest 的编写过程就仿佛你真的在一个交互式 shell(比如 idle)中导入了要测试的模块,然后开始一条条地测试模块里的函数一样。实际上有很多人也是这么做的,他们写好一个模块后,就在 shell 里挨个测试函数,最后把 shell 会话复制粘贴成 doctest 用例。 <br /> ##举个例子

下面使用的例子是一个只有一个函数的模块,其中签入了两个 doctest 的测试用例。

unnecessary_math.py:

    lang:python
"""
这里也可以写
"""
def multiply(a,b):
	"""
	>>> multiply(2,3)
	6
	>>> multiply('baka~',3)
	'baka~baka~baka~'
	"""
	return a*b

if __name__ == '__main__':
	import doctest
	doctest.testmod(verbose=True)

注意测试代码的位置,前面说过 doctest 的测试用例就像文档字符串一样,这句话的内涵在于:测试用例的位置必须放在整个模块文件的开头,或者紧接着对象声明语句的下一行。也就是可以被 __doc__ 这个属性引用到的地方。并非像普通注释一样写在哪里都可以。另:verbose 参数用于控制是否输出详细信息,默认为 False,如果不写,那么运行时不会输出任何东西,除非测试 fail。

示例的运行输出为:

Trying:
	multiply(2,3)
Expecting:
	6
ok
Trying:
	multiply('baka~',3)
Expecting:
	'baka~baka~baka~'
ok
1 items had no tests:
    __main__
1 items passed all tests:
   2 tests in __main__.multiply
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

上例中启动测试的方式是在 __main__ 函数里调用了 doctest.testmod() 函数。这对于纯容器型模块文件来说是一个好办法——正常使用时只做导入用,直接运行文件则进行测试。而对于 __main__ 函数另有他用的情况,则还可以通过命令行来启动测试:

$ python -m doctest unnecessary_math.py
$ python -m doctest -v unnecessary_math.py

这里 -m 表示引用一个模块,-v 等价于 verbose=True。运行输出与上面基本一样。 <br /> ##独立文件模式

如果不想(或不能)把测试用例写进源代码里,则还可以使用一个独立的文本文件来保存测试用例。

    lang:python
可选的一些解释性内容...

>>> from test import multiply
>>> multiply(2,3)
6
>>> multiply('baka~',3)
'baka~baka~baka~'

几乎同样的格式。运行方法可以分为在 Python shell 里运行或者在系统 shell 里运行:

    lang:python
>>> import doctest
>>> doctest.testfile('example.txt')

bash/cmd.exe:

$ python -m doctest -v example.txt

© 著作权归作者所有

lionets
粉丝 94
博文 101
码字总数 135303
作品 0
朝阳
程序员
私信 提问
Python 各种测试框架简介(二):unittest

unittest 与 doctest 一样也是 Python 发行版自带的包。如果你听说过 PyUnit(OSC 开源项目页面中就有 PyUnit 的页面),那么这俩其实是同一个东西——PyUnit 是 unittest 的曾用名,因为 Py...

lionets
2014/05/25
6.8K
1
Python 各种测试框架简介(三):nose

本篇将介绍的 nose 不再是 Python 官方发行版的标准包,但它与 unittest 有着千丝万缕的联系。比如 nose 的口号就是: 扩展 unittest,nose 让测试更简单。 简单在哪 -------自古(1970)以来...

lionets
2014/05/26
8.1K
1
Python 各种测试框架简介(四):pytest

pytest 有时也被称为 py.test,是因为它使用的执行命令是 。本文中我们使用 pytest 指代这个测试框架,py.test 特指运行命令。 较于 nose -------这里没有使用像前三篇一样(简介-举例-disc...

lionets
2014/05/27
14.3K
0
[翻译]pytest测试框架(二):使用

此文已由作者吴琪惠授权网易云社区发布。 欢迎访问网易云社区,了解更多网易技术产品运营经验。 调用pytest 调用命令: python -m pytest [...] 上面的命令相当于在命令行直接调用脚本 pyte...

网易云
2018/10/19
0
0
Python 程序员必知必会的开发者工具

Python已经演化出了一个广泛的生态系统,该生态系统能够让Python程序员的生活变得更加简单,减少他们重复造轮的工作。同样的理念也适用于工具开发者的工作,即便他们开发出的工具并没有出现在...

oschina
2014/02/09
15.3K
15

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
175
4
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
5
0
Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
昨天
8
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
昨天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部