對Python測試套件進行介紹分析
Python測試套件具有腳本語言中最豐富和強大的類庫,足以支持絕大多數日常應用。它的名字來源于一個喜劇,也許最初設計Python這種語言的人并沒有想到今天Python會在工業和科研上獲得如此廣泛的使用。
在比較長的文檔中,由三個大于號組成的 Python 提示符 >>> 是一個非常明顯的標志,它表示在 Python 提示上應該發生什么。正如在本系列的***篇文章中看到的,這可以出現在作為文檔的單獨的文本文件中:
- Doctest for truth and falsehood
- -------------------------------
- The truth values in Python, named "True" and "False",
- are equivalent to the Boolean numbers one and zero.
- >>> True == 1
- True
- >>> False == 0
- True
這種說明還可以出現在源代碼中模塊、類或函數的 docstring 中:
- def count_vowels(s):
- """Count the number of vowels in a string.
- >>> count_vowels('aardvark')
- 3
- >>> count_vowels('THX')
- 0
- """
- return len( c for c in s if c in 'aeiou')
當這些測試出現在文本文件中時(比如***個示例),文件就被稱為 docfile。當它們出現在 Python 源代碼中的 docstring 中時(比如第二個示例),它們就被稱為 doctest。因為 docfile 和 doctest 是編寫作為測試使用的文檔的常用方法(而且這也能夠表明文檔什么時候過時了),所以 py.test 和 nose 直接支持它們。
(zope.testing 的用戶必須使用標準 doctest 模塊中的 DocTestSuite 類為每個文件手工創建 Python 測試用例)。與用于尋找測試模塊的規則一樣,py.test 框架采用固定的過程支持 doctest,無法進行配置,這在項目之間實現標準化,但是限制了項目的靈活性。
如果啟用了它的Python測試套件,它就會在所有 Python 模塊(包括模塊名中不包含 test 的模塊)的文檔字符串中以及以 test_ 開頭和以 .txt 擴展名結尾的所有文本文件中尋找 doctest。
如果啟用了它的 -p restdoc 插件,那么不但執行 .txt 文件中的所有 doctest,py.test 還要求項目中的每個 .txt 文件都是有效的 Restructured Text 文件。如果它們造成解析錯誤,py.test 會發出警告。還可以通過命令行選項讓這個插件檢查文檔中指定的 URL,然后生成每個 .txt 文本文件的 HTML 版本。
doctest-tests 是干擾最小的選項,它只要求 nose 在已經檢查的測試模塊的 docstring 中尋找 doctest。with-doctest 選項的影響比較大。它要求 nose 搜索所有一般模塊(不是測試但包含一般代碼的模塊),尋找并運行它們的 docstring 中的 doctest。#t#
***,--doctest-extension 允許指定文件擴展名(我認識的大多數開發人員選擇 .txt、.rst 或 .doctest)。這要求 nose 讀取項目中具有指定的擴展名的所有文本文件,運行并檢查它找到的所有Python測試套件。
盡管 py.test 和 nose 在這方面的特性集非常相似,但是我更喜歡 nose 的方式。我喜歡對所有 Restructured Text 文件使用非標準的 .rst 擴展名,這樣就可以讓文本編輯器能夠識別它們并對它們應用特殊的語法突出顯示。
【編輯推薦】