Doctest提供了幾種調(diào)試doctest示例的機(jī)制:
""" >>> def f(x): ... g(x*2) >>> def g(x): ... print x+3 ... import pdb; pdb.set_trace() >>> f(3) 9 """
然后,一個交互式Python會話可能如下所示:
import a, doctest >>> doctest.testmod(a) --Return-- >(3)g()->None -> import pdb; pdb.set_trace() (Pdb) list 1 def g(x): 2 print x+3 3 -> import pdb; pdb.set_trace() EOF print x 6 (Pdb) step --Return-- > (2)f()->None -> g(x*2) (Pdb) list 1 def f(x): 2 -> g(x*2) EOF print x 3 (Pdb) step --Return-- > (1)?()->None -> f(3) (Pdb) cont (0, 3) >>>
在版本2.4中進(jìn)行了更改:pdb.set_trace()添加了在文檔測試中使用有用的功能。
將doctests轉(zhuǎn)換為Python代碼的函數(shù),并可能在調(diào)試器下運行綜合代碼:
doctest.script_from_examples(s)
將帶有示例的文本轉(zhuǎn)換為腳本。
參數(shù)s是一個包含doctest示例的字符串。該字符串被轉(zhuǎn)換為Python腳本,其中s中的doctest示例轉(zhuǎn)換為常規(guī)代碼,其他所有內(nèi)容都轉(zhuǎn)換為Python注釋。生成的腳本作為字符串返回。例如,
import doctest
print doctest.script_from_examples(r"""
Set x and y to 1 and 2.
>>> x, y = 1, 2
Print their sum:
>>> print x+y
3
""")
顯示:
# Set x and y to 1 and 2.
x, y = 1, 2
#
# Print their sum:
print x+y
# Expected:
## 3
該函數(shù)在其他函數(shù)的內(nèi)部使用(請參見下文),但是當(dāng)您想要將交互式Python會話轉(zhuǎn)換為Python腳本時,該函數(shù)也很有用。
2.4版本中的新功能。
doctest.testsource(module, name)
將對象的doctest轉(zhuǎn)換為腳本。
參數(shù)模塊是一個模塊對象,或者一個模塊的虛線名稱,包含其文檔感興趣的對象。參數(shù)名稱是具有感興趣的doctests的對象的名稱(在模塊內(nèi))。結(jié)果是一個字符串,包含對象的文檔字符串轉(zhuǎn)換為Python腳本,script_from_examples()如上所述。例如,如果模塊a.py包含頂級函數(shù)f(),那么
import a, doctest
print doctest.testsource(a, "a.f")
打印函數(shù)f()的文檔字符串的腳本版本,將文檔轉(zhuǎn)換為代碼,其余部分放在注釋中。
2.3版本的新功能。
doctest.debug(module, name[, pm])
調(diào)試對象的doctests。
該模塊和名稱參數(shù)是相同的功能testsource()之上。已命名對象的文檔字符串的合成Python腳本被寫入臨時文件,然后該文件在Python調(diào)試器的控制下運行pdb。
module.__dict__本地和全局執(zhí)行上下文都使用淺表副本。
可選參數(shù)pm控制是否使用驗尸調(diào)試。如果pm具有真值,則腳本文件將直接運行,并且僅當(dāng)腳本通過引發(fā)未處理的異常終止時才會涉及調(diào)試器。如果確實如此,則通過pdb.post_mortem()從未處理的異常中傳遞回溯對象來調(diào)用驗尸調(diào)試。如果pm沒有被指定,或者是false,那么通過傳遞一個適當(dāng)?shù)膃xecfile()調(diào)用來從腳本開始運行腳本pdb.run()。
2.3版本的新功能。
在版本2.4中更改:添加了pm參數(shù)。
doctest.debug_src(src[, pm][, globs])
用字符串調(diào)試doctests。
這與debug()上面的函數(shù)類似,只是通過src參數(shù)直接指定了包含doctest示例的字符串。
可選參數(shù)pm與debug()上面的函數(shù)具有相同的含義。
可選的參數(shù)globs給出了一個字典,用作本地和全局執(zhí)行上下文。如果未指定,或者None使用空字典。如果指定,則使用字典的淺表副本。
2.4版本中的新功能。
DebugRunner級和特殊的例外可能提高,最感興趣的測試框架的作者,并且只在這里勾勒。查看源代碼,尤其DebugRunner是docstring(這是一個doctest?。┮垣@取更多詳細(xì)信息:
class doctest.DebugRunner([checker][, verbose][, optionflags])
只要DocTestRunner遇到故障,它的一個子類就會引發(fā)異常。如果發(fā)生意外異常,則會引發(fā)UnexpectedException異常,包含測試,示例和原始異常。如果輸出不匹配,則會DocTestFailure引發(fā)異常,包含測試,示例和實際輸出。
有關(guān)構(gòu)造函數(shù)參數(shù)和方法的信息,請參閱DocTestRunner高級API一節(jié)中的文檔。
DebugRunner實例可能會引發(fā)兩個例外情況:
exception doctest.DocTestFailure(test, example, got)
DocTestRunner表示doctest示例的實際輸出與預(yù)期輸出不符的異常。構(gòu)造函數(shù)參數(shù)用于初始化相同名稱的屬性。
DocTestFailure 定義了以下屬性:
DocTestFailure.test
DocTest示例失敗時正在運行的對象。
DocTestFailure.example
Example失敗。
DocTestFailure.got
示例的實際輸出。
exception doctest.UnexpectedException(test, example, exc_info)
一個異常DocTestRunner提示表示doctest示例引發(fā)了意外異常。構(gòu)造函數(shù)參數(shù)用于初始化相同名稱的屬性。
UnexpectedException 定義了以下屬性:
UnexpectedException.test
DocTest示例失敗時正在運行的對象。
UnexpectedException.example
Example失敗。
UnexpectedException.exc_info
包含有關(guān)意外異常的信息的元組,返回的是sys.exc_info()。
更多建議: