Python 利用doctest模塊進行文檔測試?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
所謂文檔測試,指的是通過 doctest 模塊運行 Python 源文件的說明文檔中的測試用例,從而生成測試報告。
前面在查看 Python 的模塊文檔時,經常會看到如下信息:
>>>os.path.commonprefix (['/usr/lib','/usr/local/lib']) '/usr/1' >>>os.path.commonpath(['/usr/lib', '/usr/local/lib']) '/usr'
用戶完全可以將這些代碼拷貝到 Python 的交互式解釋器中運行,然后可以看到運行結果與文檔中示例代碼的輸出結果完全一致。
上面的說明就是文檔測試的注釋,文檔測試工具可以提取說明文檔中的測試用例,其中“>>>”之后的內容表示測試用例,接下來的一行則代表該測試用例的輸出結果。文檔測試工具會判斷測試用例的運行結果與輸出結果是否一致,如果不一致就會顯示錯誤信息。
現在定義一個簡單的模塊,該模塊包含一個函數和一個類,程序為該函數和該類提供了說明文檔,該文檔中包含了測試用例。程序代碼如下:
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 個測試沒有通過,在 User 類中有兩個測試沒有通過,在 square() 函數中有兩個測試沒有通過。這是因為上面程序中 ① ② 兩行代碼故意寫錯了,其中 ① 號代碼用于計算 x 的平方,應該寫成 x**2,但漏寫了一個星號;② 號代碼則應該用傳入的 name 參數對 self.name 賦值。
上面顯示的測試輸出結果也很清晰,每個測試用例結果都包含如下 4 部分:
第一部分:顯示在哪個源文件的哪一行。
第二部分:Failed example,顯示是哪個測試用例出錯了。
第三部分:Expected,顯示程序期望的輸出結果。也就是在“>>>命令”的下一行給出的運行結果,它就是期望結果。
第四部分:Got,顯示程序實際運行產生的輸出結果。只有當實際運行產生的輸出結果與期望結果一致時,才表明該測試用例通過。
將上面程序中 ① ② 兩行代碼修改正確,再次使用 python 命令來運行程序,將看不到任何輸出結果,說明文檔測試中的所有測試用例都通過了。
由此可見,Python 為文檔注釋提供了 doctest 模塊,該模塊的用法非常簡單,程序只要導入該模塊,并調用該模塊的 testmod() 函數即可。testmod() 函數會自動提取該模塊的說明文檔中的測試用例,并執行這些測試用例,最終生成測試報告。如果存在沒有通過的測試用例,程序就會顯示有多少個測試用例沒有通過;如果所有測試用例都能通過測試,則不生成任何輸出結果。
關于Python 利用doctest模塊進行文檔測試問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。