doctest 調(diào)試

2022-08-03 17:10 更新

Doctest提供了幾種調(diào)試doctest示例的機(jī)制:

  • 幾個(gè)函數(shù)將doctests轉(zhuǎn)換為可執(zhí)行的Python程序,可以在Python調(diào)試器下運(yùn)行pdb。
  • DebugRunner類是的一個(gè)子類DocTestRunner的是提高用于第一故障的例子的異常,包含有關(guān)實(shí)施例的信息。該信息可用于對(duì)示例執(zhí)行事后調(diào)試。
  • unittest通過(guò)DocTestSuite()支持由debug()所定義的方法生成的案例unittest.TestCase。
  • 您可以pdb.set_trace()在doctest示例中添加調(diào)用,并在執(zhí)行該行時(shí)放入Python調(diào)試器。然后你可以檢查變量的當(dāng)前值,等等。例如,假設(shè)a.py只包含這個(gè)模塊docstring:
""" >>> def f(x): ... g(x*2) >>> def g(x): ... print x+3 ... import pdb; pdb.set_trace() >>> f(3) 9 """

然后,一個(gè)交互式Python會(huì)話可能如下所示:

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()添加了在文檔測(cè)試中使用有用的功能。

將doctests轉(zhuǎn)換為Python代碼的函數(shù),并可能在調(diào)試器下運(yùn)行綜合代碼:

doctest.script_from_examples(s)

將帶有示例的文本轉(zhuǎn)換為腳本。

參數(shù)s是一個(gè)包含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)部使用(請(qǐng)參見(jiàn)下文),但是當(dāng)您想要將交互式Python會(huì)話轉(zhuǎn)換為Python腳本時(shí),該函數(shù)也很有用。

2.4版本中的新功能。

doctest.testsource(module, name)

將對(duì)象的doctest轉(zhuǎn)換為腳本。

參數(shù)模塊是一個(gè)模塊對(duì)象,或者一個(gè)模塊的虛線名稱,包含其文檔感興趣的對(duì)象。參數(shù)名稱是具有感興趣的doctests的對(duì)象的名稱(在模塊內(nèi))。結(jié)果是一個(gè)字符串,包含對(duì)象的文檔字符串轉(zhuǎn)換為Python腳本,script_from_examples()如上所述。例如,如果模塊a.py包含頂級(jí)函數(shù)f(),那么

import a, doctest
print doctest.testsource(a, "a.f")

打印函數(shù)f()的文檔字符串的腳本版本,將文檔轉(zhuǎn)換為代碼,其余部分放在注釋中。

2.3版本的新功能。

doctest.debug(module, name[, pm])

調(diào)試對(duì)象的doctests。

該模塊和名稱參數(shù)是相同的功能testsource()之上。已命名對(duì)象的文檔字符串的合成Python腳本被寫(xiě)入臨時(shí)文件,然后該文件在Python調(diào)試器的控制下運(yùn)行pdb。

module.__dict__本地和全局執(zhí)行上下文都使用淺表副本。

可選參數(shù)pm控制是否使用驗(yàn)尸調(diào)試。如果pm具有真值,則腳本文件將直接運(yùn)行,并且僅當(dāng)腳本通過(guò)引發(fā)未處理的異常終止時(shí)才會(huì)涉及調(diào)試器。如果確實(shí)如此,則通過(guò)pdb.post_mortem()從未處理的異常中傳遞回溯對(duì)象來(lái)調(diào)用驗(yàn)尸調(diào)試。如果pm沒(méi)有被指定,或者是false,那么通過(guò)傳遞一個(gè)適當(dāng)?shù)膃xecfile()調(diào)用來(lái)從腳本開(kāi)始運(yùn)行腳本pdb.run()。

2.3版本的新功能。

在版本2.4中更改:添加了pm參數(shù)。

doctest.debug_src(src[, pm][, globs])

用字符串調(diào)試doctests。

這與debug()上面的函數(shù)類似,只是通過(guò)src參數(shù)直接指定了包含doctest示例的字符串。

可選參數(shù)pm與debug()上面的函數(shù)具有相同的含義。

可選的參數(shù)globs給出了一個(gè)字典,用作本地和全局執(zhí)行上下文。如果未指定,或者None使用空字典。如果指定,則使用字典的淺表副本。

2.4版本中的新功能。

DebugRunner級(jí)和特殊的例外可能提高,最感興趣的測(cè)試框架的作者,并且只在這里勾勒。查看源代碼,尤其DebugRunner是docstring(這是一個(gè)doctest?。┮垣@取更多詳細(xì)信息:

class doctest.DebugRunner([checker][, verbose][, optionflags])

只要DocTestRunner遇到故障,它的一個(gè)子類就會(huì)引發(fā)異常。如果發(fā)生意外異常,則會(huì)引發(fā)UnexpectedException異常,包含測(cè)試,示例和原始異常。如果輸出不匹配,則會(huì)DocTestFailure引發(fā)異常,包含測(cè)試,示例和實(shí)際輸出。

有關(guān)構(gòu)造函數(shù)參數(shù)和方法的信息,請(qǐng)參閱DocTestRunner高級(jí)API一節(jié)中的文檔。

DebugRunner實(shí)例可能會(huì)引發(fā)兩個(gè)例外情況:

exception doctest.DocTestFailure(test, example, got)

DocTestRunner表示doctest示例的實(shí)際輸出與預(yù)期輸出不符的異常。構(gòu)造函數(shù)參數(shù)用于初始化相同名稱的屬性。

DocTestFailure 定義了以下屬性:

DocTestFailure.test

DocTest示例失敗時(shí)正在運(yùn)行的對(duì)象。

DocTestFailure.example

Example失敗。

DocTestFailure.got

示例的實(shí)際輸出。

exception doctest.UnexpectedException(test, example, exc_info)

一個(gè)異常DocTestRunner提示表示doctest示例引發(fā)了意外異常。構(gòu)造函數(shù)參數(shù)用于初始化相同名稱的屬性。

UnexpectedException 定義了以下屬性:

UnexpectedException.test

DocTest示例失敗時(shí)正在運(yùn)行的對(duì)象。

UnexpectedException.example

Example失敗。

UnexpectedException.exc_info

包含有關(guān)意外異常的信息的元組,返回的是sys.exc_info()。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)