Python 各類測試框架簡介(一):doctest

doctest 是一個 Python 發行版自帶的標準模塊。本篇將分別對使用 doctest 的兩種方式——嵌入到源代碼中和作成獨立文件作基本介紹。 <br /> ##doctest 的概念模型

在 Python 的官方文檔中,對 doctest 的介紹是這樣的:python

doctest 模塊會搜索那些看起來像交互式會話的 Python 代碼片斷,而後嘗試執行並驗證結果shell

即便從沒接觸過 doctest,咱們也能夠從這個名字中窺到一絲端倪。「它看起來就像代碼裏的文檔字符串(docstring)同樣」 若是你這麼想的話,就已經對了一半了。bash

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。命令行

示例的運行輸出爲:code

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 /> ##獨立文件模式

若是不想(或不能)把測試用例寫進源代碼裏,則還能夠使用一個獨立的文本文件來保存測試用例。ip

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
相關文章
相關標籤/搜索