更新日誌

版本遵循語義化版本控制 (<major>.<minor>.<patch>)。

向後不相容(重大)變更只會在主要版本中引入,並在發布版本的棄用章節中提前通知。

pytest 8.3.5 (2025-03-02)

錯誤修復

  • #11777:修復了即使使用 -vv 詳細程度,序列仍然被縮短的問題。

  • #12888:修復了當使用 Python 3.13+ 和 Python 的 libedit 建置版本時,例如在 macOS 上或使用來自 python-build-standalone 專案的 uv 管理的 Python 二進制檔案時,輸入中斷的問題。這可能會表現為例如在使用 Pdb 時提示符號損壞,或在使用 input() 手動使用和暫停捕獲時看到空輸入。

  • #13026:修復了當頂層目錄與標準庫的另一個模組同名時,使用 --import-mode=importlib 時的 AttributeError 崩潰。

  • #13053:修復了 pytest 8.3.4 中的回歸問題,其中當使用 --import-mode=importlib 時,包含同名 py 檔案的目錄將導致 ImportError

  • #13083:修復了當收集的目錄之一在收集期間被移除時,pytest 可能會崩潰的問題。

改進的文件

面向貢獻者的變更

  • #13112:修復了 Pygments >= 2.19.0 時 test_terminal.py 中的自我測試失敗。

  • #13256:在建置 Sphinx 文件時,已重新啟用對 2024 年發布的 Towncier 版本的支援 – 由 @webknjaz

pytest 8.3.4 (2024-12-01)

錯誤修復

  • #12592:修復了在目錄佈局中,當目錄包含同名子目錄時,使用 --import-mode=importlib 時的 KeyError 崩潰。

  • #12818:斷言重寫現在保留了原始指令的原始範圍,使其可以與處理 AST 的工具(如 executing)良好地協同工作。

  • #12849:用於彩色輸出的 ANSI 轉義代碼現在在 pytest.fail()pytrace=False 中正確處理。

  • #9353pytest.approx() 現在在給定布林值時使用嚴格相等。

改進的文件

面向貢獻者的變更

  • #12497:修復了 Python 3.13 上兩個與 pdb 相關的測試失敗。

pytest 8.3.3 (2024-09-09)

錯誤修復

  • #12446:避免在 fixture 發現期間調用 @property(和其他實例描述器)– 由 @asottile

  • #12659:修復了在 pytest>=8.1 中使用參數 --import-mode=importlib 時不顯示斷言失敗差異的問題。

  • #12667:修復了 ExceptionInfo.errisinstance 中的類型變更導致 mypy 失敗的回歸。

  • #12744:修復了與 Python 3.9 或更低版本的類型相容性 – 將 typing.Self 替換為 typing_extensions.Self – 由 @Avasam

  • #12745:修復了 Windows 上節點 ID 路徑中反斜線被錯誤轉換的問題,確保跨環境的一致路徑處理。

  • #6682:修復了當列印失敗斷言的 “msg” 部分(如 assert condition, msg 中)時,沒有遵守詳細程度級別的錯誤。

  • #9422:修復了通過 -p no:terminal 禁用終端插件會導致與缺少 verbose 選項相關的崩潰的錯誤。

    – 由 @GTowers1

改進的文件

  • #12663:闡明了當項目被取消選擇時,應從 pytest_collection_modifyitems hook 實作中調用 pytest_deselected hook。

  • #12678:從文檔中的 tmp_path_retention_policy 範例中移除錯誤的引號。

其他內部變更

  • #12769:修復了 codespell 發現的錯字,並將 codespell 新增到 pre-commit hooks。

pytest 8.3.2 (2024-07-24)

錯誤修復

pytest 8.3.1 (2024-07-20)

8.3.0 版本未能包含發布版本的變更說明和文檔。此修補程式版本彌補了這一點。沒有其他變更。

pytest 8.3.0 (2024-07-20)

新功能

  • #12231:新增了 --xfail-tb 標誌,該標誌為 XFAIL 結果開啟追溯輸出。

    • 如果未給定 --xfail-tb 標誌,則不會顯示 XFAIL 結果的追溯。

    • XFAIL 的追溯風格使用 --tb 設定,可以是 auto|long|short|line|native|no

    • 注意:即使您設定了 --xfail-tb,如果您使用 --tb=no,您也不會看到它們。

    一些歷史

    在 pytest 8.0 中,-rx-ra 不僅會開啟 xfail 的摘要報告,還會報告 xfail 結果的追溯。這導致了一些利用 xfail 的專案出現問題,但它們不希望看到所有的 xfail 追溯。

    此變更將 xfail 追溯從 -rx 中分離出來,現在我們使用 --xfail-tb 開啟 xfail 追溯。這樣,預設的 -rx/ -ra 行為在 xfail 追溯方面與 8.0 之前的版本相同。雖然這是一個行為變更,但它將預設行為帶回到了 8.0.0 之前的行為,這最終被認為是更好的做法。

    – 由 @okken

  • #12281:新增了對標記表達式中關鍵字匹配的支援。

    現在可以通過標記關鍵字參數選擇測試。支援的值為 int、(未轉義的) strboolNone

    請參閱 標記範例 以獲取更多資訊。

    – 由 @lovetheguitar

  • #12567:新增了 --no-fold-skipped 命令列選項。

    如果設定了此選項,則簡短摘要中的跳過測試不再按原因分組,而是所有測試都以與其他狀態相同的方式單獨列印,並帶有其節點 ID。

    – 由 @pbrezina

現有功能的改進

  • #12469:控制台輸出現在使用 “第三方插件” 術語,取代了先前建立但令人困惑且過時的對 setuptools 的引用 – 由 @webknjaz

  • #12544, #12545:通過檢查 pyvenv.cfg 檔案改進了 Python 虛擬環境偵測,確保在各種平台上的可靠偵測 – 由 @zachsnickers

  • #2871:在使用 -vvv 執行時,不要截斷輸出中函數的參數。

  • #389:增強了綁定方法的斷言內省的可讀性 – 由 @farbodahm, @webknjaz, @obestwalter, @flub@glyphack

    早期的樣子是

    =================================== FAILURES ===================================
    _____________________________________ test _____________________________________
    
        def test():
    >       assert Help().fun() == 2
    E       assert 1 == 2
    E        +  where 1 = <bound method Help.fun of <example.Help instance at 0x256a830>>()
    E        +    where <bound method Help.fun of <example.Help instance at 0x256a830>> = <example.Help instance at 0x256a830>.fun
    E        +      where <example.Help instance at 0x256a830> = Help()
    
    example.py:7: AssertionError
    =========================== 1 failed in 0.03 seconds ===========================
    

    現在的樣子是

    =================================== FAILURES ===================================
    _____________________________________ test _____________________________________
    
        def test():
    >       assert Help().fun() == 2
    E       assert 1 == 2
    E        +  where 1 = fun()
    E        +    where fun = <test_local.Help object at 0x1074be230>.fun
    E        +      where <test_local.Help object at 0x1074be230> = Help()
    
    test_local.py:13: AssertionError
    =========================== 1 failed in 0.03 seconds ===========================
    
  • #7662:將時區資訊新增到 JUnit XML 報告中的測試套件時間戳。

錯誤修復

  • #11706:修復了當使用 --maxfail--stepwise 時,更高範圍 fixture 中 teardown 錯誤的報告。

    最初在 pytest 8.0.0 中新增,但由於 pytest-xdist 中的回歸而在 8.0.2 中還原。此回歸已在 pytest-xdist 3.6.1 中修復。

  • #11797pytest.approx() 現在正確處理類似 Sequence 的物件。

  • #12204, #12264:修復了 pytest 8.0 中的回歸問題,其中當多個測試由於共享的更高範圍 fixture 引發異常而失敗時,追溯會變得越來越長 – 由 @bluetech

    還修復了 pytest 5.4 中收集器在設定期間引發異常的類似回歸問題。

    此修復需要內部變更,可能會影響某些插件

    • FixtureDef.cached_result[2] 現在是一個元組 (exc, tb) 而不是 exc

    • SetupState.stack 失敗現在是一個元組 (exc, tb) 而不是 exc

  • #12275:修復了在遇到 abstract 類別(包括抽象 unittest.TestCase 子類別)時的收集錯誤。

  • #12328:修復了 pytest 8.0.0 中的回歸問題,其中在某些情況下,套件範圍的參數化項目未正確重新排序以最小化設定/拆解。

  • #12424:修復了當使用像 pytest-rerunfailures 這樣的插件重新執行 unittest 測試時,assert testcase is not None 斷言失敗導致的崩潰。在 8.2.2 中回歸。

  • #12472:修復了當從 pytest_report_teststatus hook 返回類別 "error""failed" 以及自訂測試狀態時的崩潰 – @pbrezina

  • #12505:通過提供清晰的錯誤訊息,改進了 pytest.raises(match=r'...') 中無效正則表達式模式的處理。

  • #12580:修復了在 Windows 上使用緩存類別且緩存目錄同時建立時的崩潰。

  • #6962:參數化參數現在使用 == 而不是 is 進行比較(如果參數不支持 ==,則仍然使用 is 作為後備)。這修復了使用列表等參數的問題,這些參數具有不同的 id 但比較相等,導致 fixture 被重新計算而不是被緩存。

  • #7166:修復了當與 pytest-xdist -n 一起運行時,進度百分比(螢幕邊緣的 [ 87%])有時未正確對齊的問題。

改進的文件

  • #12153:記錄了使用 PYTEST_VERSION 來偵測代碼是否從 pytest 運行中運行。

  • #12469:文檔中對外部插件的提及現在避免提及 setuptools entry-points,因為這個概念現在更通用。相反,“外部”、“已安裝” 或 “第三方” 插件(或套件)的術語取代了它。

    – 由 @webknjaz

  • #12577CIBUILD_NUMBER 環境變數的角色在參考文檔中描述。它們現在也出現在執行 pytest -h 時 – 由 @MarcBresson

面向貢獻者的變更

  • #12467:通過使用 annotations 未來導入,將所有內部類型註釋遷移到 python3.10+ 風格。

    – 由 @RonnyPfannschmidt

  • #11771, #12557:PyPy 運行時版本已從 3.8 更新到 3.9,3.8 在垃圾收集器中引入了一個不穩定的錯誤,預計不會在那裡修復,因為 3.8 已終止生命週期。

    – 由 @x612skm

  • #12493:變更日誌草稿預覽整合已重構為使用第三方擴展 sphinxcontib-towncrier。先前的內部腳本將變更日誌預覽檔案放在 doc/en/_changelog_towncrier_draft.rst。該檔案不再在 Git 中被忽略,並且可能會在貢獻者的開發環境中顯示為未追蹤的檔案。為了解决這個問題,貢獻者可以運行以下命令來清理它

    $ git clean -x -i -- doc/en/_changelog_towncrier_draft.rst
    

    – 由 @webknjaz

  • #12498:所有未記錄的 tox 環境現在都有描述。它們可以通過在終端機中調用 tox -av 在一個人的開發環境中列出。

    – 由 @webknjaz

  • #12501:更新了變更日誌配置,以引入更準確的針對受眾的類別。以前,有一個 trivial 變更日誌片段類型,其含義不明確且廣泛。它已被移除,我們現在有 contribmiscpackaging 來代替它。

    新的變更說明類型針對下游封裝者和專案貢獻者。此外,雜項章節保留用於不適合任何其他地方的未指定更新。

    – 由 @webknjaz

  • #12502:更新了 GitHub 自動化發出拉取請求以更新插件列表的 UX。以前,維護者必須關閉自動建立的拉取請求並重新打開它們以觸發 CI 運行。從現在開始,他們只需要點擊 Ready for review 按鈕即可。

    – 由 @webknjaz

  • #12522:由於開始使用來自第三方 sphinx-issues Sphinx 擴展的實作,:pull: RST 角色已替換為更短的 :pr: – 由 @webknjaz

  • #12531:更新了覆蓋率報告配置,以從覆蓋率報告中排除 pytest 自己的標記為預期失敗的測試。這具有減少不穩定測試對結果數字的影響的效果。

    – 由 @webknjaz

  • #12533:不再啟用 extlinks Sphinx 擴展。它曾經聲明的 :bpo: 角色已隨之移除。BPO 本身幾年前已遷移到 GitHub,並且可以使用其 GitHub issue 編號和 sphinx-issues 擴展實作的 :issue: 角色連結各自的問題。

    – 由 @webknjaz

  • #12562: 可能的錯字在使用 :user: RST 角色中,現在已透過 pre-commit 工具整合進行檢查 – 由 @webknjaz 貢獻。

pytest 8.2.2 (2024-06-04)

錯誤修正

  • #12355: 修正特定參數化模式涉及多個高作用域參數時,可能發生的災難性效能下降問題。

  • #12367: 修正 pytest 8.2.0 中的回歸錯誤,其中 unittest 類別實例(每個測試都會建立一個新的實例)在測試拆卸時沒有立即釋放,而僅在會話拆卸時釋放。

  • #12381: 修正可能因並行快取目錄 (.pytest_cache) 建立而引起的 “目錄非空” 崩潰問題。此問題在 pytest 8.2.0 中回歸。

改進文件

  • #12290: 更新 Sphinx 主題以使用 Furo 而非 Flask,啟用深色模式主題。

  • #12356: 在偵錯不穩定測試的文件中新增子章節,提及 pytest 中缺乏執行緒安全可能是造成不穩定的原因之一。

  • #12363: 文件網頁現在連結到規範版本,以減少搜尋引擎結果中過時的文件。

pytest 8.2.1 (2024-05-19)

改進

  • #12334: 支援 Python 3.13(撰寫時為 beta1 版本)。

錯誤修正

  • #12120: 修正命令列上未選取目錄時,可能發生的 PermissionError 崩潰問題。

  • #12191: 鍵盤中斷和系統退出現在在測試收集期間可以正確處理。

  • #12300: 修正在 squashfuse_ll 下 ‘Function not implemented’ 錯誤的處理方式,這是一種表示掛載點唯讀的不同方式。

  • #12308: 修正 pytest 8.2.0 中的回歸錯誤,其中自動建立的 .pytest_cache 目錄權限變成 rwx------,而不是預期的 rwxr-xr-x

微小/內部變更

  • #12333: pytest 發行版本現在使用 GitHub 最近推出的 Artifact Attestation 支援進行證明,允許使用者驗證 pytest 的 sdist 和 wheel artifacts 的來源。

pytest 8.2.0 (2024-04-27)

重大變更

  • #12089: pytest 現在要求 unittest.TestCase 子類別可以使用 MyTestCase('runTest') 自由地實例化。

    如果類別不允許這樣做,您可能會在收集期間看到錯誤,例如 AttributeError: 'MyTestCase' object has no attribute 'runTest'

    不覆寫 __init__,或不在 __init__ 中使用 getattr 或類似方法存取測試方法的類別不受影響。

    這樣做的類別應注意在給定 "runTest" 時不要崩潰,如 unittest.TestCases 的實作所示。或者,考慮使用 setUp 而不是 __init__

    如果您在使用 tornado.AsyncTestCase 時遇到此問題,請參閱 issue 12263

    如果您在使用抽象 TestCase 子類別時遇到此問題,請參閱 issue 12275

    歷史記錄:此變更對自訂 TestCase 實作的影響最初未被適當考慮,這就是為什麼它在次要版本中完成的原因。對於造成的不便,我們深感抱歉。

棄用

新功能

  • #11871: 新增支援從檔案讀取命令列引數,使用前綴字元 @,例如:pytest @tests.txt。檔案每行必須有一個引數。

    有關詳細資訊,請參閱 從檔案讀取引數

改進

錯誤修正

  • #12065: 修正 pytest 8.0.0 中的回歸錯誤,其中包含 setup_method 的測試類別和使用 @staticmethod@classmethod 的測試會崩潰,出現 AttributeError: 'NoneType' object has no attribute 'setup_method'

    現在,使用 @staticmethod@classmethod 的測試的 request.instance 屬性不再是 None,而是類別的新實例,就像在非靜態方法中一樣。 之前它是 None,並且此類測試的所有 fixture 都會共用一個 self

  • #12135: 修正 fixture 多次將其 finalizer 新增到它們請求的 fixture 時,會導致某些情況下拆卸順序不可靠且不直觀的問題。

  • #12194: 修正 --importmode=importlib--doctest-modules 的錯誤,其中子模組不會顯示為父模組中的屬性。

  • #1489: 修正在某些情況下,較高作用域 fixture 的拆卸不會以它們初始化的相反順序發生的問題。

微小/內部變更

  • #12069: 現在需要 pluggy>=1.5.0

  • #12167: 快取: 在暫存目錄中建立支援檔案 (CACHEDIR.TAG.gitignore 等),以提供原子語意。

pytest 8.1.2 (2024-04-26)

錯誤修正

pytest 8.1.1 (2024-03-08)

注意

此版本不是通常的錯誤修正版本 – 它包含新功能和改進,是 8.1.0 的後續版本,8.1.0 已從 PyPI 撤回。

新功能

改進

  • #10865: pytest.warns() 現在驗證是否使用 strWarning 呼叫了 warnings.warn()。目前在 Python 中可以使用其他類型,但是當使用 warnings.filterwarnings() 過濾這些警告時,會導致例外狀況(請參閱 CPython #103577 以進行討論)。雖然這可以被認為是 CPython 中的錯誤,但我們決定在 pytest 中加入防護,因為在沒有此檢查的情況下產生的錯誤訊息令人困惑。

  • #11311: 當在沒有定義組態檔的情況下,使用 --override-ini 處理路徑時,目前工作目錄將用作相對目錄。

    先前,這會引發 AssertionError

  • #11475: –import-mode=importlib 現在嘗試使用標準匯入機制匯入模組(但仍然不更改 sys.path),只有在失敗時才回退到直接匯入模組。

    這表示如果可能,已安裝的套件將首先以其規範名稱匯入,例如 app.core.models,而不是始終從其路徑衍生模組名稱(例如 .env310.lib.site_packages.app.core.models)。

  • #11801: 在節點上新增 iter_parents() 輔助方法。它類似於 listchain,但從底部到頂部,並返回迭代器,而不是列表。

  • #11850: 針對 Python>=3.12 的事後偵錯新增對 sys.last_exc 的支援。

  • #11962: 如果找不到其他適合的組態檔候選者,則 pyproject.toml(即使沒有 [tool.pytest.ini_options] 表格)將被視為組態檔並定義 rootdir

  • #11978: 為記錄外掛程式新增 --log-file-mode 選項,啟用附加到記錄檔。此選項接受 "w""a",預設為 "w"

    先前,模式硬式編碼為 "w",這會在記錄之前截斷檔案。

  • #12047: 當 fixture 的多個 finalizer 引發例外狀況時,現在所有例外狀況都會作為例外狀況群組報告。先前,僅報告第一個例外狀況。

錯誤修正

  • #11475: 修正 --importmode=importlib 會多次匯入非測試模組的回歸錯誤。

  • #11904: 修正 pytest 8.0.0 中的回歸錯誤,該錯誤在使用 --pyargs 時會導致測試收集因權限錯誤而失敗。

    此變更改進了使用 --pyargs 指定的測試的收集樹,請參閱 #12043 以比較 pytest 8.0 和 <8。

  • #12011: 修正 8.0.1 中的回歸錯誤,即當傳遞 --doctest-modules 時,不會執行 setup_module xunit 樣式 fixture。

  • #12014: 修正警告在 fixture 上使用的標記時使用的 stacklevel

  • #12039: 修正 8.0.2 中的回歸錯誤,其中在 Windows 下的 CI 中多次收集使用 tmp_path 建立的測試。

改進文件

  • #11790: 更詳細地記錄使用 tmp_path fixture 建立的暫存目錄的保留。

微小/內部變更

  • #11785: 對私有函數進行了一些變更,可能會影響存取它們的外掛程式

    • FixtureManager._getautousenames() 現在接受 Node 本身,而不是 nodeid。

    • FixtureManager.getfixturedefs() 現在接受 Node 本身,而不是 nodeid。

    • _pytest.nodes.iterparentnodeids() 函數已移除,沒有替代品。建議改為遍歷節點階層本身。如果真的需要,請從先前的 pytest 版本複製該函數。

  • #12069: 將以下功能的棄用延遲到 9.0.0

    8.1.0 發行後發現,關於即將移除的警告未顯示,因此團隊決定恢復移除。

    這是 8.1.0 被撤回的原因。

pytest 8.1.0 (已撤回)

注意

此版本已**撤回**:由於某些警告未如預期顯示,它在沒有適當警告期的情況下破壞了一些外掛程式。

請參閱 #12069

pytest 8.0.2 (2024-02-24)

錯誤修正

  • #11895: 修正 Windows 上的收集問題,其中初始路徑包含路徑的短版本(例如 c:\PROGRA~1\tests)。

  • #11953: 修正從 getstatementrange_ast 引發的 IndexError 崩潰。

  • #12021: 恢復 pytest 8.0.0 中對 --maxfail 處理的修正,因為它在 pytest-xdist 中引起了回歸錯誤,其中當達到 max-fails 時,會話 fixture 拆卸可能會多次執行。

pytest 8.0.1 (2024-02-16)

錯誤修正

  • #11875: 正確處理 Python 3.13 中來自 getpass.getuser() 的錯誤。

  • #11879: 修正 ExceptionInfo._stringify_exception 可能會使 pytest.raises() 崩潰的邊緣情況。

  • #11906: 修正 pytest.warns() 使用在其 __init__ 中有多個參數的自訂警告子類別的回歸錯誤。

  • #11907: 修正 pytest 8.0.0 中的回歸錯誤,其中在 pytest.warns() 區塊內呼叫 pytest.skip() 和類似的控制流程例外狀況會被抑制而不是傳播。

  • #11929: 修正 pytest 8.0.0 中的回歸錯誤,其中模組中定義的 autouse fixture 會被模組中的 doctest 忽略。

  • #11937: 修正 pytest 8.0.0 中的回歸錯誤,其中在某些情況下,項目會以相反的順序收集。

pytest 8.0.0 (2024-01-27)

錯誤修正

  • #11842: 在寫入 JUnit XML 檔案時,正確逸出 skip 標記的 reason

  • #11861: 使用 %f 定義符的 log-date-format 時,避免微秒超過 1_000_000,這可能會導致測試套件崩潰。

pytest 8.0.0rc2 (2024-01-17)

改進

  • #11233: -r 對於 xfailures 和 xpasses 的改進

    • 當設定 -rx 時,報告 xfailures 的追溯。

    • 當設定 -rX 時,報告 xpasses 的捕獲輸出。

    • 對於 xpasses,在測試名稱和原因之間的摘要中新增 -,以符合 xfail 的顯示方式。

  • #11825: pytest_plugin_registered hook 有一個新的 plugin_name 參數,其中包含 plugin 註冊的名稱。

錯誤修正

  • #11706: 修正當使用 --maxfail--stepwise 時,較高作用域 fixture 中拆卸錯誤的報告。

    注意:此變更已在 pytest 8.0.2 中恢復,以修正在 pytest-xdist 中引起的 回歸錯誤

  • #11758: 修正 IndexError: string index out of range 崩潰,發生在 if highlighted[-1] == "\n" and source[-1] != "\n" 中。此錯誤是在 pytest 8.0.0rc1 中引入的。

  • #9765, #11816: 修復了一個令人沮喪的錯誤,該錯誤困擾著一些使用者,唯一的錯誤是 assert mod not in mods。問題的原因是 str(Path(mod))mod.__file__ 不一定產生相同的字串,並且在程式碼的某些地方被錯誤地交替使用。

    此修復也破壞了 PytestPluginManager.consider_conftest 的內部 API,方法是引入一個新參數 – 我們提到這一點是為了以防外部程式碼正在使用它,即使它被標記為 *私有*。

pytest 8.0.0rc1 (2023-12-30)

重大變更

舊的棄用現在是錯誤

  • #7363: **PytestRemovedIn8Warning 棄用警告現在預設為錯誤。**

    根據我們盡可能減少中斷來移除棄用功能的計劃,現在預設情況下,所有 PytestRemovedIn8Warning 類型的警告都會產生錯誤,而不是警告訊息。

    **受影響的功能將在 pytest 8.1 中有效移除**,因此請查閱文件中的 棄用和移除 章節,以取得有關如何更新現有程式碼的指示。

    在 pytest 8.0.X 系列中,可以透過將以下內容新增到您的 pytest.ini 檔案中,將錯誤改回警告作為權宜之計

    [pytest]
    filterwarnings =
        ignore::pytest.PytestRemovedIn8Warning
    

    但是當 pytest 8.1 發行時,這將停止運作。

    **如果您對移除特定功能有疑慮**,請在 #7363 中新增評論。

版本相容性

集合變更

在此版本中,我們對 pytest 的集合階段進行了數項重大變更,特別是關於檔案系統目錄和 Python 套件的集合方式,修正了缺陷,並允許清理和改進 pytest 的內部結構。這些變更無法進行停用期。

  • #7777:現在檔案和目錄會聯合依字母順序收集,除非被外掛程式變更。先前,檔案會在目錄之前收集。範例請見下方。

  • #8976:執行 pytest pkg/__init__.py 現在只會收集 pkg/__init__.py 檔案(模組)。先前,它會收集整個 pkg 套件,包括目錄中的其他測試檔案,但不包括 __init__.py 檔案本身的測試(除非 python_files 已變更為允許 __init__.py 檔案)。

    若要收集整個套件,請僅指定目錄:pytest pkg

  • #11137pytest.Package 不再是 pytest.Modulepytest.File

    Package 收集器節點指定一個 Python 套件,也就是具有 __init__.py 檔案的目錄。先前 Packagepytest.Module 的子類型(代表單一 Python 模組),該模組是 __init__.py 檔案。這已被視為設計上的錯誤(詳情請參閱 #11137#7777)。

    Package 節點的 path 屬性現在指向套件目錄,而不是 __init__.py 檔案。

    請注意,__init__.pyModule 節點(不是 Package)可能仍然存在,如果在集合期間被選取(例如,如果您將 python_files 設定為包含 __init__.py 檔案)。

  • #7777:新增了新的 pytest.Directory 基礎集合節點,所有檔案系統目錄的收集器節點都應繼承自此節點。這類似於現有的檔案節點 pytest.File

    pytest.Package 變更為 pytest.Directory 的子類別。Package 代表一個檔案系統目錄,該目錄是一個 Python 套件,即包含 __init__.py 檔案。

    pytest.Package 現在只收集其自身目錄中的檔案;先前它會遞迴收集。子目錄會被收集為它們自己的收集器節點,然後自行收集,從而建立一個反映檔案系統階層的集合樹狀結構。

    新增了新的 pytest.Dir 具體集合節點,它是 pytest.Directory 的子類別。此節點代表一個檔案系統目錄,它不是 pytest.Package,也就是說,不包含 __init__.py 檔案。與 Package 類似,它只收集其自身目錄中的檔案。

    pytest.Session 現在只收集初始引數,而不會遞迴到目錄中。此工作現在由目錄收集器節點的 遞迴擴展程序 完成。

    session.name 現在為 "";先前它是 rootdir 目錄名稱。這與 session.nodeid 一致,後者始終為 ""

    集合樹狀結構現在包含直到 rootdir 的目錄/套件,適用於在 rootdir 內找到的初始引數。對於 rootdir 外部的檔案,僅收集直接目錄/套件 – 但請注意,不建議從 rootdir 外部收集。

    例如,給定以下檔案系統樹狀結構

    myroot/
        pytest.ini
        top/
        ├── aaa
        │   └── test_aaa.py
        ├── test_a.py
        ├── test_b
        │   ├── __init__.py
        │   └── test_b.py
        ├── test_c.py
        └── zzz
            ├── __init__.py
            └── test_zzz.py
    

    集合樹狀結構,如 pytest --collect-only top/ 所示,但為了清楚起見,新增了原本隱藏的 Session 節點,現在如下所示

    <Session>
      <Dir myroot>
        <Dir top>
          <Dir aaa>
            <Module test_aaa.py>
              <Function test_it>
          <Module test_a.py>
            <Function test_it>
          <Package test_b>
            <Module test_b.py>
              <Function test_it>
          <Module test_c.py>
            <Function test_it>
          <Package zzz>
            <Module test_zzz.py>
              <Function test_it>
    

    先前,它是

    <Session>
      <Module top/test_a.py>
        <Function test_it>
      <Module top/test_c.py>
        <Function test_it>
      <Module top/aaa/test_aaa.py>
        <Function test_it>
      <Package test_b>
        <Module test_b.py>
          <Function test_it>
      <Package zzz>
        <Module test_zzz.py>
          <Function test_it>
    

    依賴於集合樹狀結構特定形狀的程式碼/外掛程式可能需要更新。

  • #11676:類別 NodeCollectorItemFileFSCollector 現在標記為抽象類別(請參閱 abc)。

    我們預期此變更不會影響使用者和外掛程式作者,它只會在程式碼已經錯誤或有問題時才會導致錯誤。

其他重大變更

以下是無法進行停用的重大變更。

  • #11282:清理了定義組態選項時 default 參數的處理方式。

    先前,如果未為 parser.addini 提供 default,且組態選項值未在測試會期中定義,則呼叫 config.getini 會傳回空列表空字串,具體取決於是否提供了 type,這顯然是不正確的。此外,即使在使用 default=None 明確定義選項時,None 也未被採納。

    現在 parser.addini 的行為如下

    • 如果未傳遞 default 但提供了 type,則會傳回類型特定的預設值。例如,type=bool 將傳回 Falsetype=str 將傳回 "" 等。

    • 如果傳遞了 default=None 且選項未在測試會期中定義,則無論 type 為何,都會傳回 None

    • 如果既未提供 default 也未提供 type,則假定 type=str 並傳回 "" 作為預設值(這與先前的行為一致)。

    團隊決定不為此變更引入停用期,因為這樣做在向社群溝通以及實作方面都很複雜,而且團隊認為此變更除了在極少數情況下,不應破壞現有的外掛程式。

  • #11667:pytest 的 setup.py 檔案已移除。如果您依賴此檔案,例如使用 setup.py install 安裝 pytest,請參閱 Why you shouldn’t invoke setup.py directly 以取得替代方案。

  • #9288warns() 現在會在上下文關閉時重新發出不符的警告 – 先前它會消耗所有警告,隱藏那些未被函數比對到的警告。

    雖然這是一項新功能,但我們將其宣布為重大變更,因為許多測試套件都設定為在警告時產生錯誤,因此會在新重新發出的警告上失敗。

  • 內部 FixtureManager.getfixtureclosure 方法已變更。使用此方法或繼承 FixtureManager 並覆寫該方法的外掛程式將需要適應此變更。

停用

  • #10465:傳回 None 以外值的測試函數現在將發出 pytest.PytestWarning 而不是 pytest.PytestRemovedIn8Warning,這表示這將保持為警告,而不是在未來成為錯誤。

  • #3664:將標記應用於 fixture 函數現在會發出警告:fixture 中的標記從未產生任何效果,但將標記應用於 fixture(例如 usefixtures)並期望它能運作是常見的使用者錯誤。

    這將在 pytest 9.0 中變成錯誤。

功能和改進

改進的差異

這些變更改進了 pytest 在斷言失敗時列印的差異。請注意,語法突顯需要 pygments 套件。

  • #11520:極度詳細 (-vv) 的差異輸出現在以差異形式著色,而不是一大塊紅色。

    錯誤報告中的 Python 程式碼現在以 Python 語法突顯顯示。

    錯誤報告中的章節現在分隔得更好。

  • #1531:每個標準函式庫容器類型的極度詳細差異 (-vv) 都已改進。縮排現在一致,且標記位於它們自己的個別行上,這應減少向使用者顯示的差異。

    先前,標準 Python 美化列印器用於產生輸出,它將開頭和結尾標記與第一個/最後一個條目放在同一行,此外還沒有一致的縮排。

  • #10617:為除了相等性 == 以外的比較新增了更全面的集合斷言重寫,以下運算現在提供更好的失敗訊息:!=<=>=<>

個別控制斷言詳細程度

  • #11387:新增了新的 verbosity_assertions 組態選項,用於精細控制失敗斷言的詳細程度。

    如果您曾經希望 pytest 始終向您顯示完整差異,但又不想讓其他所有內容都變得詳細,那麼這就是為您而設的。

    請參閱 精細的詳細程度 以取得更多詳細資訊。

    對於外掛程式作者,可以使用 config.get_verbosity 來檢索特定詳細程度類型的詳細程度。

對例外群組和 __notes__ 的額外支援

這些變更改進了 pytest 對例外群組的支援。

自訂目錄收集器

「新樣式」Hook 包裝器

  • #11122:pytest 現在在內部使用「新樣式」hook 包裝器,自 pluggy 1.2.0 起可用。請參閱 pluggy 的 1.2.0 變更日誌更新的文件 以取得詳細資訊。

    如果外掛程式想要使用新樣式包裝器,如果它們需要 pytest>=8 即可使用。

其他改進

錯誤修正

  • #10701pytest.WarningsRecorder.pop() 將傳回列表中最接近比對的警告,而不是第一個屬於請求類型的警告。

  • #11255:修正了在沒有套件的情況下 parametrize(..., scope="package") 上的當機問題。

  • #11277:修正了一個錯誤,當間接參數有多個 fixture 時,會為參數集選取最高範圍 fixture 的範圍,而不是範圍最窄的 fixture 的範圍。

  • #11456:參數化測試現在真正確保給定每個輸入的 ID 是唯一的 - 例如,a, a, a0 現在會產生 a1, a2, a0 而不是先前的(錯誤的)a0, a1, a0。這必然表示變更先前發生衝突的節點 ID,並且為了可讀性,當非唯一 ID 以數字結尾時,會新增底線。

  • #11563:修正了多次使用空字串作為相同參數化值時的當機問題。

  • #11712:修正了處理 NO_COLORFORCE_COLOR 以忽略空值。

  • #9036pytest.warns 和類似函數現在會在 with 區塊內引發例外時捕獲警告。

改進的文件

  • #11011:在使用 caplog 時,新增了關於在測試期間修改根記錄器的警告。

  • #11065:在快取範例中使用 pytestconfig 而不是 request.config,以與 API 文件保持一致。

瑣碎/內部變更

  • #11208:(內部)FixtureDef.cached_result 類型已變更。現在第三個項目 cached_result[2] 在設定時是例外實例,而不是例外三元組。

  • #11218:(此條目旨在協助存取私有 pytest 內部結構以實例化 FixtureRequest 物件的外掛程式。)

    FixtureRequest 現在是一個抽象類別,無法直接實例化。已為測試函數中的 request fixture 新增了新的具體 TopRequest 子類別 FixtureRequest,作為 fixture 函數中 request fixture 的現有 SubRequest 子類別的對應物。

  • #11315pytester fixture 現在使用 monkeypatch fixture 來管理目前的工作目錄。如果您結合 monkeypatch.undo() 使用 pytester,則 CWD 可能會還原。請改用 monkeypatch.context()

  • #11333:更正了 Config.ArgsSource.INVOCATION_DIR 的拼寫。先前的拼寫 INCOVATION_DIR 仍然作為別名保留。

  • #11638:修正了 selftest,以便在呼叫環境中設定 FORCE_COLORNO_COLORPY_COLORS 時正確通過。

pytest 7.4.4 (2023-12-31)

錯誤修正

  • #11140:修正了 Python>=3.8 上檔案頂部的非字串常數被偵測為文件字串的問題。

  • #11572:處理了 sys.stderrsys.__stderr__Fault Handler 關閉時可能已關閉的邊緣情況。

  • #11710:修正了來自集合錯誤的回溯未被修剪的問題。

  • #7966:移除了當在 __iter__ 方法中引發例外時,來自斷言重寫機制的無幫助錯誤訊息。現在它們被視為不可迭代。

改進的文件

  • #11091:更新了文件以參考連字號選項:將 --junitxml 替換為 --junit-xml,將 --collectonly 替換為 --collect-only

pytest 7.4.3 (2023-10-24)

錯誤修正

  • #10447:標記現在以反向 MRO 順序考量,以確保首先考量基底類別標記 – 這解決了一個回歸問題。

  • #11239:修正了斷言中的 := 影響不相關測試案例的問題。

  • #11439:處理了 sys.stderrsys.__stderr__Fault Handler 關閉時可能已關閉的邊緣情況。

pytest 7.4.2 (2023-09-07)

錯誤修正

  • #11237:修正了 functools.cached_property 物件的 doctest 集合。

  • #11306:修正了使用 --importmode=importlib 時導致套件 __init__.py 檔案在某些情況下被多次匯入的錯誤。

  • #11367:修正了在 fixture 在 teardown 期間失敗時,user_properties 未儲存在 JUnit XML 檔案中的錯誤。

  • #11394:修正了在剖析可能被解釋為檔案的長命令列引數時的當機問題。

改進的文件

  • #11391:改進了 pytest 外掛程式參考頁面上的免責聲明,以更好地表明這是一個自動化的、非策劃的列表。

pytest 7.4.1 (2023-09-02)

錯誤修正

  • #10337: 修正了由 --import-mode=importlib 產生的虛擬中介模組,不會將子模組包含為父模組屬性的錯誤。

  • #10702: 修正了當比較字典時,None 為預期值或接收值時,pytest.approx() 中的錯誤斷言處理。

  • #10811: 修正了同時使用 --import-mode=importlib--doctest-modules 時,導致模組被多次導入的問題,進而導致具有導入副作用的模組出現問題。

pytest 7.4.0 (2023-06-23)

新功能

改進

  • #10872: 將測試日誌報告註解更新為具名元組,並修正了 pytest_report_teststatus Hook 文件中的不一致之處。

  • #10907: 當要顯示的例外追溯完全被過濾掉時(透過 __tracebackhide__、內部框架和類似機制),現在只會顯示例外字串和以下訊息

    “所有追溯條目都已隱藏。傳遞 --full-trace 以查看隱藏和內部框架。”。

    先前,即使最後一幀追溯是隱藏的,也會顯示出來。

  • #10940: 透過執行文字換行,同時為進度輸出保留清晰的邊距,改進了 skipxfail 原因的詳細輸出 (-vv)。

    新增了 TerminalReporter.wrap_write() 作為該功能的輔助工具。

  • #10991: 新增了 %f 指令的處理,以便在日誌格式選項(例如 log-date-format)中印出微秒。

  • #11005: 將底層例外新增至快取提供者的路徑建立和寫入警告訊息中。

  • #11013: 當設定了 testpaths,但 glob 找不到路徑時,新增警告。在這種情況下,pytest 將會退回從目前目錄搜尋。

  • #11043: 當未指定 --confcutdir 且不存在設定檔時,conftest 截止目錄 (--confcutdir) 現在設定為 rootdir。先前在這種情況下,會探查 conftest.py 檔案,一路到檔案系統的根目錄。如果您受到此變更的嚴重影響,請考慮在您想要的截止目錄中新增一個空的設定檔,或明確設定 --confcutdir

  • #11081: norecursedirs 檢查現在在 pytest_ignore_collect 實作中執行,因此外掛程式可以影響它。

    如果在更新到此版本後,您發現您的 norecursedirs 設定未被遵守,則表示您使用的 conftest 或外掛程式具有不良的 pytest_ignore_collect 實作。最有可能的是,您的 Hook 對於它不想忽略的路徑返回 False,這會結束處理,並且不允許包括 pytest 本身在內的其他外掛程式忽略該路徑。修復方法是對於您的 Hook 不想忽略的路徑,返回 None 而不是 False

  • #8711: caplog.set_level()caplog.at_level() 將暫時啟用請求的 level,如果 level 已透過 logging.disable(LEVEL) 全域停用。

錯誤修正

  • #10831: 終端報告:修正在 --tb=line 模式下執行時,pytest.fail(pytrace=False) 測試報告 None 的錯誤。

  • #11068: 修正了 非 Python 測試檔案--last-failed 整個檔案跳過功能(“跳過了 N 個檔案”)。

  • #11104: 修正了 pytest 7.3.2 中的回歸問題,該問題導致即使未被使用(例如,當在命令列上給出明確的路徑時),也會考慮使用 testpaths 來載入初始 conftest。現在,只有當 testpaths 正在使用時才會被考慮。

  • #1904: 修正了使用 __tracebackhide__ = True 隱藏的追溯條目,仍然會顯示在鏈式例外中(“... 以上例外 ...” 訊息之後的部分)。

  • #7781: 修正了在使用 --debug 時,將無法編碼的文字寫入日誌檔案的問題。

改進的文件

瑣碎/內部變更

  • #11031: 增強了 -c 的 CLI 標誌,現在包含 --config-file,以清楚表明此標誌適用於自訂設定檔的使用。

pytest 7.3.2 (2023-06-10)

錯誤修正

  • #10169: 修正了非常長的選項名稱可能導致 pytest 在某些系統上因 OSError: [Errno 36] File name too long 而崩潰的錯誤。

  • #10894: 支援 Python 3.12(撰寫時為 Beta 版)。

  • #10987: 現在會遵循 testpaths 來載入根 conftests

  • #10999: monkeypatch setitem/delitem 型別註解現在允許 TypedDict 引數。

  • #11028: 修正了斷言重寫中的錯誤,其中使用海象運算子指定的變數稍後無法在函數呼叫中使用。

  • #11054: 修正了 --last-failed 的 “(跳過了 N 個檔案)” 功能對於套件內(具有 __init__.py 檔案的目錄)的檔案。

pytest 7.3.1 (2023-04-14)

改進

  • #10875: Python 3.12 支援:修正了執行 unittest 測試時出現的 RuntimeError: TestResult has no addDuration method

  • #10890: Python 3.12 支援:修正了使用 tmp_path 時出現的 shutil.rmtree(onerror=...) 棄用警告。

錯誤修正

  • #10896: 修正了與 tmp_path 和新的 tmp_path_retention_policy 選項相關的效能回歸問題。

  • #10903: 修正了當顯示所有條目都被隱藏的例外時,發生的崩潰 INTERNALERROR IndexError: list index out of range。這會還原在 7.3.0 版本中引入的變更 “正確處理鏈式例外的 __tracebackhide__。”。

pytest 7.3.0 (2023-04-08)

新功能

  • #10525: 使用 @classmethod 裝飾的測試方法現在可以被發現為測試,遵循與普通方法相同的規則。這填補了靜態方法可以被發現為測試,但類別方法卻不行的空白。

  • #10755: console_output_style 現在支援 progress-even-when-capture-no,即使在停用捕捉的情況下,也強制使用進度輸出。這在大型測試套件中非常有用,在這些套件中,捕捉可能會對效能產生重大影響。

  • #7431: 新增了 --log-disable CLI 選項,以停用個別的記錄器。

  • #8141: 新增了 tmp_path_retention_counttmp_path_retention_policy 設定選項,以控制 tmp_path Fixture 建立的目錄的保留方式。

改進

  • #10226: 如果在 teardown 中引發多個錯誤,我們現在會重新引發它們的 ExceptionGroup,而不是捨棄除了最後一個以外的所有錯誤。

  • #10658: 允許 -p 引數包含空格 (例如:-p no:logging 而不是 -pno:logging)。在設定檔的 addopts 區段中特別有用。

  • #10710: 將 startstop 時間戳記新增至 TestReport 物件。

  • #10727: 分割 rootdirconfig filetestpaths 的報告標頭,以便每個項目都有自己的行。

  • #10840: pytest 不應再因具有病態位置屬性的 AST 而崩潰,例如測試由 Hylang <https://github.com/hylang/hy>__ 產生的 AST。

  • #6267: 如果截斷訊息比隱藏文字長,則不再截斷測試的完整輸出。顯示的行號也已修正。

錯誤修正

  • #10743: 當斷言運算式包含海象運算子時,斷言重寫機制現在可以正確運作。

  • #10765: 修正了 tmp_path Fixture 由於缺少 os.getuid(),總是在 emscripten 平台上引發 OSError 的問題。

  • #1904: 正確處理鏈式例外的 __tracebackhide__。注意:此變更已在 7.3.1 版本中還原。

改進的文件

  • #10782: 修正了 良好整合實務 中的最小範例:pip install -e . 需要在 pyproject.toml 中加入 version 條目才能成功執行。

瑣碎/內部變更

  • #10669: pytest 不再直接依賴 attrs 套件。雖然我們在 pytest 都非常喜愛這個套件,並且想感謝 attrs 團隊多年的合作與支援,但對於 pytest 來說,盡可能減少外部依賴關係是有意義的,因為這有助於下游專案。 考慮到這一點,我們已將 pytest 有限的內部使用替換為使用標準函式庫的 dataclasses 來代替。

    不過,仍然支援 attrs 類別的優美差異顯示。

pytest 7.2.2 (2023-03-03)

錯誤修正

  • #10533: 修正了 pytest.approx() 處理包含一個或多個 0.0 值的字典的問題。

  • #10592: 修正了同時傳遞 --cache-show--help 時發生的崩潰問題。

  • #10597: 修正了名為 teardown 的 Fixture 方法會被呼叫為 nose teardown 階段一部分的錯誤。

  • #10626: 修正了同時傳遞 --fixtures--help 時發生的崩潰問題。

  • #10660: 修正了 pytest.raises() 以返回 'ContextManager',以便型別檢查器可以將 pytest.raises(...) if ... else nullcontext() 縮小為 'ContextManager' 而不是 'object'。

改進的文件

  • #10690: 將 CIBUILD_NUMBER 環境變數新增至文件中。

  • #10721: 修正了使用 Hatch 的文件範例中的 entry-points 宣告。

  • #10753: 變更了模組級別跳過的措辭,以非常明確地說明不收集測試,也不執行模組的其餘部分。

pytest 7.2.1 (2023-01-13)

錯誤修正

  • #10452: 修正了 Python 3.12 中的 ‘importlib.abc.TraversableResources’ 棄用警告。

  • #10457: 如果測試是從 Fixture 內部跳過的,則測試摘要現在會顯示測試位置,而不是 Fixture 位置。

  • #10506: 修正了有時 pytest 會在 Windows 上使用檔案系統根目錄作為 rootdir 的錯誤。

  • #10607: 修正了建立 junitxml 報告時的競爭條件,當 pytest 的多個實例平行執行時可能會發生這種情況。

  • #10641: 修正了建立或更新 stepwise 外掛程式快取時的競爭條件,當多個 xdist 工作節點嘗試同時更新 stepwise 外掛程式的快取時,可能會發生這種情況。

pytest 7.2.0 (2022-10-23)

棄用

  • #10012: 將 pytest.PytestUnhandledCoroutineWarning 更新為棄用;它將在 pytest 8 中引發錯誤。

  • #10396: pytest 不再依賴 py 函式庫。pytest 提供了 py.errorpy.path 模組的供應商副本,但如果安裝了 py 函式庫,則會使用它。 如果您需要其他 py.* 模組,請繼續單獨安裝已棄用的 py 函式庫,否則通常可以將其作為依賴項移除。

  • #4562: 棄用使用屬性/標記設定 Hook 規格/實作。

    請改用 pytest.hookimpl()pytest.hookspec()。如需更多詳細資訊,請參閱 文件

  • #9886: 執行為 nose 撰寫的測試的功能已正式棄用。

    這包括

    • setupteardown 函數和方法:這可能會讓使用者感到驚訝,因為 setup()teardown() 不是 pytest 慣用語,而是 nose 支援的一部分。

    • 使用 @with_setup 裝飾器的 Setup/teardown。

    如需更多詳細資訊,請查閱 棄用文件

  • #7337: 如果測試函數返回除了 None 以外的任何內容,現在會發出棄用警告。這可以防止初學者常犯的錯誤,他們期望返回 bool (例如 return foo(a, b) == result) 會導致測試通過或失敗,而不是使用 assert。計劃是將從測試返回非 None 的值在未來變成錯誤。

新功能

  • #9897: 為 testpaths 新增了 shell 樣式的萬用字元支援。

改進

  • #10218: @pytest.mark.parametrize() (和類似函數) 現在接受任何 Sequence[str] 作為引數名稱,而不僅僅是 list[str]tuple[str, ...]

    (請注意,str 本身就是 Sequence[str],仍然像以前一樣被視為逗號分隔的名稱清單)。

  • #10381: 新增了 --no-showlocals 標誌。可以直接將其傳遞給測試,以覆寫透過 addopts 宣告的 --showlocals

  • #3426: 字串的斷言失敗,其中 NFC 和 NFD 形式正規化為相同的字串,現在具有詳細說明問題的專用錯誤訊息,並且會改為表示其 utf-8 表示法。

  • #8508:為透過 pytest.warns() 進行警告匹配引入多行顯示,並增強由 pytest.raises() 回傳的 pytest.ExceptionInfo.match() 的匹配比較。

  • #8646:改進 pytest.raises()。先前傳遞空元組會產生令人困惑的錯誤。現在我們會立即引發錯誤,並顯示更有幫助的訊息。

  • #9741:在 Python 3.11 上,使用標準函式庫的 tomllib 來解析 TOML。

    tomli 在 Python 3.11 上不再是依賴項。

  • #9742:使用 -vv 顯示不帶跳脫換行字元的斷言訊息。

  • #9823:改進了當找不到給定檔案的收集器時顯示的錯誤訊息。

  • #9873:為簡短的測試摘要新增了一些色彩。

  • #9883:標準化所有命令列選項的說明文字。

  • #9920:在 CI 環境中執行時,在 short test summary info 中顯示完整的崩潰訊息。

  • #9987:新增對隱藏設定檔的支援,允許使用 .pytest.ini 作為 pytest.ini 的替代方案。

錯誤修正

  • #10150:啟用捕獲時,sys.stdin 現在包含類檔案物件的所有預期方法。

  • #10382:當 raise unittest.SkipTest() 出現在檔案頂層時,不要中斷進入 pdb。

  • #7792:標記現在根據測試類別中的完整 MRO 繼承。先前,如果測試類別繼承自兩個或多個類別,則只會套用第一個超類別的標記。

    當從超類別繼承標記時,子類別的標記現在會依照 MRO 順序排在超類別的標記之前。先前順序相反。

    當從超類別繼承標記時,子類別的 pytestmark 屬性現在只包含直接套用於它的標記。先前,它也包含來自其超類別的標記。請注意,通常不應直接存取此屬性;請改用 Node.iter_markers

  • #9159:即使在使用 --tb=native 以外的顯示選項時,仍強制在 ExceptionGroups 中以原生顯示方式顯示內部例外。這是完整實作 ExceptionGroups 中內部例外的 pytest-native 顯示之前的臨時步驟。

  • #9877:確保在調用 caplog.clear() 後,caplog.get_records(when) 回傳目前/正確的資料。

改進的文件

  • #10344:更新關於編寫外掛程式的資訊,以使用 pyproject.toml 而非 setup.py

  • #9248:文件現在使用 Sphinx 5.x(先前為 3.x)建置。

  • #9291:更新關於 pytest.warns() 如何影響 DeprecationWarning 的文件。

瑣碎/內部變更

  • #10313:使 _pytest.doctest.DoctestItem 匯出 pytest.DoctestItem 以用於類型檢查和執行階段目的。使 _pytest.doctest 使用內部 API 以避免循環匯入。

  • #9906:使 _pytest.compat 在類型檢查器眼中重新匯出 importlib_metadata

  • #9910:修復 cacheprovider 中的預設編碼警告 (EncodingWarning)

  • #9984:改進當我們嘗試存取已拆解的 fixture 時的錯誤訊息。在 docstring 中新增一句話,說明何時不適合調用 getfixturevalue

pytest 7.1.3 (2022-08-31)

錯誤修正

  • #10060:當使用 --pdb 執行時,如果 class 已透過 unittest.skippytest.mark.skip 跳過,則不再為測試調用 TestCase.tearDown

  • #10190:設定或拆解錯誤訊息中的無效 XML 字元現在已針對 JUnit XML 報告正確地跳脫。

  • #10230:忽略 pip 21.3 中引入的基於 pyproject.toml 的可編輯建置所建立的 .py 檔案。

  • #3396:Doctests 現在遵循 --import-mode 標誌。

  • #9514:將 FixtureRequest.param 類型註解為 Any,作為在 #8073 修復之前的權宜之計。

  • #9791:修復了 rewrite.py 中的路徑處理程式碼,該程式碼似乎運作正常,但並不正確,並且在某些系統中會失敗。

  • #9917:修復了當用於比較元組時 pytest.approx() 的字串表示。

改進的文件

瑣碎/內部變更

pytest 7.1.2 (2022-04-23)

錯誤修正

  • #9726:移除了 pytest.approx() 內部不必要的 numpy 匯入。

  • #9820:修復了 dataclassesInitVar 的比較。

  • #9869:增加 NODE_CTOR_FSPATH_ARG 棄用警告的 stacklevel,以指向使用者的程式碼,而不是 pytest。

  • #9871:修復了一個奇怪(且幸運地罕見)的錯誤,其中 temp_path fixture 在嘗試取得目前使用者的使用者名稱時可能會引發內部錯誤。

pytest 7.1.1 (2022-03-17)

錯誤修正

  • #9767:修復了 pytest 7.1.0 中的回歸問題,其中未選取來源樹外部(例如 site-packages 目錄中)的一些 conftest.py 檔案。

pytest 7.1.0 (2022-03-13)

重大變更

  • #8838:根據我們的政策,以下功能已在 6.X 系列中棄用,現在已移除

    • pytest._fillfuncargs 函數。

    • pytest_warning_captured hook - 請改用 pytest_warning_recorded

    • -k -foobar 語法 - 請改用 -k 'not foobar'

    • -k foobar: 語法。

    • pytest.collect 模組 - 直接從 pytest 匯入。

    如需更多資訊,請參閱文件中的 棄用和移除

  • #9437:已停止支援 Python 3.6,該版本已於 2021-12-23 達到 生命週期結束

改進

  • #5192:修復了某些資料類型的測試輸出,其中 -v 會顯示較少資訊。

    此外,當顯示序列的差異時,-q 會產生完整差異,而不是預期的差異。

  • #9362:當偵測到預設的 __eq__attrsdataclasses 中被覆寫時,pytest 現在會避免使用專門的斷言格式。

  • #9536:當在命令列中給定 -vv 時,完整顯示跳過和 xfail 原因,而不是將它們截斷以符合終端機寬度。

  • #9644:現在可以透過啟用 tracemalloc,取得更多關於導致 Python 引發 ResourceWarning 的資源位置的資訊。

    請參閱 資源警告 以取得更多資訊。

  • #9678@pytest.mark.parametrizeids 參數現在接受更多類型。先前僅接受 strfloatintbool;現在也接受 bytescomplexre.PatternEnum 和任何具有 __name__ 的類型。

  • #9692:當給定無序序列(例如 set)時,pytest.approx() 現在會引發 TypeError

    請注意,這表示不再支援僅實作 __iter____len__ 的自訂類別,因為它們不保證順序。

錯誤修正

  • #8242:已還原在 pytest 收集階段棄用引發 unittest.SkipTest 以跳過測試收集的棄用 - 這現在再次是受支援的功能。

  • #9493:符號連結元件不再在 conftest 路徑中解析。這表示如果 conftest 在收集樹中出現兩次(使用符號連結),它將會執行兩次。例如,給定

    tests/real/conftest.py tests/real/test_it.py tests/link -> tests/real

    執行 pytest tests 現在會匯入 conftest 兩次,一次是 tests/real/conftest.py,另一次是 tests/link/conftest.py。這是為了符合 pytest 6.0 中對測試收集本身所做的類似變更而進行的修復(請參閱 #6523 以取得詳細資訊)。

  • #9626:修復了當模組發生錯誤或跳過時,終端機收集摘要上選定測試的計數。

    如果在收集時發生錯誤或跳過模組,pytest 會錯誤地從選定計數中減去這些模組。

  • #9645:修復了 --import-mode=importlibPYTHONPATHpythonpath 一起使用時,會在測試套件中造成匯入錯誤的回歸問題。

  • #9708pytester 現在請求 monkeypatch fixture,而不是在內部建立一個。這解決了一些涉及 pytest 環境變數的測試問題。

  • #9730:格式錯誤的 pyproject.toml 檔案現在會產生更清晰的錯誤訊息。

pytest 7.0.1 (2022-02-11)

錯誤修正

  • #9608:修復了 Python 3.9 中 importlib.readers 的無效匯入。

  • #9610:還原 UnitTestFunction.obj 以回傳未綁定而非綁定方法。修復了在使用非預設 __init__ 的 unittest TestCases 中,失敗的拆解期間發生的崩潰問題。在 pytest 7.0.0 中回歸。

  • #9636pythonpath 外掛程式已重新命名為 python_path。這避免了與 pytest-pythonpath 外掛程式發生衝突。

  • #9642:修復了使用參數化部分中的 :: 按 ID 執行測試的問題。

  • #9643:延遲發出關於涉及 ItemCollector 的菱形繼承的 PytestWarning,以便可以使用 標準警告篩選器 進行篩選。

pytest 7.0.0 (2022-02-03)

另請參閱下方 7.0.0rc1 版本資訊中此版本的完整變更集

棄用

  • #9488:如果 pytest.Item 等節點的自訂子類別覆寫了 __init__ 方法,它們應該接受 **kwargs。有關詳細資訊,請參閱 自訂 Node 子類別的建構子應接受 **kwargs

    請注意,僅當 pytest 預期傳遞的引數發生衝突時,才會發出棄用警告。此棄用警告已包含在 pytest 7.0.0rc1 中,但未記錄在文件中。

錯誤修正

  • #9355:修復了在 Python 3.8 及更高版本中使用斷言時,錯誤訊息會列印函數裝飾器的問題。

  • #9396:確保在 pytest_cmdline_main hook 期間可以使用 pytest.Config.inifile7.0.0rc1 期間的回歸問題)。

改進的文件

  • #9404:在其棄用之前,針對常見的 pytest.warns(None) 誤用新增了額外文件,說明替代方案。

  • #9505:釐清設定檔的位置。為了避免混淆,文件提及設定檔位於儲存庫的根目錄中。

瑣碎/內部變更

  • #9521:為斷言重寫路徑新增測試覆蓋率。

pytest 7.0.0rc1 (2021-12-06)

重大變更

  • #7259Node.reportinfo() 函數的第一個回傳值類型已從 py.path.local | str 擴展到 os.PathLike[str] | str

    大多數引用 reportinfo() 的外掛程式僅將其定義為自訂 pytest.Item 實作的一部分。由於 py.path.localos.PathLike[str],因此這些外掛程式不受影響。

    調用 reportinfo()、使用第一個回傳值並將其作為 py.path.local 互動的外掛程式和使用者,將需要透過調用 py.path.local(fspath) 進行調整。雖然最好避免使用舊版的 py.path.local,並使用 pathlib.Path,或改用 item.locationitem.path

    注意:pytest 無法為此變更提供棄用期。

  • #8246--version 現在將版本資訊寫入 stdout 而不是 stderr

  • #8733:移除針對 pyreadline 的權宜之計,該權宜之計使其與 --pdb 一起運作。

    該權宜之計是在 2015 年的 #1281 中引入的,但自那時以來,pyreadline 似乎已無人維護產生警告,並且將在 Python 3.10 上停止運作。

  • #9061:在布林環境中使用 pytest.approx() 現在會引發錯誤,提示正確的用法。

    使用者顯然經常錯誤地像這樣使用 pytest.approx

    assert pytest.approx(actual, expected)
    

    而正確的用法是

    assert actual == pytest.approx(expected)
    

    新的錯誤訊息有助於捕捉這些錯誤。

  • #9277pytest.Instance 收集器類型已被移除。匯入 pytest.Instance_pytest.python.Instance 會回傳虛擬類型並發出棄用警告。有關詳細資訊,請參閱 pytest.Instance 收集器

  • #9308PytestRemovedIn7Warning 棄用警告現在預設為錯誤。

    根據我們盡可能減少中斷來移除棄用功能的計畫,所有 PytestRemovedIn7Warning 類型的警告現在預設會產生錯誤,而不是警告訊息。

    受影響的功能將在 pytest 7.1 中有效移除,因此請參閱文件中的 棄用和移除 章節,以了解如何更新現有程式碼的指示。

    在 pytest 7.0.X 系列中,可以透過將此內容新增到您的 pytest.ini 檔案中,將錯誤改回警告作為權宜之計

    [pytest]
    filterwarnings =
        ignore::pytest.PytestRemovedIn7Warning
    

    但這將在 pytest 7.1 發布時停止運作。

    如果您對 移除特定功能有疑慮,請在 #9308 中新增評論。

棄用

  • #7259:hooks 的 py.path.local 引數已被棄用。有關完整詳細資訊,請參閱 棄用說明

    py.path.local 引數到 Node 建構子已被棄用。有關完整詳細資訊,請參閱 棄用說明

    注意

    Node 引數和屬性的名稱(新屬性為 path)與 hooks 的情況相反(舊引數為 path)。

    由於歷史原因,這是一個不幸的產物,應在未來版本中解決,因為我們正在慢慢擺脫 py 依賴項(有關更長的討論,請參閱 #9283)。

  • #7469:直接建構以下類別現在已棄用

    • _pytest.mark.structures.Mark

    • _pytest.mark.structures.MarkDecorator

    • _pytest.mark.structures.MarkGenerator

    • _pytest.python.Metafunc

    • _pytest.runner.CallInfo

    • _pytest._code.ExceptionInfo

    • _pytest.config.argparsing.Parser

    • _pytest.config.argparsing.OptionGroup

    • _pytest.pytester.HookRecorder

    這些建構子一直被視為私有的,但現在發出棄用警告,這可能會在 pytest 8 中變成硬錯誤。

  • #8242:棄用在 pytest 收集階段引發 unittest.SkipTest 以跳過測試收集。請改用 pytest.skip()

    請注意:此棄用僅與在測試收集期間使用 unittest.SkipTest 有關。您可能沒有這樣做。在 unittest 測試案例中,unittest.SkipTest / unittest.TestCase.skipTest() / unittest.skip() 的一般用法完全受到支援。

    注意

    此棄用已在 pytest 7.1.0 中還原。

  • #8315Parser.addoption 的幾個行為現在已排定在 pytest 8 中移除(自 pytest 2.4.0 起已棄用)

    • parser.addoption(..., help=".. %default ..") - 請改用 %(default)s

    • parser.addoption(..., type="int/string/float/complex") - 請改用 type=int 等。

  • #8447:定義一個既是 Item 又是 Collector 的自訂 pytest 節點類型(例如 File)現在會發出警告。它從未被合理地支援,並且會觸發難以偵錯的錯誤。

    請參閱 棄用說明 以取得完整詳細資訊。

  • #8592pytest_cmdline_preparse 已正式棄用。它將在未來的版本中移除。請改用 pytest_load_initial_conftests

    請參閱 棄用說明 以取得完整詳細資訊。

  • #8645pytest.warns(None) 現在已被棄用,因為許多人使用它來表示「此程式碼不會發出警告」,但它實際上具有檢查程式碼是否發出至少一個任何類型警告的效果 - 就像 pytest.warns()pytest.warns(Warning) 一樣。

  • #8948pytest.skip(msg=...)pytest.fail(msg=...)pytest.exit(msg=...) 簽名現在接受 reason 參數,而不是 msgmsg 仍然可以使用,但已被棄用,並將在未來的版本中移除。

    此變更旨在與 pytest.mark.skippytest.mark.xfail 保持一致,它們都接受 reason 作為參數。

  • #8174:已對可透過 pytest.ExceptionInfo.traceback 存取的類型進行以下變更

    • _pytest.code.Codepath 屬性傳回 Path 而不是 py.path.local

    • _pytest.code.TracebackEntrypath 屬性傳回 Path 而不是 py.path.local

    此變更沒有棄用期(抱歉!)。

功能

  • #5196:現在在更多情況下,測試會依定義順序排序。

    在類別階層中,來自基底類別的測試現在會一致地排序在子類別上定義的測試之前(反向 MRO 順序)。

  • #7132:新增了兩個環境變數 PYTEST_THEMEPYTEST_THEME_MODE,讓使用者可以自訂使用的 pygments 主題。

  • #7259:新增了 cache.mkdir(),它與現有的 cache.makedir() 類似,但傳回 pathlib.Path 而不是舊版的 py.path.local

    parser.addini() 中新增了 paths 類型,如 parser.addini("mypaths", "my paths", type="paths"),它與現有的 pathlist 類似,但傳回 pathlib.Path 的列表,而不是舊版的 py.path.local

  • #7469:現在匯出 pytest API 中使用的物件類型,以便它們可以用於類型註解。

    新匯出的類型為

    不支援直接建構它們中的大多數;它們僅適用於類型註解。這樣做會發出棄用警告,並可能在 pytest 8.0 中變成硬錯誤。

    也不支援對它們進行子類別化。目前在執行階段不會強制執行此操作,但類型檢查器(例如 mypy)會偵測到。

  • #7856--import-mode=importlib 現在適用於依賴模組位於 sys.modules 上的功能,例如 pickledataclasses

  • #8144:以下 hook 現在接收額外的 pathlib.Path 參數,相當於現有的 py.path.local 參數

    注意

    Node 引數和屬性的名稱(新屬性為 path)與 hooks 的情況相反(舊引數為 path)。

    由於歷史原因,這是一個不幸的產物,應在未來版本中解決,因為我們正在慢慢擺脫 py 依賴項(有關更長的討論,請參閱 #9283)。

  • #8251:將 Node.path 實作為 pathlib.Path。無論 pathfspath(已棄用)是否傳遞給建構函式,都會設定舊的 fspath 和這個新的屬性。它是 fspath 屬性的替代品(它表示與 py.path.local 相同的路徑)。雖然由於像 reportinfo() 等方法的持續遷移,fspath 尚未棄用,但我們預計在未來的版本中將其棄用。

    注意

    Node 引數和屬性的名稱(新屬性為 path)與 hooks 的情況相反(舊引數為 path)。

    由於歷史原因,這是一個不幸的產物,應在未來版本中解決,因為我們正在慢慢擺脫 py 依賴項(有關更長的討論,請參閱 #9283)。

  • #8421pytest.approx() 現在適用於對映/字典和序列/列表中的 Decimal

  • #8606:使用 --fixtures-per-test--fixtures 的 pytest 調用已豐富了

    • 與 fixture 名稱一起列印的 Fixture 位置路徑。

    • 在 fixture 名稱下列印的 fixture 文件字串的第一個區段。

    • 在使用 --verbose 選項的 fixture 名稱下列印的 fixture 文件字串的全部內容。

  • #8761:新的 pytest.version_tuple 屬性,讓使用者更容易執行取決於 pytest 版本的操作(例如宣告在較新版本中引入的 hook)。

  • #8789:將 TOML 解析器從 toml 切換到 tomli,以支援 pyproject.toml 中的 TOML v1.0.0。

  • #8920:新增了 pytest.Stash,這是一種讓外掛程式以類型安全且無衝突的方式將其資料儲存在 ConfigNode 上的機制。請參閱 在跨 hook 函數的項目上儲存資料 以取得詳細資訊。

  • #8953RunResult 方法 assert_outcomes() 現在接受 warnings 參數,以判斷所擷取的警告總數。

  • #8954--debug 旗標現在接受 str 檔案來將偵錯記錄路由到其中,預設仍為 pytestdebug.log

  • #9023:當在環境中找到 CIBUILD_NUMBER 時,即使未使用 -v,現在也始終顯示可迭代物件等式判斷提示的完整差異。

  • #9113RunResult 方法 assert_outcomes() 現在接受 deselected 參數,以判斷取消選取測試的總數。

  • #9114:新增了 pythonpath 設定,該設定會在測試階段期間將列出的路徑新增至 sys.path。如果您目前使用 pytest-pythonpath 或 pytest-srcpaths 外掛程式,您應該能夠將它們替換為內建的 pythonpath 設定。

改進

  • #7480:排定在主要版本 X(例如 pytest 7、8、9、…)中移除的棄用現在使用警告類別 PytestRemovedInXWarning,它是 PytestDeprecationWarning 的子類別,而不是直接使用 PytestDeprecationWarning

    請參閱 回溯相容性政策 以取得更多詳細資訊。

  • #7864:改進了剖析警告篩選器時的錯誤訊息。

    先前,pytest 會顯示內部追溯,除了難看之外,有時還會隱藏問題的原因(例如匯入特定警告類型時的 ImportError)。

  • #8335:改進了數字序列的 pytest.approx() 判斷提示訊息。

    判斷提示訊息現在會傾印一個表格,其中包含每個差異的索引和錯誤。範例

    >       assert [1, 2, 3, 4] == pytest.approx([1, 3, 3, 5])
    E       assert comparison failed for 2 values:
    E         Index | Obtained | Expected
    E         1     | 2        | 3 +- 3.0e-06
    E         3     | 4        | 5 +- 5.0e-06
    
  • #8403:預設情況下,pytest 會截斷判斷提示錯誤中的長字串,使其不會過度雜亂輸出,目前預設為 240 個字元。

    但是,在某些情況下,較長的輸出有助於診斷失敗,甚至至關重要。使用 -v 現在會將截斷閾值增加到 2400 個字元,而 -vv 或更高版本將完全停用截斷。

  • #8509:修正了自 pytest 6.2.0 以來,當測試名稱中包含 / 時,不會呼叫 unittest.TestCase.setUpClass() 的問題。

    這是指 pytest 節點 ID 中的路徑部分,例如節點 ID tests/test_file.py::TestClass::test_it 中的 TestClass::test_it

    現在,不是假設測試名稱不包含 /,而是假設測試路徑不包含 ::。我們計劃在未來希望使這兩者都有效。

  • #8803:現在可以在 cli 記錄上為自訂記錄層級新增色彩。

    透過使用 pytest_configure hook 中的 add_color_level,可以新增色彩

    logging_plugin = config.pluginmanager.get_plugin('logging-plugin')
    logging_plugin.log_cli_handler.formatter.add_color_level(logging.INFO, 'cyan')
    logging_plugin.log_cli_handler.formatter.add_color_level(logging.SPAM, 'blue')
    

    請參閱 自訂色彩 以取得更多資訊。

  • #8822:在 --fixtures--fixtures-by-test 中顯示 fixture 路徑時,來自 pytest 本身的 fixture 現在會顯示省略的路徑,而不是 site-packages 目錄中檔案的完整路徑。

  • #8898:在產生參數化 ID 時,現在將複數視為浮點數和整數。

  • #9062--stepwise-skip 現在隱含地啟用 --stepwise,並且可以單獨使用。

  • #9205pytest.Cache.set() 現在在儲存字典時會保留鍵順序。

錯誤修正

  • #7124:修正了在提供 --doctest-modules 時,__main__.py 會引發 ImportError 的問題。

  • #8061:修正了如果從父測試類別繼承 staticmethod 測試案例則會失敗的問題。

  • #8192testdir.makefile 現在會靜默接受不以 . 開頭的值,以維持與舊版 pytest 的回溯相容性。

    pytester.makefile 現在會在 ext 參數中遺失 . 時發出更清晰的錯誤。

  • #8258:修正了如果 faulthandler 模組在 pytest 啟動期間已啟用(例如使用 python -X dev -m pytest),則 pytest 的 faulthandler 支援不會在崩潰時傾印追溯的問題。

  • #8317:修正了從 getpass.getuser() 衍生的非法目錄字元會引發 OSError 的問題。

  • #8367:修正 Class.from_parent,使其將額外的關鍵字引數轉發到建構函式。

  • #8377: 測試選擇選項 pytest -kpytest -m 現在支援比對包含正斜線 (/) 字元的名稱。

  • #8384: @pytest.mark.skip 裝飾器現在可以正確地處理其參數。當 reason 參數意外地同時以位置參數和關鍵字參數給定時(例如,因為它與 skipif 混淆),現在會發生 TypeError。 之前,此類測試會被靜默跳過,而位置參數則被忽略。 此外,reason 現在被正確地記錄為位置參數或關鍵字參數(而不是僅限關鍵字參數)。

  • #8394: 為處理傳統 setup/teardown 的內部 fixture 使用私有名稱,使其不會與預設的 --fixtures 調用一起顯示(但它們仍然會與 --fixtures -v 一起顯示)。

  • #8456: 當安裝了外掛程式的預發行版本時,required_plugins 設定選項現在可以正常運作,而不是錯誤地聲稱這些外掛程式根本沒有安裝。

  • #8464: -c <config file> 現在也能正確地將 rootdir 定義為包含 <config file> 的目錄。

  • #8503: 當未安裝 setuptools 時,pytest.MonkeyPatch.syspath_prepend() 不再失敗。 現在,它僅在先前匯入 pkg_resources 時才調用 pkg_resources.fixup_namespace_packages,因為否則不需要它。

  • #8548: 引入修復程式以處理 log-cli-format 中的精確度寬度,以修正某些格式的輸出著色。

  • #8796: 修復了跳過 doctest 時的內部錯誤。

  • #8983: 測試選擇選項 pytest -kpytest -m 現在支援比對包含反斜線 (\) 字元的名稱。 反斜線被視為字面意義,而不是跳脫字元(要比對的值已經被跳脫)。

  • #8990: 修復了 pytest -vv 在某些情況下因內部異常 AttributeError: 'str' object has no attribute 'relative_to' 而崩潰的問題。

  • #9077: 修復了從 session 作用域的 fixture 存取 request.fspath / request.path 時,令人困惑的錯誤訊息。

  • #9131: 修復了 --pastebin 使用的 URL,改為使用 bpa.st

  • #9163: 現在為重寫的 assert 語句正確設定了結束行號和結束欄位偏移量。

  • #9169: 支援重寫檔案中來自 importlib.resourcesfiles API。

  • #9272: nose 相容性模組級別的 fixture setup()teardown() 現在每個模組僅調用一次,而不是每個測試函式調用一次。 即使定義了物件級別的 setup/teardown,它們現在也會被調用。

改進的文件

  • #4320: 改進了 pytester.copy_example 的文件。

  • #5105: 新增自動產生的 Pytest 外掛程式列表。 該列表會定期更新。

  • #8337: 在 pytest.approx() 文件中推薦 numpy.testing 模組。

  • #8655: --pdbcls 的幫助文字更準確地反映了該選項的行為。

  • #9210: 移除關於 confcutdir 是設定選項的不正確文件:它只能透過 --confcutdir 命令列選項設定。

  • #9242: 升級 readthedocs 設定以使用 較新的 Ubuntu 版本 <https://blog.readthedocs.com/new-build-specification/>`__,以便為 PDF 文件提供更好的 Unicode 支援。

  • #9341: 常用於 使用非 Python 測試 的各種方法現在已正確記錄在參考文件中。 之前它們未被記錄。

瑣碎/內部變更

  • #8133: 遷移到 setuptools_scm 6.x 以使用 SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYTEST 以獲得更穩健的發布工具。

  • #8174: 以下變更已套用於內部 pytest 類型/函式

    • _pytest.code.getfslineno() 函式傳回 Path 而不是 py.path.local

    • _pytest.python.path_matches_patterns() 函式採用 Path 而不是 py.path.local

    • _pytest._code.Traceback.cut() 函式接受任何 os.PathLike[str],而不僅僅是 py.path.local

  • #8248: 內部重組:讓 python.PyObjMixin 繼承自 nodes.Node 以傳遞類型資訊。

  • #8432: 當在模組級別使用 pytest.skip() 而未傳遞 allow_module_level=True 時,改進了錯誤訊息。

  • #8818: 確保 regendoc 選擇退出 TOX_ENV 快取目錄選擇,以確保獨立的範例測試執行。

  • #8913: 在內部重構之後,私有的 CallSpec2._arg2scopenum 屬性已被移除。

  • #8967: pytest_assertion_pass 不再被視為實驗性的,並且未來對它的變更將被更仔細地考慮。

  • #9202: 新增 github action 以將覆蓋率報告上傳到 codecov 而不是 bash 上傳器。

  • #9225: 變更用於建立 sdist 和 wheel 成品的命令:使用 build 套件而不是 setup.py。

  • #9351: 更正 doc/en/example/special.rst 中的小錯誤。

pytest 6.2.5 (2021-08-29)

瑣碎/內部變更

  • #8494: 現在支援 Python 3.10。

  • #9040: 啟用與 pluggy 1.0 或更高版本的相容性。

pytest 6.2.4 (2021-05-04)

錯誤修正

  • #8539: 修復了 Python 3.10 上的 assertion 重寫。

pytest 6.2.3 (2021-04-03)

錯誤修正

  • #8414: pytest 過去會在 /tmp 下建立具有世界可讀權限的目錄。 這表示系統中的任何使用者都可以讀取測試在臨時目錄中寫入的資訊(例如由 tmp_path/tmpdir fixture 建立的目錄)。 現在,目錄以私有權限建立。

    pytest 過去會靜默地使用預先存在的 /tmp/pytest-of-<username> 目錄,即使該目錄由另一個使用者擁有。 這表示另一個使用者可以預先建立這樣一個目錄,並獲得對另一個使用者臨時目錄的控制權。 現在,這種情況會導致錯誤。

pytest 6.2.2 (2021-01-25)

錯誤修正

  • #8152: 修復了當原因為空時,“(<跳過的實例>)”顯示為詳細測試摘要行中跳過原因的問題。

  • #8249: 修復了在使用 twisted.logger 並使用 pytest --capture=no 執行時,faulthandler 外掛程式的問題。

pytest 6.2.1 (2020-12-15)

錯誤修正

  • #7678: 修復了在主機中編譯的文件稍後從 UNC 掛載路徑 (Windows) 載入時,會引發 ImportPathMismatchError 的錯誤。

  • #8132: 修復了 approx 中的回歸問題:在 6.2.0 中,approx 在處理非數字類型時不再引發 TypeError,而是退回到正常比較。 在 6.2.0 之前,類似 tf.DeviceArray 的陣列類型會退回到純量情況,並且如果它們只有一個元素,則碰巧與純量正確比較。 在 6.2.0 之後,這些類型開始失敗,因為它們既沒有從標準 Python 數字層次結構繼承,也沒有從 numpy.ndarray 繼承。

    approx 現在會將參數轉換為 numpy.ndarray,如果它們公開陣列協定且不是純量。 這將類陣列物件視為 numpy 陣列,而與大小無關。

pytest 6.2.0 (2020-12-12)

重大變更

  • #7808: pytest 現在僅支援 python3.6+。

棄用

  • #7469: 直接建構/調用以下類別/函式現在已棄用

    • _pytest.cacheprovider.Cache

    • _pytest.cacheprovider.Cache.for_config()

    • _pytest.cacheprovider.Cache.clear_cache()

    • _pytest.cacheprovider.Cache.cache_dir_from_config()

    • _pytest.capture.CaptureFixture

    • _pytest.fixtures.FixtureRequest

    • _pytest.fixtures.SubRequest

    • _pytest.logging.LogCaptureFixture

    • _pytest.pytester.Pytester

    • _pytest.pytester.Testdir

    • _pytest.recwarn.WarningsRecorder

    • _pytest.recwarn.WarningsChecker

    • _pytest.tmpdir.TempPathFactory

    • _pytest.tmpdir.TempdirFactory

    這些一直被認為是私有的,但現在發出棄用警告,這可能會在 pytest 8.0.0 中變成硬錯誤。

  • #7530: --strict 命令列選項已被棄用,請改用 --strict-markers

    我們計劃未來可能會重新引入 --strict,並使其成為所有與嚴格性相關選項的綜合標誌(目前為 --strict-markers--strict-config,未來可能會引入更多)。

  • #7988: @pytest.yield_fixture 裝飾器/函式現在已棄用。 請改用 pytest.fixture()

    yield_fixture 長期以來一直是 fixture 的別名,因此可以安全地搜尋/替換。

功能

  • #5299: pytest 現在會警告在 Python>=3.8 的測試中發生的無法引發的異常和未處理的執行緒異常。 有關更多資訊,請參閱 關於無法引發的異常和未處理的執行緒異常的警告

  • #7425: 新的 pytester fixture,它與 testdir 相同,但其方法在適當時傳回 pathlib.Path 而不是 py.path.local

    這是為了在內部使用 pathlib.Path 物件的一部分舉措,以便將來移除對 py 的依賴性。

    在內部,舊的 pytest.Testdir 現在是 Pytester 周圍的薄包裝器,保留了舊的介面。

  • #7695: 新增了一個 hook,pytest_markeval_namespace,它應該傳回一個字典。 此字典將用於擴充可用於評估 skipif/xfail/xpass 標記的「全域」變數。

    偽範例

    conftest.py:

    def pytest_markeval_namespace():
        return {"color": "red"}
    

    test_func.py:

    @pytest.mark.skipif("color == 'blue'", reason="Color is not red")
    def test_func():
        assert False
    
  • #8006: 現在可以直接將 MonkeyPatch 物件建構為 pytest.MonkeyPatch(),在無法使用 monkeypatch fixture 的情況下。 以前,有些使用者從私有的 _pytest.monkeypatch.MonkeyPatch 命名空間匯入它。

    此外,MonkeyPatch.context 現在是一個類別方法,可以像 with MonkeyPatch.context() as mp: ... 一樣使用。 這是直接使用 MonkeyPatch 的建議方式,因為與 monkeypatch fixture 不同,直接建立的實例不會自動 undo()

改進

  • #1265: 為從 pytester.run_pytest().stdout 和類似方法傳回的 LineMatcher 類別新增了 __str__ 實作。 它傳回整個輸出,就像現有的 str() 方法一樣。

  • #2044: 詳細模式現在會在測試終端行中的 "SKIPPED"、"XFAIL" 或 "XPASS" 之後顯示測試被跳過的原因。

  • #7469 內建 pytest fixture 的類型現在已匯出,因此可以在測試函式的類型註釋中使用它們。 新匯出的類型為

    不支援建構它們(MonkeyPatch 除外); 它們僅用於類型註釋。 這樣做會發出棄用警告,並且可能會在 pytest 8.0 中變成硬錯誤。

    也不支援對它們進行子類別化。目前在執行階段不會強制執行此操作,但類型檢查器(例如 mypy)會偵測到。

  • #7527: 當相同類型的 namedtuple 實例之間的比較失敗時,pytest 現在會顯示不同的欄位名稱(可能是巢狀的),而不是它們的索引。

  • #7615: Node.warn 現在允許 Warning 的任何子類別,而不僅僅是 PytestWarning

  • #7701: 改進了使用 --collected-only 時的報告。 它現在將在摘要統計資訊中顯示收集的測試數量。

  • #7710: 在 pytest.approx() 中對非數字類型使用嚴格相等比較,而不是引發 TypeError

    這是 3.7 之前的未記錄行為,但現在已正式成為受支援的功能。

  • #7938: 新的 --sw-skip 參數,它是 --stepwise-skip 的簡寫。

  • #8023: 將 'node_modules' 新增到 norecursedirs 的預設值。

  • #8032: 現在已適當地調用 doClassCleanups(在 Python 和 3.8 的 unittest 中引入)。

錯誤修正

  • #4824: 修復了二次行為,並改進了使用 autouse fixture 和 xunit fixture 收集項目的效能。

  • #7758: 修復了套件中的某些檔案即使包含失敗的測試,也會從 --lf 中遺失的問題。 在 pytest 5.4.0 中回歸。

  • #7911: 由 tmp_pathtmpdir 建立的目錄在 3 天未修改後(先前值為 3 小時)現在被視為過時,以避免刪除仍在長時間執行的測試套件中使用的目錄。

  • #7913: 修復了當涉及 readline 模組時,pytester.spawn 中的崩潰或掛起問題。

  • #7951: 修復了收集測試時遞迴符號連結的處理。

  • #7981: 修復了在收集期間未追蹤符號連結目錄的問題。 在 pytest 6.1.0 中回歸。

  • #8016: 修復了在使用 pytest --doctest-modules path/to/an/__init__.py 時僅收集一個 doctest 的問題。

改進的文件

  • #7429: 新增了關於跳過 doctest 的更多資訊和用例。

  • #7780: 不應從中繼承的類別現在在 API 參考中標記為 final class

  • #7872: _pytest.config.argparsing.Parser.addini() 接受明確的 None"string"

  • #7878: 在 pull request 區段中,要求在編輯 changelog 和 authors 檔案後提交。

瑣碎/內部變更

  • #7802: attrs 依賴性需求現在是 >=19.2.0 而不是 >=17.4.0。

  • #8014: .pyc 檔案由 pytest 的斷言重寫功能建立,現在於 Python>=3.7 版本上符合最新的 PEP 552 格式。(這些檔案是內部使用,僅供 pytest 本身解讀。)

pytest 6.1.2 (2020-10-28)

錯誤修正

  • #7758: 修復了套件中的某些檔案即使包含失敗的測試,也會從 --lf 中遺失的問題。 在 pytest 5.4.0 中回歸。

  • #7911: 由 tmpdir 建立的目錄,在沒有修改的情況下,現在將被視為過時 3 天(先前的數值為 3 小時),以避免刪除仍在長時間運行的測試套件中使用的目錄。

改進文件

  • #7815: 改善針對 pytest._fillfuncargs() 的棄用警告訊息。

pytest 6.1.1 (2020-10-03)

錯誤修正

  • #7807: 修正了 pytest 6.1.0 中的回歸錯誤,該錯誤導致在某些非簡單情況下,當父目錄也具有設定檔時,會判斷出不正確的根目錄。

  • #7814: 修正在標頭報告中,當使用 testpaths 且包含絕對路徑時發生的崩潰問題(6.1.0 中的回歸錯誤)。

pytest 6.1.0 (2020-09-26)

重大變更

  • #5585: 根據我們的政策,以下在 5.X 系列中已棄用的功能現在已移除

    • FixtureRequestMetafuncFunction 類別的唯讀屬性 funcargnames。請使用 fixturenames 屬性。

    • @pytest.fixture 不再支援位置引數,請改用關鍵字傳遞所有引數。

    • 直接建構 Node 子類別現在會引發錯誤,請改用 from_parent

    • junit_family 的預設值已變更為 xunit2。如果您需要舊格式,請將 junit_family=xunit1 新增到您的設定檔。

    • TerminalReporter 不再具有 writer 屬性。外掛程式作者可以使用 TerminalReporter 的公開函式,而不是直接存取 TerminalWriter 物件。

    • --result-log 選項已被移除。建議使用者改用 pytest-reportlog 外掛程式。

    如需更多資訊,請參閱文件中的 棄用和移除

棄用

  • #6981: pytest.collect 模組已棄用:其所有名稱都可以直接從 pytest 匯入。

  • #7097: pytest._fillfuncargs 函式已棄用。此函式為了與較舊的外掛程式向後相容而保留。

    其功能不應直接使用,但如果您必須替換它,請改用 function._request._fillfixtures(),但請注意這不是公開 API,並且未來可能會中斷。

  • #7210: -k '-expr' 特殊語法已棄用。請改用 -k 'not expr'

    -k 'expr:' 特殊語法已棄用。如果您使用此語法並需要替代方案,請開啟一個 issue。

  • #7255: pytest_warning_captured hook 已棄用,改用 pytest_warning_recorded,並將在未來版本中移除。

  • #7648: FSCollectorPackagegethookproxy()isinitpath() 方法已棄用;請改用 self.session.gethookproxy()self.session.isinitpath()。這應適用於所有 pytest 版本。

功能

  • #7667: 新增 --durations-min 命令列標誌,用於控制包含在 --durations 顯示的最慢測試列表中的最小持續時間。先前此值硬編碼為 0.005s

改進

  • #6681: 在初始化早期階段發出的內部 pytest 警告現在可以正確處理,並且可以通過 filterwarnings--pythonwarnings/-W 進行篩選。

    這也修正了一些長期存在的問題:#2891#7620#7426

  • #7572: 當 required_plugins 中列出的外掛程式遺失,或 --strict-config 使用了未知的設定鍵時,現在會顯示簡單的錯誤訊息,而不是堆疊追蹤。

  • #7685: 為 Config 新增了兩個新屬性 rootpathinipath。這些屬性是現有 rootdirinifile 屬性的 pathlib.Path 版本,在可能的情況下應優先使用。

  • #7780: 未設計為被繼承的公開類別現在標記為 @final。從這些類別繼承的程式碼將觸發類型檢查(例如 mypy)錯誤,但在運行時仍然可以工作。目前,final 標記未出現在 API 參考文件中,但希望將來會出現。

錯誤修正

  • #1953: 修正覆寫參數化 fixture 時,同時重複使用父 fixture 值時發生的錯誤。

    # conftest.py
    import pytest
    
    
    @pytest.fixture(params=[1, 2])
    def foo(request):
        return request.param
    
    
    # test_foo.py
    import pytest
    
    
    @pytest.fixture
    def foo(foo):
        return foo * 2
    
  • #4984: 修正在收集以裝飾器函式開頭的模組時,當裝飾器引發錯誤且斷言重寫已啟用時,發生的 IndexError: list index out of range 內部錯誤崩潰。

  • #7591: 當從 File 繼承時,pylint 不應再抱怨未實作的抽象方法。

  • #7628: 修正在 Windows 上將不帶磁碟機代號的完整路徑傳遞給 pytest 時的測試收集問題(例如 \projects\tests\test.py 而不是 c:\projects\tests\pytest.py)。

  • #7638: 修正處理在 Windows 上顯示為路徑但觸發 OS 層級語法錯誤的命令列選項,例如 pytest-xdist 內部使用的選項。

  • #7742: 修正當存取具有錯誤 exec 的 locals/globals 時的 INTERNALERROR。

改進文件

  • #1477: 移除 faq.rst 及其在 contents.rst 中的參考。

瑣碎/內部變更

  • #7536: 內部 junitxml 外掛程式已重寫為使用 xml.etree.ElementTree。XML 元素中屬性的順序可能不同。某些不必要的跳脫字元不再執行。

  • #7587: 已移除對 more-itertools 套件的依賴。

  • #7631: capfd.readouterr() (和類似方法) 的結果類型不再是 namedtuple,但在所有方面都應表現得像一個。這樣做是出於技術原因。

  • #7671: 在收集測試時,pytest 通過檢查 Python 物件(模組、類別和實例)的屬性來尋找測試類別和函式。為了加速此過程,pytest 現在忽略內建屬性(例如 __class____delattr____new__),而無需查詢 python_classespython_functions 設定選項,也不會使用 pytest_pycollect_makeitem hook 將它們傳遞給外掛程式。

pytest 6.0.2 (2020-09-04)

錯誤修正

  • #7148: 修正 --log-cli 可能導致不相關的 print 輸出被吞噬的問題。

  • #7672: 修正如果 caplog.set_level 被多次呼叫,則記錄捕獲層級還原不正確的問題。

  • #7686: 修正在參數化列表為空時,NotSetType.token 被用作參數 ID 的問題。在 pytest 6.0.0 中回歸。

  • #7707: 修正處理包含多行或樣式使用多行的一些例外情況時的內部錯誤(例如 --tb=line)。

pytest 6.0.1 (2020-07-30)

錯誤修正

  • #7394: 現在接受將空的 help 值傳遞給 Parser.add_option,而不會在運行 pytest --help 時崩潰。傳遞 None 會引發更具資訊性的 TypeError

  • #7558: 修正 pylint not-callable lint 在 pytest.mark.parametrize() 和其他內建標記上的問題:skipskipifxfailusefixturesfilterwarnings

  • #7559: 修正在使用 TestReport.longreprtext (例如 pytest-html) 的外掛程式中,當 TestReport.longrepr 不是字串時的回歸錯誤。

  • #7569: 修正記錄捕獲處理器的層級在呼叫 caplog.set_level() 後未在拆解時重設的問題。

pytest 6.0.0 (2020-07-28)

(請同時參閱下方 6.0.0rc1 筆記中的此版本完整變更集)

重大變更

  • #5584: PytestDeprecationWarning 現在預設為錯誤。

    為了實現我們盡可能減少中斷地移除已棄用功能的計畫,所有 PytestDeprecationWarning 類型的警告現在都會產生錯誤,而不是警告訊息。

    受影響的功能將在 pytest 6.1 中有效地移除,因此請參閱文件中的 棄用和移除 章節,以獲取有關如何更新現有程式碼的指示。

    在 pytest 6.0.X 系列中,可以通過將以下內容新增到您的 pytest.ini 檔案中,將錯誤改回警告作為權宜之計

    [pytest]
    filterwarnings =
        ignore::pytest.PytestDeprecationWarning
    

    但是當 pytest 6.1 發佈時,這將停止運作。

    如果您對移除特定功能有疑慮,請在 #5584 中新增評論。

  • #7472: 已移除 _pytest._code.Frameexec_()is_true() 方法。

功能

改進

  • #7467: --log-file CLI 選項和 log_file ini 標記現在會在需要時建立子目錄。

  • #7489: 當 match 等於取得的字串但不是正則表達式匹配時,pytest.raises() 函式具有更清晰的錯誤訊息。在這種情況下,建議跳脫正則表達式。

錯誤修正

  • #7392: 修正在使用 --runxfail 時,使用 @pytest.mark.skip 跳過的測試的報告位置。

  • #7491: 如果無法存取用於檢查過時暫存目錄的鎖定,tmpdirtmp_path 不再引發錯誤。

  • #7517: 保留通過 capfd 捕獲時的行尾符號。

  • #7534: 還原意外變更的 TracebackEntry.__str__ 的先前格式。

改進文件

  • #7422: 闡明 usefixtures 標記何時可以將 fixture 應用於測試。

  • #7441: 在入門指南中新增關於 -q 選項的註解。

瑣碎/內部變更

  • #7389: fixture 作用域 package 不再被視為實驗性功能。

pytest 6.0.0rc1 (2020-07-08)

重大變更

  • #1316: TestReport.longrepr 現在始終是 ReprExceptionInfo 的實例。先前,當測試因 pytest.fail(..., pytrace=False) 失敗時,它是一個 str

  • #5965: 在收集和匹配具有測試檔案路徑的 conftest.py 檔案期間,不再解析符號連結。

    為了解決當前目錄和在收集期間解析符號連結的問題,在 3.9.0 中引入了一個錯誤修正,但它實際上是一個新功能,在 Windows 中產生了不幸的後果,並在其他平台上產生了令人驚訝的結果。

    團隊決定撤回對符號連結的解析,並計畫在未來以更穩固的解決方案重新審視此問題(有關詳細資訊,請參閱 #6523 中的討論)。

    這可能會破壞利用此功能的測試套件;修復方法是為整個測試樹建立符號連結,而不僅僅是像以前那樣針對部分檔案/樹。

  • #6505: Testdir.run().parseoutcomes() 現在始終以複數形式返回解析的名詞。

    最初 parseoutcomes() 始終以複數形式返回名詞,但是旨在通過對單個項目使用單數形式(1 warning1 error)來改進終端摘要的變更,導致意外的回歸,即更改了 parseoutcomes() 返回的鍵。

    現在 API 保證始終返回複數形式,因此像這樣的呼叫

    result = testdir.runpytest()
    result.assert_outcomes(error=1)
    

    需要更改為

    result = testdir.runpytest()
    result.assert_outcomes(errors=1)
    
  • #6903: 現在假定 os.dup() 函式存在。我們不知道有任何受支援的 Python 3 實作不提供它。

  • #7040: -k 不再匹配測試會話根目錄之外的目錄名稱。

    此外,pytest.Package.name 現在僅是包含套件 __init__.py 檔案的目錄名稱,而不是完整路徑。這與其他節點的命名方式一致,也是 -k 會匹配包含測試套件的任何目錄的原因之一。

  • #7122: 給定 -m-k 選項的表達式不再使用 Python 的 eval() 進行評估。該格式支援 orandnot、括號和用於匹配的通用識別符。Python 常數、關鍵字或其他運算符不再以不同的方式評估。

  • #7135: Pytest 現在使用自己的 TerminalWriter 類別,而不是使用 py 庫中的類別。外掛程式通常通過 TerminalReporter.writerTerminalReporter.write() (和類似方法) 或 _pytest.config.create_terminal_writer() 存取此類別。

    進行了以下重大變更

    • 輸出 (write() 方法和其他方法) 不再隱式刷新;尊重底層檔案的刷新行為。要顯式刷新(例如,如果您希望在列印行尾符號之前顯示輸出),請使用 write(flush=True)terminal_writer.flush()

    • 已移除顯式的 Windows 控制台支援,委託給 colorama 庫。

    • 已移除對寫入 bytes 的支援。

    • 已移除 reline 方法和 chars_on_current_line 屬性。

    • 已移除 stringioencoding 引數。

    • 已移除對傳遞可呼叫物件而不是檔案的支援。

  • #7224: 日誌記錄外掛程式設定的 item.catch_log_handleritem.catch_log_handlers 屬性,從未打算公開,現在不再可用。

    已移除已棄用的 --no-print-logs 選項和 log_print ini 選項。請改用 --show-capture

  • #7226: 從 pytest.Function.__init__ 中移除未使用的 args 參數。

  • #7418: 移除 pytest_doctest_prepare_content hook 規範。此 hook 至少 10 年未被 pytest 觸發。

  • #7438: 對於可能正在使用它的外掛程式作者,此處列出對內部 _pytest._code.source 進行的一些變更

    • 已移除 Source()deindent 引數,現在始終為 true。

    • 已移除對 Source() 的零個或多個引數的支援。

    • 已移除對將 Sourcestr 進行比較的支援。

    • 已移除 Source.isparseable()Source.putaround() 方法。

    • 已移除 Source.compile() 方法和 _pytest._code.compile() 函式;請改用普通的 compile()

    • 已移除 _pytest._code.source.getsource() 函式;請改為直接使用 Source()

棄用

  • #7210: -k '-expr' 特殊語法已棄用。請改用 -k 'not expr'

    -k 'expr:' 特殊語法已棄用。如果您使用此語法並需要替代方案,請開啟一個 issue。

  • #4049: pytest_warning_captured 已棄用,改用 pytest_warning_recorded hook。

功能

  • #1556: pytest 現在支援用於設定的 pyproject.toml 檔案。

    設定選項與其他格式中可用的選項類似,但必須在 [tool.pytest.ini_options] 表格中定義,才能被 pytest 識別

    # pyproject.toml
    [tool.pytest.ini_options]
    minversion = "6.0"
    addopts = "-ra -q"
    testpaths = [
        "tests",
        "integration",
    ]
    

    更多資訊可以在 文件中 找到。

  • #3342: pytest 現在包含內聯類型註釋,並將它們公開給使用者程式。涵蓋了大多數面向使用者的 API,以及內部程式碼。

    如果您在測試中運行類型檢查器(例如 mypy),您可能會開始注意到類型錯誤,指示不正確的使用方式。如果您遇到您認為不正確的錯誤,請在 issue 中告知我們。

    這些類型是針對 mypy 版本 0.780 開發的。已知 0.750 之前的版本無法運作。我們建議使用最新版本。其他類型檢查器也可能運作良好,但它們尚未經過 pytest 的官方驗證。

  • #4049: 引入了一個名為 pytest_warning_recorded 的新 hook,以傳達有關內部 pytest 警告外掛程式捕獲的警告的資訊。

    此 hook 旨在取代 pytest_warning_captured,後者已棄用,並將在未來版本中移除。

  • #6471: 新增命令列標誌

    • --no-header:禁用初始標頭,包括平台、版本和外掛程式。

    • --no-summary:禁用最終測試摘要,包括警告。

  • #6856: 當從 config INI 檔案中讀取到未知鍵時,現在會顯示警告。

    已新增 --strict-config 標誌,將這些警告視為錯誤。

  • #6906: 新增 --code-highlight 命令列選項,以啟用/禁用終端輸出中的程式碼高亮顯示。

  • #7245: 新增 --import-mode=importlib 選項,該選項使用 importlib 匯入測試模組。

    傳統上,pytest 使用 __import__,同時更改 sys.path 以匯入測試模組(這也會作為副作用更改 sys.modules),這雖然可行,但存在許多缺點,例如要求不位於套件中的測試模組具有唯一的名稱(因為它們需要以唯一的名稱駐留在 sys.modules 中)。

    --import-mode=importlib 使用來自 importlib 的更細緻的匯入機制,這些機制不需要 pytest 更改 sys.pathsys.modules,從而消除了先前模式的大部分缺點。

    我們打算在未來版本中將 --import-mode=importlib 作為預設值,因此鼓勵使用者嘗試新模式並在 issue #7245 中提供回饋(正面或負面)。

    您可以在 文件中 閱讀有關此選項的更多資訊。

  • #7305: 新增 required_plugins 配置選項,允許使用者指定一個外掛程式列表,包含版本資訊,這些外掛程式是 pytest 執行時所必需的。如果執行 pytest 時未找到任何必需的外掛程式,則會引發錯誤。

改進項目

  • #4375: pytest 命令現在會抑制 BrokenPipeError 錯誤訊息,該訊息會在 pytest 的輸出被管道傳輸且管道被管道傳輸到的程式關閉時列印到 stderr (常見範例為 lesshead)。

  • #4391: 提升測試持續時間測量的精確度。CallInfo 項目現在有一個新的 <CallInfo>.duration 屬性,使用 time.perf_counter() 建立。此屬性用於填充 <TestReport>.duration 屬性,這比之前的 <CallInfo>.stop - <CallInfo>.start (因為這些是基於 time.time()) 更準確。

  • #4675: 現在 dataclass 和 attrs-class 的豐富比較是遞迴的。

  • #6285: 公開了 pytest.FixtureLookupError 例外,當具有給定名稱的 fixture 無法傳回時,會由 request.getfixturevalue() (其中 request 是一個 FixtureRequest fixture) 引發。

  • #6433: 如果在格式化記錄呼叫中的訊息時遇到錯誤,例如 logging.warning("oh no!: %s: %s", "first") (缺少第二個引數),pytest 現在會傳播錯誤,可能導致測試失敗。

    先前,這樣的錯誤會導致錯誤列印到 stderr,這在預設情況下不會為通過的測試顯示。此變更使錯誤在測試期間可見。

    您可以透過設定 logging.raiseExceptions = False 來暫時或永久抑制此行為。

  • #6817: 保留命令列選項的說明文字中的明確換行符,允許外掛程式更好地控制向使用者顯示的說明。

  • #6940: 當使用 --duration 選項時,終端訊息輸出現在更精確地顯示隱藏項目的數量和持續時間。

  • #6991: 收集到的檔案會在 hook 的任何報告之後顯示,例如來自 --lf 的狀態。

  • #7091: 當透過 --capture=fdcapfdcapfdbinary fixture 使用 fd 捕獲時,且檔案描述符 (0, 1, 2) 無法複製,仍會執行 FD 捕獲。先前,在這種情況下,直接寫入檔案描述符將會失敗或遺失。

  • #7119: 如果 --basetemp 引數為空、目前工作目錄或其中一個父目錄,則以錯誤退出。這樣做是為了防止意外資料遺失,因為傳遞給此引數的任何目錄都會被清除。

  • #7128: pytest --version 現在僅顯示 pytest 版本,而 pytest --version --version 顯示更詳細的資訊,包括外掛程式。這與其他工具顯示 --version 的方式更一致。

  • #7133: caplog.set_level() 現在將覆寫透過 CLI 或組態檔設定的任何 log_level

  • #7159: caplog.set_level()caplog.at_level() 不再影響 Captured log report 報告區段中顯示的日誌層級。

  • #7348: 改進 dataclass / attrs 上比較斷言的遞迴差異報告。

  • #7385: --junitxml 現在在設定和拆解期間的失敗的 message XML 屬性中包含例外原因。

    先前

    <error message="test setup failure">
    

    現在

    <error message="failed on setup with &quot;ValueError: Some error during setup&quot;">
    

錯誤修正

  • #1120: 修正當多個 pytest 實例並行執行時,tmpdir 中的目錄未正確移除的問題。

  • #4583: 防止當標記表達式 (-m) 調用 eval() 引發任何例外時崩潰並提供使用者友善的錯誤訊息。

  • #4677: SKIPPED 測試的摘要報告中顯示的路徑現在始終是相對路徑。先前有時是絕對路徑。

  • #5456: 修正嘗試移除用於控制對 tmp_pathtmpdir 建立的資料夾的存取的鎖定檔案時,可能發生的競爭條件。

  • #6240: 修正了在收集步驟期間記錄導致日誌訊息重複輸出到 stderr 的問題。

  • #6428: 在工作目錄自會話開始以來已變更的情況下,錯誤訊息中顯示的路徑現在是正確的。

  • #6755: 支援刪除在 tmpdir 內建立的 Windows 上長度超過 260 個字元的路徑。

  • #6871: 修正使用 capsysbinary 時具有捕獲輸出的崩潰問題。

  • #6909: 還原由 #6330 引入的變更,該變更要求 @pytest.mark.parametrize 的所有引數都必須在函式簽名中明確定義。

    原始變更的意圖是移除預期之外/令人驚訝的行為,但事實證明許多人依賴它,因此限制已還原。

  • #6910: 修正當外掛程式在使用 --reportlog 選項時傳回未知統計資訊時崩潰的問題。

  • #6924: 確保 unittest.IsolatedAsyncioTestCase 實際上已等待。

  • #6925: 修正 TerminalRepr 實例再次可雜湊。

  • #6947: 修正使用 unittest.TestCase.addCleanup() 註冊的函式在測試失敗時未被呼叫的回歸問題。

  • #6951: 允許使用者仍然設定已棄用的 TerminalReporter.writer 屬性。

  • #6956: 防止 pytest 將 ConftestImportFailure traceback 列印到 stdout。

  • #6991: 修正自 pytest 5.4 以來 --lf 過濾過多的回歸問題。

  • #6992: 還原 “tmpdir: clean up indirection via config for factories” #6767,因為它會破壞 pytest-xdist。

  • #7061: 當產生 fixture 無法產生值時,報告測試設定錯誤而不是崩潰。

  • #7076: 由 @pytest.mark.skip 跳過的檔案路徑在 SKIPPED 報告中現在相對於調用目錄。先前它相對於根目錄。

  • #7110: 修正回歸問題: asyncbase.TestCase 測試再次正確執行。

  • #7126: 當使用 -bb 旗標呼叫 Python 時,--setup-show 現在在使用位元組值作為 parametrize 參數時不會引發錯誤。

  • #7143: 修正 pytest.File.from_parent,使其將額外的關鍵字引數轉發到建構函式。

  • #7145: 具有損壞的 __getattribute__ 方法的類別在失敗期間會正確顯示。

  • #7150: 防止在引發 ConfTestImportFailure 時隱藏底層例外。

  • #7180: 修正編碼方式與 locale 不同的檔案的 _is_setup_py

  • #7215: 修正使用 --pdb 執行時會為跳過的測試呼叫 unittest.TestCase.tearDown() 的回歸問題。

  • #7253: 當直接在函式上使用 pytest.fixture 時,如 pytest.fixture(func),如果也傳遞了 autouseparams 引數,則不再忽略該函式,而是標記為 fixture。

  • #7360: 修正可能不正確評估傳遞給 pytest.mark.skipifpytest.mark.xfail 的字串表達式,在極少數情況下,使用的字串完全相同但指向不同的全域值。

  • #7383: 修正了整個程式碼庫中的例外原因,即在包裝例外時使用 raise new_exception from old_exception

改進文件

  • #7202: 開發指南現在連結到文件和 GitHub 上的 RELEASING.rst 的貢獻章節。

  • #7233: 新增關於 --strict--strict-markers 以及後者偏好的註釋。

  • #7345: 解釋 fixture 的間接參數化和標記。

瑣碎/內部變更

  • #7035: _pytest.python.Functionoriginalname 屬性現在預設為 name (如果未明確提供),並且始終設定。

  • #7264: 已移除對 wcwidth 套件的依賴。

  • #7291: 將 py.iniconfig 替換為 iniconfig

  • #7295: src/_pytest/config/__init__.py 現在使用 warnings 模組來報告警告,而不是 sys.stderr.write

  • #7356: 從舊的 pytest-xdist 中移除最後一次內部使用已棄用的 slave 術語。

  • #7357: 現在需要 py>=1.8.2。

pytest 5.4.3 (2020-06-02)

錯誤修正

  • #6428: 在工作目錄自會話開始以來已變更的情況下,錯誤訊息中顯示的路徑現在是正確的。

  • #6755: 支援刪除在 tmpdir 內建立的 Windows 上長度超過 260 個字元的路徑。

  • #6956: 防止 pytest 將 ConftestImportFailure traceback 列印到 stdout。

  • #7150: 防止在引發 ConfTestImportFailure 時隱藏底層例外。

  • #7215: 修正使用 --pdb 執行時會為跳過的測試呼叫 unittest.TestCase 子類別的 tearDown 方法的回歸問題。

pytest 5.4.2 (2020-05-08)

錯誤修正

  • #6871: 修正使用 capsysbinary fixture 時具有捕獲輸出的崩潰問題。

  • #6924: 確保 unittest.IsolatedAsyncioTestCase 實際上已等待。

  • #6925: 修正 TerminalRepr 實例再次可雜湊。

  • #6947: 修正使用 TestCase.addCleanup 註冊的函式在測試失敗時未被呼叫的回歸問題。

  • #6951: 允許使用者仍然設定已棄用的 TerminalReporter.writer 屬性。

  • #6992: 還原 “tmpdir: clean up indirection via config for factories” #6767,因為它會破壞 pytest-xdist。

  • #7110: 修正回歸問題: asyncbase.TestCase 測試再次正確執行。

  • #7143: 修正 File.from_parent,使其將額外的關鍵字引數轉發到建構函式。

  • #7145: 具有損壞的 __getattribute__ 方法的類別在失敗期間會正確顯示。

  • #7180: 修正編碼方式與 locale 不同的檔案的 _is_setup_py

pytest 5.4.1 (2020-03-13)

錯誤修正

  • #6909: 還原由 #6330 引入的變更,該變更要求 @pytest.mark.parametrize 的所有引數都必須在函式簽名中明確定義。

    原始變更的意圖是移除預期之外/令人驚訝的行為,但事實證明許多人依賴它,因此限制已還原。

  • #6910: 修正當外掛程式在使用 --reportlog 選項時傳回未知統計資訊時崩潰的問題。

pytest 5.4.0 (2020-03-12)

重大變更

  • #6316: -k EXPRESSION 與測試名稱的匹配現在區分大小寫。

  • #6443: 使用 -p 指定的外掛程式現在會在內部外掛程式之後載入,這會導致它們的 hook 在內部外掛程式之前被呼叫。

    這使得 -p 行為與 PYTEST_PLUGINS 一致。

  • #6637: 移除長期棄用的 pytest_itemstart hook。

    此 hook 已被標記為已棄用,甚至在過去 10 年中都未被 pytest 呼叫。

  • #6673: 反轉 / 修正錯誤差異中 “+/-” 的含義。“-” 表示結果中缺少預期的內容,“+” 表示結果中存在意外的額外內容。

  • #6737: 當結果不可用時,FixtureDefcached_result 屬性現在設定為 None,而不是被刪除。

    如果您的外掛程式執行類似 hasattr(fixturedef, 'cached_result') 的檢查,例如在 pytest_fixture_post_finalizer hook 實作中,請將其替換為 fixturedef.cached_result is not None。如果您 del 該屬性,請將其設定為 None

棄用

  • #3238: 選項 --no-print-logs 已棄用,並計劃在未來版本中移除。如果您使用 --no-print-logs,請嘗試 --show-capture 並提供回饋。

    --show-capture 命令列選項已在 pytest 3.5.0 中新增,並允許指定在測試失敗時如何顯示捕獲的輸出: nostdoutstderrlogall (預設值)。

  • #571: 棄用未使用/損壞的 pytest_collect_directory hook。自 2010 年移除 Directory 收集器以來,它一直未對齊,並且一旦收集與測試執行分離,它就變得不正確/無法使用。

  • #5975: 棄用直接使用建構函式建立 Nodes

    相反地,它們現在透過 Node.from_parent 建構。

    此過渡機制使我們能夠透過強制執行更受控制的建立/配置模式,來解開非常複雜的 Node 關係。

    作為此變更的一部分,session/config 已經是不允許的參數,並且隨著我們處理細節,我們可能也需要不允許更多參數。

    如果子類別打算擴展 Nodes 的建立,則預期使用 super().from_parent

  • #6779: TerminalReporter.writer 屬性已被棄用,不應再使用。這是不小心公開為該外掛程式的公共 API 的一部分,並將其與 py.io.TerminalWriter 緊密聯繫在一起。

功能

  • #4597: 新增 –capture=tee-sys 選項,允許即時列印和捕獲測試輸出。

  • #5712: 現在 @pytest.mark.parametrize 的所有引數都需要在函式簽名中或透過 indirect 明確宣告。先前,如果存在具有相同名稱的 fixture,則可以省略引數,這只是實作上的意外,並非 API 的一部分。

  • #6454: 將 -r 的預設值變更為 fE,這會在簡短測試摘要中顯示失敗和錯誤。-rN 可用於停用它 (舊行為)。

  • #6469: 已將新選項新增到 junit_logging 選項: logout-errall

  • #6834: 現在每個檔案都會摺疊過多的警告摘要,以確保警告摘要的可讀顯示。

改進項目

  • #1857: pytest.mark.parametrize 再次接受 ids 的整數,並將其轉換為字串。

  • #449: 對於任何 XPASSED 測試,使用 “黃色” 主色。

  • #4639: 還原 “現在針對 None 進行斷言時會發出警告”。

    事實證明,該警告不如最初預期的有用,並且有相當多的誤報案例。

  • #5686: 當給定絕對和非正規化路徑時,tmpdir_factory.mktemp 現在會失敗。

  • #5984: pytest_warning_captured hook 現在接收一個 location 參數,其中包含產生警告的程式碼位置。

  • #6213: pytester: testdir fixture 尊重來自 monkeypatch fixture 的環境設定,用於內部執行。

  • #6247: --fulltrace 在收集錯誤時也會被遵循。

  • #6384: 使 --showlocals 也適用於 --tb=short

  • #6653: 新增支援使用 LineMatcherfnmatch_lines()re_match_lines() 連續匹配行。

  • #6658: 安裝 pygments 後,程式碼現在會在 traceback 中突出顯示。

    鼓勵使用者將 pygments 安裝到他們的環境中並提供回饋,因為計畫是將 pygments 在未來作為常規依賴項。

  • #6795: 使用無效的 -o 選項的匯入用法錯誤訊息。

  • #759: pytest.mark.parametrize 支援 ids 的迭代器和產生器。

錯誤修正

  • #310: 新增支援使用 doctest 呼叫 pytest.xfail()pytest.importorskip()

  • #3823: --trace 現在適用於 unittest。

  • #4445: 修正 pytest 產生的一些警告報告,以指向使用者程式碼中警告的正確位置。

  • #5301: 修正 --last-failed 以從具有已知失敗的檔案中收集新測試。

  • #5928: 在使用者程式碼層級報告 PytestUnknownMarkWarning,而不是 pytest 的層級。

  • #5991: 修正與 --pdb 和 unittest 的互動: 不要使用 unittest 的 TestCase.debug()

  • #6334: 修正當在 -r 命令列選項中同時使用 f/Fs/S 報告字元時 (例如 -rFf) 摘要條目出現兩次的問題。

    大寫變體從未記錄在文件中,首選形式應為小寫。

  • #6409: 對於沒有先前通過的非最後項目,使用彩色終端進度指示器時,回退到綠色 (而不是黃色)。

  • #6454: --disable-warnings-ra-rA 中被遵循。

  • #6497: 修正 fixture 中請求金鑰與快取金鑰比較的錯誤。

    建構 if key == cached_key: 可能會失敗,原因可能是明確不允許 ==,或者例如,對於 NumPy 陣列,其中 a == b 的結果通常無法轉換為 bool。實作的修復將 == 替換為 is

  • #6557: 使捕獲輸出流 .write() 方法從原始流傳回相同的傳回值。

  • #6566: 修正 EncodedFile.writelines 以呼叫底層緩衝區的 writelines 方法。

  • #6575: 修正當 faulthandler 開始初始化時 (例如設定 PYTHONFAULTHANDLER=1 環境變數) 且組態檔中定義了 faulthandler_timeout 時的內部崩潰。

  • #6597: 修正在節點 ID 中包含參數化的空字串變數的問題。

  • #6646: 斷言重寫 Hook 會針對當前項目重新儲存,這修正了它們在例如 pytester 的 testdir.runpytest 等之後仍然被使用的問題。

  • #6660: 從 pytest.exit() hook 發出時,會處理 pytest_sessionfinish。這包括從偵錯器中退出。

  • #6752: 當 pytest.raises() 作為函數使用(而非上下文管理器)時,match 關鍵字參數現在會傳遞給被測試的函數。先前它會被吞噬並忽略(pytest 5.1.0 中的回歸)。

  • #6801: 針對 doctest 中非預期的例外狀況,不要在追溯中顯示空行。

  • #6802: testdir fixture 現在可以在 doctest 中運作。

文件改善

  • #6696: 在 fixture 章節的開頭新增 fixture 列表。

  • #6742: 將關於 fixture 的第一句話擴展成一個段落。

細微/內部變更

  • #6404: 移除在 Python 3.9 中已棄用的 parser 模組的使用。

pytest 5.3.5 (2020-01-29)

Bug 修正

  • #6517: 修正 pytest 5.3.4 中的回歸問題,該問題導致由於錯誤的斷言而產生 INTERNALERROR。

pytest 5.3.4 (2020-01-20)

Bug 修正

  • #6496: 還原 #6436:不幸的是,此變更已在許多套件中造成許多回歸問題,因此團隊決定還原此變更並發布新版本,同時我們將繼續尋找解決方案。

pytest 5.3.3 (2020-01-16)

Bug 修正

  • #2780: 在 teardown 期間捕獲的輸出會與 -rP 一起顯示。

  • #5971: 修正處理由 multiprocessing 模組建立的子進程中引發的例外狀況時,pytest-xdist 崩潰的問題。

  • #6436: FixtureDef 物件現在會正確地向 fixture 堆疊中在其之前執行的 autouse 和參數化 fixture 註冊其 finalizer,以便它們在正確的時間和正確的順序被拆解。

  • #6532: 修正使用 testdir 結果解析包含多個錯誤的結果(5.3.0 中的回歸)。

細微/內部變更

  • #6350: 優化測試參數 ID 的自動重新命名。

pytest 5.3.2 (2019-12-13)

功能改進

  • #4639: 還原 “現在針對 None 進行斷言時會發出警告”。

    事實證明,該警告不如最初預期的有用,並且有相當多的誤報案例。

Bug 修正

  • #5430: junitxml:若測試在呼叫階段失敗,失敗測試的日誌現在會傳遞到 junit 報告中。

  • #6290: .pytest_cache 目錄中的支援檔案會與 --cache-clear 一起保留,現在僅清除快取值。

  • #6301: 修正基於 egg 的發行版和 editable 安裝(pip install --editable)的斷言重寫。

pytest 5.3.1 (2019-11-25)

功能改進

Bug 修正

pytest 5.3.0 (2019-11-19)

棄用

  • #6179: 鑑於 junit_family 選項的預設值將在 pytest 6.0 中變更為 "xunit2",因為這是預設情況下現代工具支援的檔案類型版本。

    為了使過渡更順利,如果在命令列中給出 --junitxml 選項,但在 pytest.ini 中未明確配置 junit_family,pytest 將發出警告。

    如需更多資訊,請參閱文件

新功能

  • #4488: pytest 團隊已建立 pytest-reportlog 外掛程式,該外掛程式提供新的 --report-log=FILE 選項,可在測試會話執行時將報告日誌寫入檔案。

    報告日誌的每一行都包含一個自我包含的 JSON 物件,該物件對應於測試事件,例如收集或測試結果報告。保證在寫入每一行後刷新檔案,以便系統可以即時讀取和處理事件。

    此外掛程式旨在取代已棄用且計劃在未來版本中移除的 --resultlog 選項。如果您使用 --resultlog,請試用 pytest-reportlog 並提供回饋。

  • #4730: 當設定 sys.pycache_prefix (Python 3.8+) 時,pytest 將使用它來快取由斷言重寫機制變更的測試檔案。

    這使得即使在沒有權限的檔案系統上也能更容易地受益於快取的 .pyc 檔案。

  • #5515: 允許選擇性自動縮排多行日誌訊息。

    新增命令列選項 --log-auto-indent、配置選項 log_auto_indent 以及支援在呼叫 logging.log() 時對每個條目配置縮排行為。

    將自動縮排的預設值從 "on" 變更為 "off"。這恢復了 v4.6.0 之前的舊行為。之所以恢復到之前的行為,是因為最好明確地啟用可能導致測試失敗的新功能,而不是隱含地啟用。

  • #5914: testdir 學習了兩個新函數,no_fnmatch_line()no_re_match_line()

    這些函數用於確保捕獲的文字符合給定的模式。

    先前的慣用方法是使用 re.match()

    result = testdir.runpytest()
    assert re.match(pat, result.stdout.str()) is None
    

    in 運算子

    result = testdir.runpytest()
    assert text in result.stdout.str()
    

    但是新函數在失敗時產生最佳輸出。

  • #6057: 列印 pytest.approx 時,為複數值新增了容差。

    例如,repr(pytest.approx(3+4j)) 傳回 (3+4j) ± 5e-06 ±180°。這是極座標表示法,指示預期值周圍的圓,半徑為 5e-06。為了使 approx 比較傳回 True,實際值應落在這個圓內。

  • #6061: 將 pluginmanager 作為引數新增到 pytest_addoption,以便在設定命令列選項時可以調用 Hook。這對於讓一個外掛程式與另一個外掛程式溝通事情很有用,例如預設值或要新增的命令列選項集。

功能改進

  • #5061: 在終端機摘要統計資訊中使用多種顏色。

  • #5630: 從偵錯器退出現在可以在 doctest 項目中正確處理。

  • #5924: 改善序列的詳細差異輸出。

    之前

    E   AssertionError: assert ['version', '...version_info'] == ['version', '...version', ...]
    E     Right contains 3 more items, first extra item: ' '
    E     Full diff:
    E     - ['version', 'version_info', 'sys.version', 'sys.version_info']
    E     + ['version',
    E     +  'version_info',
    E     +  'sys.version',
    E     +  'sys.version_info',
    E     +  ' ',
    E     +  'sys.version',
    E     +  'sys.version_info']
    

    之後

    E   AssertionError: assert ['version', '...version_info'] == ['version', '...version', ...]
    E     Right contains 3 more items, first extra item: ' '
    E     Full diff:
    E       [
    E        'version',
    E        'version_info',
    E        'sys.version',
    E        'sys.version_info',
    E     +  ' ',
    E     +  'sys.version',
    E     +  'sys.version_info',
    E       ]
    
  • #5934: ExceptionInfo 物件的 repr 已得到改進,以尊重底層例外狀況的 __repr__ 方法。

  • #5936: 使用 -vv 顯示未截斷的斷言訊息。

  • #5990: 修正測試摘要中的複數不匹配問題(例如,顯示 “1 error” 而不是 “1 errors”)。

  • #6008: Config.InvocationParams.args 現在始終是 tuple,以便更好地傳達它應該是不可變的並避免意外修改。

  • #6023: pytest.main 現在傳回 pytest.ExitCode 實例,除非使用自訂退出代碼(在這種情況下,它仍然傳回 int)。

  • #6026: 對齊 pytester 的 LineMatcher 輸出的前綴。

  • #6059: 收集錯誤在終端機的簡短測試摘要中報告為錯誤(而不是像以前一樣報告為失敗)。

  • #6069: pytester.spawn 不再無條件地在 FreeBSD 上跳過/xfail 測試。

  • #6097: 測試摘要中的 “[…%]” 指示器現在根據最終(新的)多色行的主顏色著色。

  • #6116: 新增 --co 作為 --collect-only 的同義詞。

  • #6148: atomicwrites 現在僅在 Windows 上使用,修正了 Unix 上斷言重寫的效能回歸問題。

  • #6152: 現在參數化將使用任何物件的 __name__ 屬性作為 ID(如果存在)。先前,它僅對函數和類別使用 __name__

  • #6176: 改善 pytester 的 Hookrecorder.assertoutcome 的失敗報告。

  • #6181: 停止會話的原因(例如,使用 --maxfail / -x)現在會在測試摘要中報告。

  • #6206: 改善 cache.set 的穩健性和效能。

Bug 修正

  • #2049: 修正 --setup-plan 顯示關於 fixture 生命周期不準確資訊的問題。

  • #2548: 修正終端機摘要中跳過測試的行偏移不匹配問題。

  • #6039: 當取消配置 doctest 外掛程式時,PytestDoctestRunner 現在會正確失效。

    這在使用 pytesterrunpytest_inprocess 時很重要。

  • #6047: saferepr 現在處理 BaseException,其中包括 pytest.fail.Exception 等。

  • #6074: pytester:修正在清理暫存目錄時 rm_rf 警告中的引數順序,並且不要針對 os.open 錯誤發出警告。

  • #6189: 修正 getmodpath 方法的結果。

細微/內部變更

  • #4901: 來自 pytesterRunResult 現在會在其為有效的 pytest.ExitCode 值時顯示 ret 屬性的助記符號。

pytest 5.2.4 (2019-11-15)

Bug 修正

  • #6194: 修正錯誤地探索非測試 __init__.py 檔案的問題。

  • #6197: 還原 “套件中的第一個測試 (__init__.py) 標記為 @pytest.mark.skip 現在已正確跳過。”。

pytest 5.2.3 (2019-11-14)

Bug 修正

  • #5830: 套件中的第一個測試 (__init__.py) 標記為 @pytest.mark.skip 現在已正確跳過。

  • #6099: 修正與參數化函數一起使用時的 --trace

  • #6183: 在 @pytest.mark.parametrize 中使用 request 作為參數名稱現在會產生更友好的錯誤訊息。

pytest 5.2.2 (2019-10-24)

Bug 修正

  • #5206: 修正 --nf 以記住具有部分測試選擇的已知 nodeid。

  • #5906: 修正 KeyboardInterrupt 期間 --setup-show 崩潰的問題。

  • #5946: 修正使用 numpy 陣列(以及其他類似序列的類型)參數化 fixture 時的問題。

  • #6044: 在嘗試移除舊的暫存目錄時,正確忽略 FileNotFoundError 例外狀況,例如當多個進程嘗試移除同一個目錄時(例如,常見於 pytest-xdist)。

pytest 5.2.1 (2019-10-06)

Bug 修正

  • #5902: 修正 attrs>=19.2 中關於已棄用 cmp 屬性的警告。

pytest 5.2.0 (2019-09-28)

棄用

  • #1682: 將引數作為位置引數傳遞給 pytest.fixture() 已被棄用 - 請改為將其作為關鍵字引數傳遞。

新功能

  • #1682: @pytest.fixturescope 參數現在可以是一個可呼叫物件,它接收 fixture 名稱和 config 物件作為僅限關鍵字的參數。有關更多資訊,請參閱 文件

  • #5764: --pastebin 選項的新行為:連線到 pastebin 伺服器失敗時會報告,而不會使 pytest 執行失敗

Bug 修正

  • #5806: 修正從 --pastebin 上傳到 bpaste.net 時使用的 “lexer” 為 “text”。

  • #5884: 修正自訂 pytest 項目的 --setup-only--setup-show

細微/內部變更

  • #5056: HelpFormatter 使用 py.io.get_terminal_width 以獲得更好的寬度偵測。

pytest 5.1.3 (2019-09-18)

Bug 修正

  • #5807: 修正 windows 上的 pypy3.6 (nightly)。

  • #5811: 正確處理與 pytest.raises 一起使用的 --fulltrace

  • #5819: Windows:修正合格名稱包含大寫字元的 conftest 的回歸問題(由 #5792 引入)。

pytest 5.1.2 (2019-08-30)

Bug 修正

  • #2270: 修正 plugin 類別中定義的函數範圍 fixture 中的 self 參考:先前 self 將是對測試類別的參考,而不是外掛程式類別。

  • #570: 修正了長期存在的問題,即在使用間接 fixture 進行參數化期間,fixture 範圍未被尊重。

  • #5782: 修正列印來自 --pastebin 的錯誤回應時的解碼錯誤。

  • #5786: 測試和收集報告中的鏈式例外狀況現在已正確序列化,允許像 pytest-xdist 這樣的外掛程式正確顯示它們。

  • #5792: Windows:修正在從工作目錄載入 conftest.py 時,在某些情況下發生的錯誤,該工作目錄的大小寫與檔案系統中儲存的大小寫不同(例如,c:\test 而不是 C:\test)。

pytest 5.1.1 (2019-08-20)

Bug 修正

  • #5751: 修正 Python 3.5.0 和 3.5.1 上匯入 pytest 時的 TypeError

pytest 5.1.0 (2019-08-15)

移除

  • #5180: 根據我們的政策,以下功能已在 4.X 系列中棄用,現在已移除

    • Request.getfuncargvalue:請改用 Request.getfixturevalue

    • pytest.raisespytest.warns 不再支援將字串作為第二個引數。

    • pytest.raisesmessage 參數。

    • pytest.raisespytest.warnsParameterSet.param 現在使用原生僅限關鍵字語法。這可能會更改先前版本的例外訊息,但它們仍然會像以前一樣針對未知的關鍵字引數引發 TypeError

    • pytest.config 全域變數。

    • tmpdir_factory.ensuretemp 方法。

    • pytest_logwarning hook。

    • RemovedInPytest4Warning 警告類型。

    • request 現在是 fixtures 的保留名稱。

    如需更多資訊,請參閱文件中的 棄用和移除

  • #5565:移除對 unittest2 未使用的支援程式碼。

    由於 Python 3.3+ 以後已不再需要 unittest2 回溯移植模組,且 pytest 中支援它的少量程式碼似乎也未使用:移除後,所有測試仍然通過且未更改。

    雖然我們的政策是在移除任何功能或第三方函式庫的支援之前,先引入棄用期,但由於此程式碼顯然完全未使用(即使 unittest2 被 pytest 執行的測試套件使用),因此決定在此版本中將其移除。

    如果您因此而遇到回歸問題,請提交 issue

  • #5615pytest.failpytest.xfailpytest.skip 不再支援訊息引數使用 bytes。

    Python 2 支援此功能,因為在 Python 2 中很容易使用 "message" 而不是 u"message"

    Python 3 程式碼不太可能將 bytes 傳遞給這些函式。如果您這樣做,請事先將其解碼為 str

功能

  • #5564:新的 Config.invocation_args 屬性,包含傳遞給 pytest.main() 的未更改引數。

  • #5576:新的 NUMBER 選項,用於 doctest 以忽略浮點數中不相關的差異。靈感來自 Sébastien Boisgérault 的 numtest doctest 擴充套件。

改進

  • #5471:JUnit XML 現在在 testsuite 標籤中包含時間戳記和主機名稱。

  • #5707:執行測試套件所花費的時間現在包含人類可讀的表示形式,當時間超過 60 秒時,例如

    ===== 2 failed in 102.70s (0:01:42) =====
    

錯誤修正

  • #4344:修正嘗試收集僅包含「__init__.py」的套件時發生的 RuntimeError/StopIteration 錯誤。

  • #5115:在 pytest_configure 期間發出的警告明確地不被視為錯誤,即使已配置為錯誤,因為否則會完全破壞 pytest。

  • #5477--junitxml 產生的 XML 檔案現在正確地包含 <testsuites> 根元素。

  • #5524:修正 tmp_pathtmpdir 無法移除包含標記為唯讀檔案的目錄的問題,這可能導致使用 --basetemp 選項第二次執行 pytest 時崩潰。

  • #5537:將 importlib_metadata 回溯移植替換為 Python 3.8+ 標準函式庫中的 importlib.metadata

  • #5578:改進某些引發例外函式(pytest.xfailpytest.skip 等)的類型檢查,以便在使用者打算使用標記時提供更好的錯誤訊息(例如 @pytest.xfail 而不是 @pytest.mark.xfail)。

  • #5606:修正當測試函式使用無法與其他物件進行真值比較的物件(例如 numpy 陣列)進行修補時發生的內部錯誤。

  • #5634pytest.exit 現在在 unittest 案例中得到正確處理。這使得 unittest 案例可以正確處理來自 pytest pdb 的 quit

  • #5650:改進剖析 ini 設定檔失敗時的輸出。

  • #5701:修正使用 functools.partial 定義的 staticmethod 物件的收集。

  • #5734:略過非同步產生器測試函式,並更新警告訊息以參考 async def 函式。

改進的文件

  • #5669:為 Testdir.copy_example 新增 docstring。

瑣碎/內部變更

  • #5095xunit2 系列的 XML 檔案現在已透過 pytest 自身的測試套件針對 schema 進行驗證,以避免未來發生回歸。

  • #5516:快取節點分割函式,可以提高非常大型測試套件中的收集效能。

  • #5603:簡化內部 SafeRepr 類別並移除一些無效程式碼。

  • #5664:當使用 PYTHONDONTWRITEBYTECODE=1 呼叫 pytest 自身的測試套件時,test_xfail_handling 測試不再失敗。

  • #5684:將程式碼庫中 OSError.errno 的手動處理替換為新的 OSError 子類別(PermissionErrorFileNotFoundError 等)。

pytest 5.0.1 (2019-07-04)

錯誤修正

  • #5479:改進 raises 比對失敗訊息中的引號。

  • #5523:修正在 Python 3.8+ 中於命令列一起使用多個簡短選項(例如 -vs)。

  • #5547--step-wise 現在可以正確處理 xfail(strict=True) 標記。

改進的文件

  • #5517:改進「宣告新的 hook」章節「撰寫外掛程式」中的內容

pytest 5.0.0 (2019-06-28)

重要

此版本僅支援 Python 3.5+。

如需更多詳細資訊,請參閱我們的 Python 2.7 和 3.4 支援計畫

移除

  • #1149:Pytest 不再接受命令列引數的前綴,例如輸入 pytest --doctest-mod 來代替 --doctest-modules。先前在 ArgumentParser 認為沒有歧義的情況下允許這樣做,但由於外掛程式選項的延遲剖析,這可能是不正確的。例如,請參閱 issue #1149#3413#4009

  • #5402PytestDeprecationWarning 現在預設為錯誤。

    為了實現我們盡可能減少中斷地移除已棄用功能的計畫,所有 PytestDeprecationWarning 類型的警告現在都會產生錯誤,而不是警告訊息。

    受影響的功能將在 pytest 5.1 中有效移除,因此請查閱文件中的 棄用與移除 章節,以取得有關如何更新現有程式碼的指示。

    在 pytest 5.0.X 系列中,可以透過將以下內容新增至您的 pytest.ini 檔案,將錯誤改回警告,作為權宜之計

    [pytest]
    filterwarnings =
        ignore::pytest.PytestDeprecationWarning
    

    但是當 pytest 5.1 發佈時,這將停止運作。

    如果您對特定功能的移除有疑慮,請在 #5402 中新增評論。

  • #5412ExceptionInfo 物件(由 pytest.raises 傳回)現在具有與 repr 相同的 str 表示形式,這避免了使用者使用 print(e) 檢查物件時的一些混淆。

    這表示像這樣的程式碼

    with pytest.raises(SomeException) as e:
        ...
    assert "some message" in str(e)
    

    需要變更為

    with pytest.raises(SomeException) as e:
        ...
    assert "some message" in str(e.value)
    

棄用

  • #4488--result-log 選項和模組的移除已延遲至(暫定)pytest 6.0,因為團隊尚未著手實作一個好的替代方案。

  • #466funcargnames 屬性自 pytest 2.3 以來一直是 fixturenames 的別名,現在也在程式碼中被棄用。

功能

  • #3457:新的 pytest_assertion_pass hook,在 assertion *通過* 時使用上下文資訊呼叫。

    此 hook 仍然是實驗性的,因此請謹慎使用。

  • #5440:現在預設啟用 faulthandler 標準函式庫模組,以協助使用者診斷 C 模組中的崩潰問題。

    此功能是透過將外部 pytest-faulthandler 外掛程式整合到核心中來提供的,因此使用者如果使用該外掛程式,應從其需求中移除它。

    如需更多資訊,請參閱文件:Fault Handler

  • #5452:當警告配置為錯誤時,pytest 警告現在顯示為源自 pytest. 而不是內部 _pytest.warning_types. 模組。

  • #5125Session.exitcode 值現在在 pytest.ExitCode(一個 IntEnum)中編碼。這使得消費者程式碼可以使用退出代碼,並且比僅僅是文件更明確。使用者定義的退出代碼仍然有效,但應謹慎使用。

    團隊不希望此變更會破壞一般的測試套件或外掛程式,除非在深奧/特定的情況下。

    pytest-xdist 使用者應升級到 1.29.0 或更高版本,因為 pytest-xdist 由於此變更而需要相容性修正。

錯誤修正

  • #1403:從 imp 切換到 importlib

  • #1671:assertion writer 快取的 .pyc 檔案名稱現在包含 pytest 版本,以避免過時的快取。

  • #2761:在不區分大小寫的檔案系統上,遵守 PEP 235

  • #5078:使用 --pyargs 時,不再重複匯入測試模組。

  • #5260:改進位元組字串的比較。

    當比較位元組時,assertion 訊息過去在顯示差異時會顯示位元組數值

        def test():
    >       assert b'spam' == b'eggs'
    E       AssertionError: assert b'spam' == b'eggs'
    E         At index 0 diff: 115 != 101
    E         Use -v to get the full diff
    

    現在它顯示實際的 ascii 表示法,這通常更有用

        def test():
    >       assert b'spam' == b'eggs'
    E       AssertionError: assert b'spam' == b'eggs'
    E         At index 0 diff: b's' != b'e'
    E         Use -v to get the full diff
    
  • #5335:當記錄格式中的層級使用 '%(levelname).Xs'(截斷的固定寬度對齊)格式化時,為層級名稱著色,其中 X 為整數。

  • #5354:修正當 argvalues 是迭代器時的 pytest.mark.parametrize

  • #5370:還原 all() 的展開,以修正在巢狀推導式上的 NameError

  • #5371:還原 all() 的展開,以修正使用 if 的產生器的不正確處理。

  • #5372:還原 all() 的展開,以修正當在運算式中使用 all() 時的不正確 assertion。

  • #5383:當使用 --log-cli-level 時,-q 再次對收集項目的樣式(--collect-only)產生影響。

  • #5389:修正 #5063 對於 importlib_metadata.PathDistribution 的回歸問題,這些回歸問題的 files 屬性為 None

  • #5390:修正 TestCase 項目的 obj 屬性不再繫結到方法的 regression。

  • #5404:當嘗試解包損壞的物件引發例外時,發出警告,以便於除錯 (#5080)。

  • #5432:防止在多次於程序內調用 pytest 時,assertion rewriter 出現「已經匯入」警告。

  • #5433:修正在套件(__init__.py)中的 assertion rewriting。

  • #5444:修正在命令列上傳遞的第一個檔案收集失敗時的 --stepwise 模式。

  • #5482:修復 4.6.0 中引入的錯誤,該錯誤導致在將超過 2 個位置引數傳遞給 pytest.mark.parametrize 時發生收集錯誤。

  • #5505:修正在使用 -p no:terminal 時,當探索失敗時發生的崩潰。

改進的文件

  • #5315:擴充關於使用 monkeypatch 模擬類別和字典的文件。

  • #5416:修復 run/skip 範例中的 PytestUnknownMarkWarning。

pytest 4.6.11 (2020-06-04)

錯誤修正

  • #6334: 修正當在 -r 命令列選項中同時使用 f/Fs/S 報告字元時 (例如 -rFf) 摘要條目出現兩次的問題。

    大寫變體從未記錄在文件中,首選形式應為小寫。

  • #7310:修復當外掛程式以非常規狀態傳回 report 物件時,在 _pytest.terminal.pytest_report_teststatus() 中發生的 UnboundLocalError: local variable 'letter' referenced before assignment

    這使得 pytest_report_teststatus() 略過宣告 letter 變數的 if-block 分支。

    修復方法是在 if-block 級聯之前設定 letter 的初始值,以便它始終具有值。

pytest 4.6.10 (2020-05-08)

功能

  • #6870:新的 Config.invocation_args 屬性,包含傳遞給 pytest.main() 的未更改引數。

    備註:雖然這在技術上是一項新功能,並且根據我們的政策,它不應該被回溯移植,但我們在這個特定案例中開啟了一個例外,因為它修復了與 pytest-xdist 的嚴重互動問題,因此它也可以被視為錯誤修正。

瑣碎/內部變更

  • #6404: 移除在 Python 3.9 中已棄用的 parser 模組的使用。

pytest 4.6.9 (2020-01-04)

錯誤修正

  • #6301: 修正基於 egg 的發行版和 editable 安裝(pip install --editable)的斷言重寫。

pytest 4.6.8 (2019-12-19)

功能

  • #5471:JUnit XML 現在在 testsuite 標籤中包含時間戳記和主機名稱。

錯誤修正

  • #5430: junitxml:若測試在呼叫階段失敗,失敗測試的日誌現在會傳遞到 junit 報告中。

瑣碎/內部變更

  • #6345:將 colorama 釘選到僅適用於 Python 3.4 的 0.4.1,以便較新的 Python 版本仍然可以接收 colorama 更新。

pytest 4.6.7 (2019-12-05)

錯誤修正

  • #5477--junitxml 產生的 XML 檔案現在正確地包含 <testsuites> 根元素。

  • #6044:在嘗試移除舊的臨時目錄時,正確地忽略 FileNotFoundError (OSError.errno == NOENT 在 Python 2 中) 例外,例如當多個程序嘗試移除同一個目錄時(例如常見於 pytest-xdist)。

pytest 4.6.6 (2019-10-11)

錯誤修正

  • #5523:修正在 Python 3.8+ 中於命令列一起使用多個簡短選項(例如 -vs)。

  • #5537:將 importlib_metadata 回溯移植替換為 Python 3.8+ 標準函式庫中的 importlib.metadata

  • #5806: 修正從 --pastebin 上傳到 bpaste.net 時使用的 “lexer” 為 “text”。

  • #5902: 修正 attrs>=19.2 中關於已棄用 cmp 屬性的警告。

瑣碎/內部變更

  • #5801:修正 Python 版本檢查(由 flake8-2020 偵測到),以防 python4 成為現實。

pytest 4.6.5 (2019-08-05)

錯誤修正

  • #4344:修正嘗試收集僅包含「__init__.py」的套件時發生的 RuntimeError/StopIteration 錯誤。

  • #5478:修復在使用 pytest.raises 的例外中使用 unicode 字串時發生的編碼錯誤。

  • #5524:修正 tmp_pathtmpdir 無法移除包含標記為唯讀檔案的目錄的問題,這可能導致使用 --basetemp 選項第二次執行 pytest 時崩潰。

  • #5547--step-wise 現在可以正確處理 xfail(strict=True) 標記。

  • #5650:改進剖析 ini 設定檔失敗時的輸出。

pytest 4.6.4 (2019-06-28)

錯誤修正

  • #5404:當嘗試解包損壞的物件引發例外時,發出警告,以便於除錯 (#5080)。

  • #5444:修正在命令列上傳遞的第一個檔案收集失敗時的 --stepwise 模式。

  • #5482:修復 4.6.0 中引入的錯誤,該錯誤導致在將超過 2 個位置引數傳遞給 pytest.mark.parametrize 時發生收集錯誤。

  • #5505:修正在使用 -p no:terminal 時,當探索失敗時發生的崩潰。

pytest 4.6.3 (2019-06-11)

錯誤修正

  • #5383:當使用 --log-cli-level 時,-q 再次對收集項目的樣式(--collect-only)產生影響。

  • #5389:修正 #5063 對於 importlib_metadata.PathDistribution 的回歸問題,這些回歸問題的 files 屬性為 None

  • #5390:修正 TestCase 項目的 obj 屬性不再繫結到方法的 regression。

pytest 4.6.2 (2019-06-03)

錯誤修正

  • #5370:還原 all() 的展開,以修正在巢狀推導式上的 NameError

  • #5371:還原 all() 的展開,以修正使用 if 的產生器的不正確處理。

  • #5372:還原 all() 的展開,以修正當在運算式中使用 all() 時的不正確 assertion。

pytest 4.6.1 (2019-06-02)

錯誤修正

  • #5354:修正當 argvalues 是迭代器時的 pytest.mark.parametrize

  • #5358:修復 all() 呼叫的 assertion rewriting,以處理非產生器。

pytest 4.6.0 (2019-05-31)

重要

4.6.X 系列將是最後一個支援 Python 2 和 Python 3.4 的系列。

如需更多詳細資訊,請參閱我們的 Python 2.7 和 3.4 支援計畫

功能

  • #4559:新增 junit_log_passing_tests ini 值,可用於啟用或停用在 Junit XML 檔案中記錄通過測試的輸出。

  • #4956:pytester 的 testdir.spawn 使用 tmpdir 作為 HOME/USERPROFILE 目錄。

  • #5062:展開對 all 的呼叫,以使用 assertion rewriting 進行完整的 for 迴圈,以獲得更好的失敗訊息,尤其是在使用產生器運算式時。

  • #5063:從 pkg_resources 切換到 importlib-metadata 進行 entrypoint 偵測,以提高效能和匯入時間。

  • #5091--help 中 ini 選項的輸出已得到改進。

  • #5269pytest.importorskip 現在在預設 reason 中包含 ImportError

  • #5311:為每個失敗的測試輸出的捕獲記錄使用 ColoredLevelFormatter 進行格式化。

  • #5312:改進 Python 3 中多行記錄訊息的格式化。

錯誤修正

  • #2064:偵錯外掛程式現在會按需匯入包裝的 Pdb 類別 (--pdbcls)。

  • #4908:使用事後驗屍 (--pdb) 呼叫 pytest_enter_pdb hook。

  • #5036:修復依賴於其他參數化 fixtures 的 fixtures 會被錯誤地參數化的問題。

  • #5256:處理由於 Jython 中無法表示的單獨 surrogate unicode 字元而引起的內部錯誤。

  • #5257:確保 sys.stdout.mode 不包含 'b',因為它是文字串流。

  • #5278:pytest 的內部 python 外掛程式可以再次使用 -p no:python 停用。

  • #5286:修復當在參數化測試中使用測試 ID 列表時,disable_test_id_escaping_and_forfeit_all_rights_to_community_support 選項無法運作的問題。

  • #5330:在為具有 __init____new__ 方法的測試類別發出 PytestCollectionWarning 訊息時,顯示正在收集的測試模組,以便更容易找出問題。

  • #5333:修復 4.5.0 中 --lf 未重新執行來自未選取測試的已知失敗的所有測試的 regression。

改進的文件

  • #5250: 擴充關於搭配 monkeypatch 使用 setenvdelenv 的文件。

pytest 4.5.0 (2019-05-11)

功能

  • #4826: 現在當未知標記被用作裝飾器時,會發出警告。這通常是由於筆誤,可能導致測試在無聲無息中崩潰。

  • #4907: 在 JUnitXML 訊息欄位中顯示 XFail 原因。

  • #5013: 來自崩潰報告的訊息現在顯示在測試摘要中,並截斷至終端機寬度。

  • #5023: 新增旗標 --strict-markers,當在測試套件中使用未知標記(例如,那些未使用設定檔中的 markers 選項註冊的標記)時,會觸發錯誤。

    現有的 --strict 選項目前具有相同的行為,但未來可能會擴充以進行額外檢查。

  • #5026: 序列和字典的斷言失敗訊息現在包含不同項目的數量。

  • #5034: 改善使用 --lf--ff (run-last-failure) 的報告。

  • #5035: --cache-show 選項/動作接受可選的 glob,以僅顯示匹配的快取條目。

  • #5059: 標準輸入 (stdin) 可以提供給 pytester 的 Testdir.run()Testdir.popen()

  • #5068: -r 選項學習了關於 A 以在簡短測試摘要中顯示所有報告(包括通過的報告)。

  • #5108: 簡短測試摘要在帶有輸出的通過測試後顯示 (-rP)。

  • #5172: --last-failed (--lf) 選項變得更聰明,如果該測試檔案的所有測試在先前的執行中都已通過,現在將跳過整個檔案,大大加快了收集速度。

  • #5177: 引入新的特定警告 PytestWarning 子類別,以更輕鬆地根據類別而不是訊息來過濾警告。新的子類別是

    • PytestAssertRewriteWarning

    • PytestCacheWarning

    • PytestCollectionWarning

    • PytestConfigWarning

    • PytestUnhandledCoroutineWarning

    • PytestUnknownMarkWarning

  • #5202: 新的 record_testsuite_property 會話範圍 fixture 允許使用者使用 junitxml 外掛程式在 testsuite 層級記錄 <property> 標籤。

    record_propertyrecord_xml_attribute 記錄的屬性相反,生成的 XML 與最新的 xunit 標準相容。

  • #5214: 預設的日誌格式已更改以提高可讀性。以下是先前日誌訊息的範例

    test_log_cli_enabled_disabled.py    3 CRITICAL critical message logged by test
    

    現在已變為

    CRITICAL root:test_log_cli_enabled_disabled.py:3 critical message logged by test
    

    格式化可以通過 log_format 設定選項進行更改。

  • #5220: --fixtures 現在也顯示 "function" 以外範圍的 fixture 範圍。

錯誤修正

  • #5113: 現在可以正確報告使用 pytest_collect_modifyitems 作為 hookwrapper 的外掛程式中取消選擇的項目。

  • #5144: 對於用法錯誤,exitstatuspytest_sessionfinish hook 中按預期設定為 EXIT_USAGEERROR

  • #5235: outcome.exit 不再與 pdb wrapper 中的 EOF 一起使用,而是僅與 quit 一起使用。

文件改進

  • #4935: 擴充關於註冊標記和 --strict 效果的文件。

細微/內部變更

  • #4942: logging.raiseExceptions 不再設定為 False

  • #5013: pytest 現在依賴 wcwidth 以正確追蹤 Unicode 字元大小,從而實現更精確的終端機輸出。

  • #5059: pytester 的 Testdir.popen() 現在通過帶有預設值的關鍵字引數(subprocess.PIPE)使用 stdoutstderr

  • #5069: 終端機中簡短測試摘要的程式碼已移至終端機外掛程式。

  • #5082: 改善了 pytester 外掛程式中各種方法的 kwargs 的驗證。

  • #5202: 當與 junit_family=xunit2 一起使用時,record_property 現在發出 PytestWarning:fixture 生成作為 testcase 子項的 property 標籤,根據最新的 最新架構,這是被禁止的。

  • #5239: 將 pluggy 固定到 < 1.0,以便我們不會在發佈時自動更新到 1.0:計劃進行破壞性變更,我們希望確保 pytest 正確支援 pluggy 1.0

pytest 4.4.2 (2019-05-08)

錯誤修正

  • #5089: 修正在啟用 showlocals 和詳細輸出時,由 __repr__ 函數中的錯誤引起的崩潰。

  • #5139: 消除對 'terminal' 外掛程式的核心依賴。

  • #5229: 需要 pluggy>=0.11.0,這會將依賴關係還原為 0.10.0 中新增的 importlib-metadataimportlib-metadata 套件在作為 egg 安裝時無法導入,並且在依賴 setup.py 安裝測試依賴項時會導致問題。

文件改進

  • #5171: 文件:pytest_ignore_collectpytest_collect_directorypytest_collect_filepytest_pycollect_makemodule hooks 的 'path' 參數文件類型現在為 py.path.local

  • #5188: 改善 --runxfail 旗標的說明。

細微/內部變更

  • #5182: 移除內部和未使用的 _pytest.deprecated.MARK_INFO_ATTRIBUTE

pytest 4.4.1 (2019-04-15)

錯誤修正

  • #5031: 使用 pytester 的 testdir fixture 時,環境變數會正確還原。

  • #5039: 修復 --pdbcls 的回歸問題,它在 4.0.0 版本中停止與本機模組一起工作。

  • #5092: 當未知關鍵字傳遞給 pytest.param(...) 時,產生警告。

  • #5098: 使用 monkeypatch.syspath_prepend 使導入快取失效,這是使用命名空間套件時所必需的。

pytest 4.4.0 (2019-03-29)

功能

  • #2224: 當未安裝合適的 async 外掛程式(例如 pytest-asynciopytest-trio)時,async 測試函數會被跳過並發出警告。

    先前,async 函數根本不會執行,但仍會標記為「通過」。

  • #2482: 包含新的 disable_test_id_escaping_and_forfeit_all_rights_to_community_support 選項,以停用參數化值中的 ascii 逸出。這可能會導致一系列問題,並且正如名稱所示,使用風險自負。

  • #4718: -p 選項現在也可以用於通過條目點名稱而不是僅通過模組名稱來提前載入外掛程式。

    這使得可以在命令列中提前載入外部外掛程式,例如 pytest-cov

    pytest -p pytest_cov
    
  • #4855: --pdbcls 選項現在通過模組屬性處理類別(例如,帶有 pdbpppdb:pdb.Pdb),並且其驗證已得到改進。

  • #4875: 如果 testpaths 設定選項生效,即目錄或檔案名稱未在命令列中明確傳遞,則該選項現在顯示在 pytest 標頭中的 rootdirinifile 行旁邊。

    此外,只有在存在設定檔時才會顯示 inifile,而不是空的 inifile: 字串。

  • #4911: 現在可以使用 pytest.skip() 動態跳過 doctest。

  • #4920: 為了使 pytest-subtests 外掛程式的實作成為可能,已經進行了內部重構,該外掛程式添加了 unittest 子測試支援和新的 subtests fixture,如 #1367 中所討論的。

    有關內部重構的詳細資訊,請參閱相關 PR 的詳細資訊。

  • #4931: pytester 的 LineMatcher 斷言傳遞的行是一個序列。

  • #4936: 處理 -p plug-p no:plug 之後的情況。

    這可以用於從命令列等覆蓋已阻止的外掛程式(例如,在 “addopts” 中)。

  • #4951: 當僅通過帶有 pdb.set_trace() 的 fixture (capsys, capfs) 捕獲時,輸出捕獲會被正確處理。

  • #4956: pytester 在測試執行期間將 $HOME$USERPROFILE 設定為臨時目錄。

    這確保不從真實使用者的主目錄載入設定檔。

  • #4980: 命名空間套件通過 monkeypatch.syspath_prependtestdir.syspathinsert(通過 pkg_resources.fixup_namespace_packages)更好地處理。

  • #4993: stepwise 外掛程式現在報告狀態資訊。

  • #5008: 如果 setup.cfg 檔案包含 [tool:pytest] 以及不再支援的 [pytest] 區段,pytest 將使用 [tool:pytest] 並忽略 [pytest]。先前,它會無條件地產生錯誤。

    這使得外掛程式更容易支援舊版本的 pytest。

錯誤修正

  • #1895: 修復了通過 request.getfixturevalue() 動態請求的 fixture 可能在請求 fixture 之前被拆解的錯誤。

  • #4851: pytester 現在取消設定 PYTEST_ADDOPTS,以便不將外部選項與 testdir.runpytest() 一起使用。

  • #4903: 在重寫的 .pyc 檔案中使用 2038 年之後年份的正確修改時間。

  • #4928: 修復 ScopeMismatch 錯誤的行偏移。

  • #4957: -p no:plugin 現在針對預設(內部)外掛程式正確處理,例如 -p no:capture

    先前,它們總是載入(導入),例如使 capfd fixture 可用。

  • #4968: 當在帶有 pdbppdebug 命令後使用 pdb quit 命令時,會正確處理。

  • #4975: 修復了 -qq 選項的解釋,其中它被視為 -v

  • #4978: outcomes.Exit 不再在 assertrepr_compare 中被吞噬。

  • #4988: 在會話結束時顯式關閉日誌記錄的檔案處理程序。

  • #5003: 修復標記收集錯誤的行偏移(偏移一)。

文件改進

  • #4974: 更新 pytest_cmdline_parse hook 的文件,以註明可用性限制

細微/內部變更

  • #4718: 現在需要 pluggy>=0.9

  • #4815: Python 2.7 現在需要 funcsigs>=1.0

  • #4829: 移除了一些與 yield 測試相關的遺留內部程式碼。

  • #4890: 從 pytester 外掛程式中移除內部未使用的 anypython fixture。

  • #4912: 移除已棄用的 Sphinx 指令 add_description_unit(),將 sphinx-removed-in 固定到 >= 0.2.0 以支援 Sphinx 2.0。

  • #4913: 修復使用自訂 PYTHONPATH 調用 pytest 測試。

  • #4965: 新的 pytest_report_to_serializablepytest_report_from_serializable **實驗性** hooks。

    這些 hooks 將被 pytest-xdistpytest-subtests 和 resultlog 的替代品用於序列化和自訂報告。

    它們是實驗性的,這意味著它們的詳細資訊可能會在未來的修補程式版本中更改甚至完全移除,恕不另行通知。

    歡迎來自外掛程式作者和使用者的回饋。

  • #4987: Collector.repr_failure 尊重 --tb 選項,但現在僅預設為 short(帶有 auto)。

pytest 4.3.1 (2019-03-11)

錯誤修正

  • #4810: pytest_runtest_logreport() 內部的日誌訊息現在可以正確捕獲和顯示。

  • #4861: 改善寫入捕獲輸出的內容的驗證,使其行為與禁用捕獲時相同。

  • #4898: 修復 AttributeError: FixtureRequest has no 'confg' attribute 錯誤在 testdir.copy_example 中。

細微/內部變更

  • #4768: 避免在頂層導入 pkg_resources。

pytest 4.3.0 (2019-02-16)

棄用

  • #4724: 當 pytest.warns() 收到未知關鍵字引數時,現在會發出警告。

    這將在未來更改為錯誤。

功能

  • #2753: 來自 argparse 的用法錯誤被映射到 pytest 的 UsageError

  • #3711: 添加 --ignore-glob 參數以排除帶有 Unix shell 樣式萬用字元的測試模組。為 conftest.py 添加 collect_ignore_glob,以排除帶有 Unix shell 樣式萬用字元的測試模組。

  • #4698: 關於 pytest 5.0 中不再支援 Python 2.7 和 3.4 的警告已被移除。

    最終認為這更多的是一種滋擾而不是實際效用,並且這些 Python 版本的使用者不應該有問題,因為 pip 不會在這些解釋器上安裝 pytest 5.0。

  • #4707: 借助新的 set_log_path() 方法,可以從 hooks 設定 log_file 路徑。

錯誤修正

  • #4651: --help--version 通過 UsageError 處理。

  • #4782: 修復收集帶有套件的損壞符號連結時的 AssertionError

pytest 4.2.1 (2019-02-12)

錯誤修正

  • #2895: pytest_report_collectionfinish hook 現在也使用 --collect-only 調用。

  • #3899: 當導入的套件具有 pytest_plugins.py 子模組時,不要引發 UsageError

  • #4347: 修復在使用帶有遞歸調試的 pdb++ 時的輸出捕獲。

  • #4592: 修復通過父 conftest.py 處理 collect_ignore

  • #4700: 修復子類別中的 setUpClass 總是會被調用的回歸問題,即使所有測試都被應用於子類別的 unittest.skip() 裝飾器跳過。

  • #4739: 修復當函數返回非字串時的 parametrize(... ids=<function>)

  • #4745: 修復/改善在傳入 __init__.py 和測試檔案時的引數收集。

  • #4770: 當需要與 Python 2.7 相容時,more_itertools 現在被限制為 <6.0.0。

  • #526: 修復在符號連結到實際來源的建置目錄中執行時的「ValueError: Plugin already registered」例外。

文件改進

  • #3899: 在 plugins.rst 中添加註釋,說明 pytest_plugins 不應被用作包含外掛程式的使用者模組的名稱。

  • #4324: 文件說明如何使用 raisesdoes_not_raise 編寫帶有條件引發的參數化測試。

  • #4709: 文件說明在使用 pytest.warns 時如何自訂測試失敗訊息。

細微/內部變更

  • #4741: TerminalReporter 外掛程式的一些詳細程度相關屬性現在是唯讀屬性。

pytest 4.2.0 (2019-01-30)

功能

  • #3094: 經典 xunit 樣式 函數和方法現在遵循 autouse fixtures 的範圍。

    這修復了一些令人驚訝的問題,例如在會話範圍的 autouse fixtures 之前調用 setup_method(有關範例,請參見 #517)。

  • #4627: 當在 Python 2.7 和 3.4 下執行時,在測試會話結束時顯示一條訊息,說明 pytest 5.0 將不再支援這些 Python 版本。

  • #4660: 當使用 -k-m 旗標時,現在也會顯示 *選定的* 測試數量。

  • #4688: pytest_report_teststatus hook 現在也可以接收 config 參數。

  • #4691: pytest_terminal_summary hook 現在也可以接收 config 參數。

錯誤修正

  • #3547: --junitxml 可以發出與 Jenkins xUnit 相容的 XML。junit_family INI 選項接受 legacy|xunit1,它產生舊樣式輸出,以及 xunit2,它更嚴格地符合 https://github.com/jenkinsci/xunit-plugin/blob/xunit-2.3.2/src/main/resources/org/jenkinsci/plugins/xunit/types/model/xsd/junit-10.xsd

  • #4280: 改善從 pdb 退出,特別是使用 --trace

    pdb.set_trace() 之後使用 q[quit] 也會退出 pytest。

  • #4402: 警告摘要現在按訊息而不是按測試 ID 分組警告。

    這使得輸出更緊湊,並且更好地傳達了實際生成警告的程式碼量的一般概念,而不是調用該程式碼的測試數量。

  • #4536: monkeypatch.delattr 處理類別描述器,例如 staticmethod/classmethod

  • #4649: 還原將標記視為關鍵字表達式的關鍵字。

  • #4653: tmp_path 夾具和其他相關夾具提供已解析路徑 (又名真實路徑)

  • #4667: pytest_terminal_summary 使用來自 pytest_report_teststatus hook 的結果,而不是硬編碼的字串。

  • #4669: 正確處理在 Python 2 上包含非 ASCII 字元的 unittest.SkipTest 例外。

  • #4680: 確保 tmpdirtmp_path 夾具是相同的資料夾。

  • #4681: 確保 tmp_path 始終是真實路徑。

瑣碎/內部變更

  • #4643: 在 pytest.approx 中使用 a.item() 而不是已棄用的 np.asscalar(a)

    np.asscalarnumpy 1.16. 中已被 棄用

  • #4657: 從 pylib 複製 saferepr

  • #4668: teststatus 報告中預期失敗的詳細文字從 xfail 變更為 XFAIL,以與其他測試結果保持一致。

pytest 4.1.1 (2019-01-12)

錯誤修正

  • #2256: 使用 assert a==b-vv 顯示完整 repr。

  • #3456: 擴展 Doctest 模組以忽略 mock 物件。

  • #4617: 修復當 context manager 被重複使用時 (例如多個參數化) pytest.warns 的錯誤。

  • #4631: 當 __getattr__ 損壞時,不要重寫斷言

改進文件

  • #3375: 記錄使用 setup.cfg 可能會導致其他工具崩潰或難以追蹤問題,因為它使用的剖析器與 pytest.initox.ini 檔案不同。

瑣碎/內部變更

  • #4602: 在 regen tox 環境中解除安裝 hypothesis

pytest 4.1.0 (2019-01-05)

移除

  • #2169: pytest.mark.parametrize: 在先前的版本中,id 函數引發的錯誤會被抑制並變更為警告。現在例外情況會被傳播,並帶有一個 pytest 訊息,告知例外情況發生的節點、參數值和索引。

  • #3078: 移除舊版內部警告系統: config.warnNode.warnpytest_logwarning 現在在實作時會發出警告。

    請參閱我們的 文件,以取得有關如何更新程式碼的資訊。

  • #3079: 移除對 yield 測試的支援 - 它們從根本上損壞了,因為它們不正確地支援夾具,因為集合和測試執行已分離。

    請參閱我們的 文件,以取得有關如何更新程式碼的資訊。

  • #3082: 移除直接將標記應用於 @pytest.mark.parametrize 中值的支援。請改用 pytest.param

    請參閱我們的 文件,以取得有關如何更新程式碼的資訊。

  • #3083: 移除 Metafunc.addcall。這是 @pytest.mark.parametrize 的前身機制。

    請參閱我們的 文件,以取得有關如何更新程式碼的資訊。

  • #3085: 移除將字串傳遞至 pytest.main 的支援。現在,請始終傳遞字串列表。

    請參閱我們的 文件,以取得有關如何更新程式碼的資訊。

  • #3086: 不再支援 setup.cfg 檔案中的 [pytest] 區段,請改用 [tool:pytest]setup.cfg 檔案旨在與 distutils 搭配使用,而名為 pytest 的區段一直是衝突和錯誤的根源。

    請注意,對於 pytest.initox.ini 檔案,區段仍然是 [pytest]

  • #3616: 移除 node.Class/Function/Module 的已棄用相容性屬性 - 現在請使用 pytest.Class/Function/Module

    請參閱我們的 文件,以取得有關如何更新程式碼的資訊。

  • #4421: 移除 pytest_namespace hook 的實作。

    請參閱我們的 文件,以取得有關如何更新程式碼的資訊。

  • #4489: 移除 request.cached_setup。這是現代夾具的前身機制。

    請參閱我們的 文件,以取得有關如何更新程式碼的資訊。

  • #4535: 移除已棄用的 PyCollector.makeitem 方法。此方法在很久以前被錯誤地公開。

  • #4543: 移除使用 pytest_funcarg__ 前綴定義夾具的支援。請改用 @pytest.fixture 裝飾器。

    請參閱我們的 文件,以取得有關如何更新程式碼的資訊。

  • #4545: 直接呼叫夾具現在始終是錯誤,而不是警告。

    請參閱我們的 文件,以取得有關如何更新程式碼的資訊。

  • #4546: 移除 Node.get_marker(name),傳回值無法用於存在性檢查以外的用途。

    請使用 Node.get_closest_marker(name) 作為替代方案。

  • #4547: 已移除已棄用的 record_xml_property 夾具,請改用更通用的 record_property

    請參閱我們的 文件 以取得更多資訊。

  • #4548: 如果在非頂層 conftest.py 檔案 (即,不位於 rootdir 中) 中定義了 pytest_plugins 變數,則現在會引發錯誤。

    請參閱我們的 文件 以取得更多資訊。

  • #891: 移除 testfunction.markername 屬性 - 請使用 Node.iter_markers(name=None) 來迭代它們。

棄用

  • #3050: 棄用 pytest.config 全域變數。

    請參閱 pytest.config 全域變數 以了解原因。

  • #3974: 傳遞 pytest.raisesmessage 參數現在會發出 DeprecationWarning

    一個常見的錯誤是認為此參數將比對例外訊息,但實際上它僅用於在 pytest.raises 檢查失敗時提供自訂訊息。為了避免此錯誤,並且由於認為它很少使用,pytest 正在棄用它,目前不提供替代方案。

    如果您對此有疑慮,請在 #3974 上評論。

  • #4435: 棄用 raises(..., 'code(as_a_string)')warns(..., 'code(as_a_string)')

    請參閱 raises / warns 與字串作為第二個參數 以了解原因和範例。

功能

  • #3191: 現在,當對 None 進行斷言時,會發出警告。

    這是新使用者之間常見的混淆來源,他們會寫

    assert mocked_object.assert_called_with(3, 4, 5, key="value")
    

    當他們應該寫

    mocked_object.assert_called_with(3, 4, 5, key="value")
    

    因為 mock 物件的 assert_called_with 方法已經執行了斷言。

    當明確檢查 None 時,不會發出此警告。像這樣的斷言

    assert variable is None
    

    將不會發出警告。

  • #3632: 對於使用 attrsdataclasses (Python 3.7+,回溯移植到 3.6) 建立的物件,在 AssertionError 上進行更豐富的相等比較內省。

  • #4278: CACHEDIR.TAG 檔案現在在快取目錄內建立。

    這些檔案是 快取目錄標記標準 的一部分,並且可以被備份或同步程式使用,以將 pytest 的快取目錄識別為此類目錄。

  • #4292: pytest.outcomes.Exit 衍生自 SystemExit 而不是 KeyboardInterrupt。這使我們能夠更好地處理 pdb 退出。

  • #4371: 更新 --collect-only 選項,以在使用 --verbose 執行時顯示測試描述。

  • #4386: 重新架構 ExceptionInfo 物件建構,並確保不完整的實例具有 repr/str

  • #4416: pdb: 新增對 pdb.set_trace 使用關鍵字引數的支援。

    它處理類似於 Python 3.7 的 header,並將任何其他關鍵字引數轉發到 Pdb 建構函式。

    這允許 __import__("pdb").set_trace(skip=["foo.*"])

  • #4483: 新增 ini 參數 junit_duration_report 以選擇性地報告測試呼叫持續時間,排除 setup 和 teardown 時間。

    JUnit XML 規範和預設 pytest 行為是在測試持續時間報告中包含 setup 和 teardown 時間。您可以改為僅包含呼叫持續時間 (排除 setup 和 teardown),方法是將此新增至您的 pytest.ini 檔案

    [pytest]
    junit_duration_report = call
    
  • #4532: -ra 現在將最後顯示錯誤和失敗,而不是作為摘要中的第一個項目。

    這使得更容易獲得錯誤和失敗的列表,以選擇性地執行測試。

  • #4599: pytest.importorskip 現在支援 reason 參數,當無法匯入請求的模組時,將會顯示該參數。

錯誤修正

  • #3532: -p 現在接受其引數,值之間沒有空格,例如 -pmyplugin

  • #4327: approx 再次適用於更通用的容器,更精確地說是 IterableSized 的實例,而不是更具限制性的 Sequence

  • #4397: 確保節點 ID 是可列印的。

  • #4435: 修復 raises(..., 'code(string)') 框架檔案名稱。

  • #4458: 在 --collect-only 中顯示實際的測試 ID。

改進文件

  • #4557: 標記範例文件頁面已更新,以支援最新的 pytest 版本。

  • #4558: 更新快取文件範例,以正確顯示快取命中和未命中。

  • #4580: 改進詳細摘要報告文件。

瑣碎/內部變更

  • #4447: 將 --result-log 的棄用類型變更為 PytestDeprecationWarning

    已決定在下一個主要修訂版本中移除此功能。

pytest 4.0.2 (2018-12-13)

錯誤修正

  • #4265: 分別驗證來自 PYTEST_ADDOPTS 環境變數和 addopts ini 選項的引數。

  • #4435: 修復 raises(..., 'code(string)') 框架檔案名稱。

  • #4500: 當夾具 yield 且在測試執行後進行記錄呼叫,並且如果測試被中斷,則 capture 屬性為 None

  • #4538: 對於 with raises(..., match=<non-None falsey value>) 引發 TypeError

改進文件

  • #1495: 記錄常見的 doctest 夾具目錄樹狀結構陷阱

pytest 4.0.1 (2018-11-23)

錯誤修正

  • #3952: 再次在 “簡短測試摘要資訊” 之前顯示警告,但仍然在最後顯示後續警告。

  • #4386: 處理 repr/str 中未初始化的 exceptioninfo。

  • #4393: 不要在現有的快取目錄中建立 .gitignore/README.md 檔案。

  • #4400: 重新排列 yield 測試錯誤的警告處理,以便 4.0.x 中的 opt-out 可以正確運作。

  • #4405: 修復使用 --pyargs 的 testpaths 集合。

  • #4412: 修復涉及 Starred + 副作用的斷言重寫。

  • #4425: 確保當給定的 --basetemp 是相對路徑時,我們解析絕對路徑。

瑣碎/內部變更

  • #4315: 在 minversion 檢查中使用 pkg_resources.parse_version 而不是 LooseVersion

  • #4440: 調整一些內部 pytest 警告的堆疊層級。

pytest 4.0.0 (2018-11-13)

移除

  • #3737: RemovedInPytest4Warnings 現在預設為錯誤。

    為了遵循我們盡可能減少中斷地移除已棄用功能的計畫,所有 RemovedInPytest4Warnings 類型的警告現在都會產生錯誤,而不是警告訊息。

    受影響的功能將在 pytest 4.1 中有效地移除,因此請參閱文件中的 棄用和移除 區段,以取得有關如何更新現有程式碼的指示。

    在 pytest 4.0.X 系列中,可以透過將此新增至您的 pytest.ini 檔案,將錯誤變更回警告作為權宜之計

    [pytest]
    filterwarnings =
        ignore::pytest.RemovedInPytest4Warning
    

    但是當 pytest 4.1 發佈時,這將停止運作。

    如果您對 移除特定功能有疑慮,請在 #4348 上新增評論。

  • #4358: 移除 ::() 符號,以表示節點 ID 中的測試類別實例。

    先前,包含測試實例的節點 ID 將使用 ::() 來表示實例,如下所示

    test_foo.py::Test::()::test_bar
    

    額外的 ::() 對大多數使用者來說令人困惑,並且已被移除,因此測試 ID 現在變為

    test_foo.py::Test::test_bar
    

    此變更無法伴隨棄用期,因為當使用者面向的功能變更時通常是這樣,因為實際上不可能檢測到何時明確使用了該功能。

    額外的 ::() 可能已在內部某些地方移除,這導致在預期它的地方造成混淆,例如使用 --deselect (#4127)。

    測試類別實例也不再與 --collect-only 一起列出。

功能

  • #4270: cache_dir 選項使用 $TOX_ENV_DIR 作為前綴 (如果在環境中設定)。

    這預設為每個 tox 環境使用不同的快取。

錯誤修正

  • #3554: 修復當呼叫尚未完成時的 CallInfo.__repr__

pytest 3.10.1 (2018-11-11)

錯誤修正

  • #4287: 修復偵錯外掛程式 (pdb) 的巢狀使用,例如與 pytester 的 testdir.runpytest 一起使用。

  • #4304: 如果 cacheprovider 也被封鎖,則封鎖 stepwise 外掛程式,因為一個依賴於另一個。

  • #4306: 將 minversion 剖析為實際版本,而不是以點分隔的字串。

  • #4310: 修復由於多個引數符合相同套件而導致的重複集合。

  • #4321: 修復具有已解析符號連結的 item.nodeid

  • #4325: 修復直接符號連結檔案的集合,其中目標與 python_files 不符。

  • #4329: 修復 _collect_report_last_write 中 report_collect 的 TypeError。

瑣碎/內部變更

  • #4305: 在 test_capture 中使用 python 層級語法取代 byte/unicode 輔助程式。

pytest 3.10.0 (2018-11-03)

功能

  • #2619: 在 __import__("pdb").set_trace() 中使用 continue 後繼續捕捉輸出。

    這也新增了一個新的 pytest_leave_pdb hook,並將 pdb 傳遞到現有的 pytest_enter_pdb hook。

  • #4147: 新增 --sw--stepwise 作為 --lf -x 的替代方案,用於在第一個失敗處停止,但從該測試開始下一個測試調用。請參閱 文件 以取得更多資訊。

  • #4188: 使 --color 在未以 verbose 模式執行時發出彩色點。先前,僅當也傳遞 --verbose 時,才會對逐個測試輸出進行著色。

  • #4225: 提高在具有終端機的非安靜模式下進行集合報告的效能。

    “collecting …” 訊息僅每 0.5 秒列印/更新一次。

錯誤修正

  • #2701: 修復錯誤的 RemovedInPytest4Warning: usage of Session... is deprecated, please use pytest 警告。

  • #4046: 修復在套件 __init__.py 檔案中執行測試的問題。

  • #4260: 吞下在匿名編譯原始碼期間的警告。

  • #4262: 修復刪除 tmpdir / tmp_path 建立的陳舊目錄時的存取被拒絕錯誤。

  • #611: 將夾具命名為 request 現在會引發警告: request 夾具是內部的,不應被覆寫,因為它會導致內部錯誤。

  • #4266: 處理 (忽略) 在集合期間引發的例外,例如使用 Django 的 LazySettings proxy 類別。

改進文件

  • #4255: 新增遺失的文件,關於傳遞到篩選警告的模組名稱未進行 regex 跳脫的事實。

瑣碎/內部變更

  • #4272: 如果為非預設值,則也在非 verbose 模式下顯示 cachedir。

  • #4277: pdb: 改進關於使用 set_trace 進行輸出捕捉的訊息。

    當使用 -s 以避免混淆時,不要顯示 “IO-capturing turned off/on”。

  • #4279: 改進當環境變數的值不是 str 時,由 monkeypatch.setenv 發出的警告的訊息和堆疊層級。

pytest 3.9.3 (2018-10-27)

錯誤修正

  • #4174: 修復透過符號連結使用 conftest 外掛程式時的 “ValueError: Plugin already registered” 錯誤。

  • #4181: 處理臨時資料夾建立和刪除之間的競爭條件。

  • #4221: 修復測試會話結束時的警告摘要未顯示警告來源測試的錯誤。

  • #4243: 修復在 python2 上將警告的 stacklevel 作為位置引數傳遞時的回歸。

改進文件

  • #3851: 在 @pytest.mark.parametrize 的文件中,加入對於 empty_parameter_set_mark ini 選項的參考

瑣碎/內部變更

  • #4028: 還原 sys.breakpointhook 的修補,因為它似乎沒有作用。

  • #4233: 將 import 排序器 (reorder-python-imports) 應用於程式碼庫。

  • #4248: 移除不必要的兼容性墊片 six.binary_type 的使用

pytest 3.9.2 (2018-10-22)

錯誤修正

  • #2909: 當偵測到 fixture 之間有遞迴相依性時,改進錯誤訊息。

  • #3340: 修正在 hook pytest_sessionstart()pytest_sessionfinish() 中沒有顯示 logging 訊息的問題。

  • #3533: 修正 JUnit 報告中跳過測試的未轉義 XML 原始物件

  • #3691: Python 2: 安全地格式化關於傳遞 unicode 字串到 warnings.warn 的警告訊息,這可能會在 monkey patching warnings.warn 本身時,造成令人驚訝的 MemoryError 例外。

  • #4026: 當無法判斷函數的簽名時,改進錯誤訊息。

  • #4177: 固定 setuptools>=40.0 版本以支援 setup.cfg 中的 py_modules

  • #4179: 還原符號連結目前測試執行的 tmpdir 行為。

  • #4192: 修正在 python2 下使用 recwarn 時,warnings.warn 報告的檔案名稱錯誤。

pytest 3.9.1 (2018-10-16)

新功能

  • #4159: 對於包含測試類別的測試套件,只有在指定更高的詳細程度 (至少 “-vv”) 時,才會輸出關於子類別模組的資訊。

pytest 3.9.0 (2018-10-15 - 因為發佈自動化錯誤而未發佈)

棄用

  • #3616: 以下存取方式已記錄為棄用多年,但現在實際上會發出棄用警告。

    • 透過 Node 實例存取 Module, Function, Class, Instance, FileItem。現在使用者會看到這個警告

      usage of Function.Module is deprecated, please use pytest.Module instead
      

      使用者應該直接 import pytest,並使用 pytest 模組存取這些物件。

    • request.cached_setup,這是 fixture 可用的 setup/teardown 機制的先驅。您可以參考 文件中的 funcarg 比較章節

    • 使用名為 "Class" 的物件來客製化在 Collector 子類別中收集的節點類型已被棄用。使用者應改用 pytest_collect_make_item 以在收集期間客製化節點類型。

      這個問題應該只會影響建立新收集類型的高階外掛程式,因此如果您看到這個警告訊息,請聯絡作者,以便他們可以更改程式碼。

    • 產生以下訊息的警告已變更為 RemovedInPytest4Warning

      getfuncargvalue is deprecated, use getfixturevalue
      
  • #3988: 為 pytest.ensuretemp 加入棄用警告,因為它已被棄用一段時間了。

新功能

  • #2293: 透過隱藏可能分散注意力和吵雜的內部細節,改進使用錯誤訊息。

    這有一個副作用,就是某些先前引發通用錯誤 (例如未註冊標記的 ValueError) 的錯誤情況,現在會引發 Failed 例外。

  • #3332: 改進當 conftest.py 檔案無法匯入時顯示的錯誤。

    為了實作這個功能,在 ExceptionInfo.getrepr 中新增了一個 chain 參數,以在 Python 3 中顯示或隱藏鏈式追溯 (預設為 True)。

  • #3849: 為當 parametrize 收集到空集合時引發例外,加入 empty_parameter_set_mark=fail_at_collect ini 選項。

  • #3964: 當啟用即時記錄和/或記錄到檔案時,會顯示在收集階段產生的 Log 訊息。

  • #3985: 引入 tmp_path 作為提供 Path 物件的 fixture。同時引入 tmp_path_factory 作為 session 作用域的 fixture,用於從任何其他 fixture 或測試建立任意的暫存目錄。

  • #4013: 即使您自己客製化警告篩選器,現在也會顯示棄用警告。在先前的版本中,任何客製化都會覆寫 pytest 的篩選器,而棄用警告將會預設為隱藏。

  • #4073: 允許為 Testdir.runpytest_subprocess()Testdir.run() 指定逾時時間。

  • #4098: 在 pytest.exit() 中加入 returncode 參數,以使用特定的回傳碼結束 pytest。

  • #4102: 使用 pytest.warns 重新實作 pytest.deprecated_call,使其支援 match='...' 關鍵字引數。

    這有一個副作用,pytest.deprecated_call 現在會引發 pytest.fail.Exception 而不是 AssertionError

  • #4149: 要求 setuptools>=30.3,並將大部分的 metadata 移至 setup.cfg

錯誤修正

  • #2535: 當 unittest.TestCase 子類別的測試函數使用參數化的 fixture 時,改進錯誤訊息。

  • #3057: request.fixturenames 現在可以正確地回傳由 request.getfixturevalue() 建立的 fixture 名稱。

  • #3946: 使用 -W 作為命令列選項傳遞的警告篩選器,現在會優先於在 ini 設定檔中定義的篩選器。

  • #4066: 透過直接使用 textwrap.dedent 來修正原始碼重新縮排的問題。

  • #4102: pytest.warn 將捕捉 Python 2 中先前警告過的警告。先前它們從未被引發。

  • #4108: 解析 args 的符號連結。

    這修正了執行 pytest tests/test_foo.py::test_bar 的問題,其中 testsproject/app/tests 的符號連結:先前 project/app/conftest.py 會因此被 fixture 忽略。

  • #4132: 修正使用 --pdb 時重複列印內部錯誤的問題。

  • #4135: 基於 pathlib 的 tmpdir 清理現在可以正確處理資料夾中的符號連結。

  • #4152: 當遇到 SyntaxWarning 時,顯示檔案名稱。

改進的文件

  • #3713: 更新 usefixtures 文件,以闡明它不能與 fixture 函數一起使用。

  • #4058: 更新 fixture 文件,以指定 fixture 可以在其定義的作用域中被調用兩次。

  • #4064: 根據 unittest.rst,setUpModule 和 tearDownModule 沒有實作,但事實證明它們有。因此更新了 unittest 的文件。

  • #4151: 在 CONTRIBUTING.rst 指南中加入 tempir 測試範例

瑣碎/內部變更

  • #2293: 內部 MarkerError 例外已被移除。

  • #3988: 將 tmpdir 的實作移植到 pathlib。

  • #4063: 從 --duration 輸出中排除 0.00 秒的項目,除非在命令列上傳遞 -vv

  • #4093: 修正內部測試中字串常值的格式。

pytest 3.8.2 (2018-10-02)

棄用與移除

  • #4036: pytest_warning_captured hook 的 item 參數現在被記錄為已棄用。我們在 3.8 版本發佈後才意識到這個參數與 pytest-xdist 不相容。

    我們的政策是在錯誤修正版本期間不棄用功能,但在這種情況下,我們認為這樣做是有意義的,因為我們只是將其記錄為已棄用,而沒有發出可能破壞測試套件的警告。這將傳達 hook 實作人員根本不應該使用這個參數。

    在未來的版本中,item 將永遠是 None,並且當 hook 實作使用它時,將會發出適當的警告。

錯誤修正

  • #3539: 修正 assertion rewritten 模組的重新載入。

  • #4034: TestReport 物件的 .user_properties 屬性是一個 (name, value) tuple 的列表,但有時可能會被實例化為 tuple 的 tuple。現在它永遠是一個列表。

  • #4039: 當使用 --pyargs 時,不再針對在非頂層目錄中使用 pytest_plugins 發出警告:目前的 --pyargs 機制不可靠,可能會產生偽陰性結果。

  • #4040: 當使用 -rP 選項時,排除通過測試的空報告。

  • #4051: 改進當傳遞無效的 Python 表達式給 -m 選項時的錯誤訊息。

  • #4056: 如果環境變數名稱在 Python 2 上不是 strMonkeyPatch.setenvMonkeyPatch.delenv 會發出警告。

    在 Python 2 中,將 unicode 鍵加入 os.environ 會導致 subprocess (和可能的其他模組) 出現問題,這使得它成為一個微妙的錯誤,特別容易在使用 from __future__ import unicode_literals 時發生。

改進的文件

  • #3928: 在文件中加入 fixture 作用域的可能值。

pytest 3.8.1 (2018-09-22)

錯誤修正

  • #3286: .pytest_cache 目錄現在會自動被 Git 忽略。想要為其他 SCM 貢獻解決方案的使用者,請參考/評論這個問題。

  • #3749: 修正在套件內部收集測試時的以下錯誤

    TypeError: object of type 'Package' has no len()
    
  • #3941: 修正間接參數化會考慮測試函數使用的所有 fixture 的作用域,以決定參數化作用域,而不僅僅是被參數化的 fixture 的作用域的錯誤。

  • #3973: 修正如果測試在之後沒有還原的情況下變更了目前工作目錄,assertion rewriter 就會崩潰的問題。

  • #3998: 修正當使用 --pdb 進入除錯器時,某些 caplog 屬性 (例如 record_tuples) 無法使用的問題。

  • #3999: 修正在 python2.x 中,當類別在 assertion 中回傳非 ascii 二進制 __repr__,且 assertion 也包含非 ascii 文字時,發生的 UnicodeDecodeError

改進的文件

  • #3996: 新的 棄用與移除 頁面顯示了所有目前已棄用的功能、這樣做的理由,以及更新程式碼的替代方案。它還列出了過去主要版本中從 pytest 中移除的功能,以幫助那些使用舊版 pytest 的人升級。

瑣碎/內部變更

  • #3955: 改進變更日誌檔案名稱的 pre-commit 偵測

  • #3975: 移除關於 im_func 的舊程式碼,因為它僅適用於 python2

pytest 3.8.0 (2018-09-05)

棄用與移除

  • #2452: Config.warnNode.warn 已被棄用,請參閱 Config.warn 和 Node.warn 以了解理由和範例。

  • #3936: @pytest.mark.filterwarnings 的第二個參數不再進行 regex 轉義,使其可以實際使用正規表示式來檢查警告訊息。

    注意: regex 轉義 match 字串是一個實作上的疏忽,可能會破壞依賴舊行為的測試套件。

新功能

  • #2452: 內部 pytest 警告現在使用標準 warnings 模組發出,使其可以使用標準警告篩選器來管理這些警告。這引入了 PytestWarningPytestDeprecationWarningRemovedInPytest4Warning 警告類型作為公共 API 的一部分。

    請參閱 文件 以獲取更多資訊。

  • #2908: 如果未設定其他警告篩選器,DeprecationWarningPendingDeprecationWarning 現在預設會顯示。這使得 pytest 更符合 PEP 506#test 執行器的建議篩選器設定。請參閱 文件 以獲取更多資訊。

  • #3251: 警告現在會在測試收集期間被捕捉和顯示。

  • #3784: 設定 PYTEST_DISABLE_PLUGIN_AUTOLOAD 環境變數會停用外掛程式自動載入。

  • #3829: 在 console_output_style 中加入了 count 選項,以啟用將進度顯示為計數而不是百分比。

  • #3837: 在 pytester.RunResult.assert_outcomes 簽名中加入了對 ‘xfailed’ 和 ‘xpassed’ 結果的支援。

錯誤修正

  • #3911: Terminal writer 現在在寫出進度時會將 unicode 字元寬度納入考量。

  • #3913: 當使用未知引數呼叫 Pytest 時,現在會回傳正確的結束代碼 (EXIT_USAGEERROR, 4)。

  • #3918: 改善 assertion rewriting 的效能。

改進的文件

  • #3566: 在 usage.rst 中為 -r 標誌的用法加入了簡短說明,該標誌用於顯示額外的測試摘要資訊。

  • #3907: 更正了傳遞給 xfail 的 exceptions 集合的類型:raises 引數接受 tuple 而不是 list

瑣碎/內部變更

  • #3853: 移除當沒有失敗的測試時,使用 --failed-first--last-failed 列印的 "run all (no recorded failures)" 訊息。

pytest 3.7.4 (2018-08-29)

錯誤修正

  • #3506: 修正寫入 .pyc 檔案時可能發生的無限遞迴。

  • #3853: 當使用 --last-failed--failed-first 標誌時,快取外掛程式現在會遵守 -q 標誌。

  • #3883: 修正在使用 console_output_style=classic 時,錯誤的 console 輸出。

  • #3888: 修正在 doctest 中使用 capturemanager 外掛程式的 macOS 特定程式碼。

改進的文件

  • #3902: 修正 pytest.org 連結

pytest 3.7.3 (2018-08-26)

錯誤修正

  • #3033: 在 teardown 期間,fixture 可以再次使用 capsyscapfd 來檢查測試期間捕捉到的輸出。

  • #3773: 修正在 __init__.py 檔案中收集測試的問題,如果它們符合 python_files 設定選項。

  • #3796: 修正在外部套件結束時,連續子套件的 fixture teardown 只執行一次的問題。

  • #3816: 修正 --show-capture=no 選項仍然會顯示在 fixture teardown 期間列印的日誌的問題。

  • #3819: 修正在即時 cli logging 啟用時,stdout/stderr 沒有被捕捉的問題。

  • #3843: 修正在命令列中使用 test.py::test 語法與 --doctest-modules 一起直接指定測試函數時,發生的收集錯誤。

  • #3848: 修正在 Python 2 上,unicode 引數無法傳遞給 testdir.runpytest 的錯誤。

  • #3854: 修正當檔案名稱以大寫字母開頭時,套件內測試被重複收集的問題。

改進的文件

  • #3824: 在 python_files 中加入了多個 glob 模式匹配的範例。

  • #3833: 為 pytester.Testdir 加入遺失的文件。

  • #3870: 更正 setuptools 整合的文件。

瑣碎/內部變更

  • #3826: 用類型註解取代損壞的類型標註。

  • #3845: 從文件中移除對 issue #568 的參考,該 issue 已被修正。

pytest 3.7.2 (2018-08-16)

錯誤修正

  • #3671: 修正 filterwarnings 未註冊為內建標記的問題。

  • #3768, #3789: 修正從套件和一般目錄混合中收集測試的問題。

  • #3771: 修正如果 pytest_ignore_collect hook 回傳 False 而不是 None 時,收集期間發生的無限遞迴。

  • #3774: 修正在裝飾器裝飾的 fixture 會失去功能 (例如 @mock.patch) 的錯誤。

  • #3775: 修正在匯入帶有 pytest_ 前綴的模組或其他物件時,會引發 PluginValidationError 的錯誤。

  • #3788: 修正在 __init__ 期間引發例外的 TestCase 子類別的 teardown 期間,發生的 AttributeError

  • #3804: 修正具有 __cause__ 循環的例外的追溯報告。

改進的文件

  • #3746: 為 metafunc.config 加入文件,該文件先前被錯誤地隱藏了。

pytest 3.7.1 (2018-08-02)

錯誤修正

  • #3473: 若 approx() 接收到無法理解的預期值類型 (例如字串、巢狀字典等),立即引發錯誤。

  • #3712: 在 approx() 上調用 repr() 時,正確表示 numpy 陣列的維度。

  • #3742: 修正收集期間與第三方外掛程式不相容的問題,該問題會產生錯誤 object has no attribute '_collectfile'

  • #3745: 如果 cache_dir 不是相對於 rootdir,則顯示絕對路徑而不是失敗。

  • #3747: 修正外掛程式的相容性問題,以及 fixture 函數直接調用時發出的警告代碼。

  • #3748: 修正 pytest.approxnumpy<1.13 中使用陣列時的無限遞迴問題。

  • #3757: 將 pathlib2 固定到 >=2.2.0,因為我們需要 __fspath__ 支援。

  • #3763: 修正在 python 3 中斷言訊息為 bytes 時的 TypeError

pytest 3.7.0 (2018-07-30)

棄用與移除

新功能

  • #2283: 新的 package fixture 作用域:fixture 在 *package* 的最後一個測試完成時終結。 此功能被認為是實驗性的,因此請謹慎使用。

  • #3576: Node.add_marker 現在支援 append=True/False 參數,以決定標記是放在最後(預設)還是最前面。

  • #3579: Fixture caplog 現在具有 messages 屬性,可方便地存取格式化的日誌訊息,而無需 formatter/handler 提供的額外資料。

  • #3610: 新的 --trace 選項,可在測試開始時進入偵錯器。

  • #3623: 引入 pytester.copy_example 作為輔助工具,以針對專案中的範例執行驗收測試。

錯誤修正

  • #2220: 修正了一個錯誤,其中被直接參數(例如參數化)覆蓋的 fixture 即使測試未使用也會被實例化。

  • #3695: 修正 ApproxNumpy 初始化引數混淆,absrel 容差被翻轉,導致奇怪的比較結果。 新增測試以檢查 absrel 容差對於 np.array,並測試預期 nannp.array()

  • #980: 修正 verbose 模式下 locals 輸出被截斷的問題。

改進文件

  • #3295: 更正 --last-failed-no-failures 的用法文件,在呈現的範例中新增遺失的 --last-failed 引數,因為它們具有誤導性,並讓人認為不需要遺失的引數。

瑣碎/內部變更

  • #3519: 現在在 .pytest_cache 中建立 README.md 檔案,以清楚說明目錄存在的原因。

pytest 3.6.4 (2018-07-28)

錯誤修正

  • 使用 -mpytest 調用 pytest,以便 sys.path 不會被安裝在 site-packages 中的套件污染。 (#742)

改進文件

  • 在 fixtures 文件中使用 smtp_connection 而不是 smtp,以避免可能的混淆。 (#3592)

瑣碎/內部變更

  • 移除過時的 __future__ 導入。 (#2319)

  • 新增 CITATION 以提供有關如何正式引用 pytest 的資訊。 (#3402)

  • 將損壞的類型註釋替換為類型註解。 (#3635)

  • pluggy 固定到 <0.8。 (#3727)

pytest 3.6.3 (2018-07-04)

錯誤修正

  • 修正在斷言重寫的套件模組中,由顯式相對導入觸發的 ImportWarning。 (#3061)

  • 修正在處理 0 維 numpy 陣列時 pytest.approx 中的錯誤。 (#3593)

  • 使用 get_marker API 時,不再引發 ValueError。 (#3605)

  • 修正日誌訊息包含非 ASCII 字元時,不會出現在輸出日誌檔案中的問題。 (#3630)

  • 當舊式標記無法儲存在函數中時,不再引發 AttributeError。 (#3631)

改進文件

  • @pytest.mark.skipif 範例上方的描述現在更符合程式碼。 (#3611)

瑣碎/內部變更

  • 內部重構:從 CallSpec2.copy() 中移除未使用的 CallSpec2tox ._globalid_args 屬性和 metafunc 參數。 (#3598)

  • 靜音 Python 2 中 reduce 警告的使用 (#3609)

  • 修正 attr.ib 棄用的 convert 參數的使用。 (#3653)

pytest 3.6.2 (2018-06-20)

錯誤修正

  • 透過提取 MarkDecorator 的標記物件,修復 Node.add_marker 中的回歸錯誤。 (#3555)

  • 沒有 location 的警告回報為 None。 這已更正為現在回報 <undetermined location>。 (#3563)

  • 當前一個作用域中的 finalizer 引發例外時,繼續調用堆疊中的 finalizer。 (#3569)

  • 修復 doctests 中 print 語句的編碼錯誤 (#3583)

改進文件

  • 新增 --strict 標誌的文件。 (#3549)

瑣碎/內部變更

  • 在 fixture.rst 文件中,將舊的引號樣式更新為圓括號。 (#3525)

  • 改進關於 KeyboardInterrupt--fulltrace 提示的顯示。 (#3545)

  • pytest 的測試套件不再可透過 python setup.py test 執行 – 請改為直接調用 pytesttox。 (#3552)

  • 修復文件中的錯字 (#3567)

pytest 3.6.1 (2018-06-05)

錯誤修正

  • 修正當測試標記為 xfail 時,junitxml 會將 stdout 和 stderr 記錄兩次的錯誤。 (#3491)

  • 透過正確實例化 FixtureInfo,修復應用於 unittest 測試的 usefixtures 標記。 (#3498)

  • 修復斷言重寫器與 monkey patch file 物件的程式庫的相容性。 (#3503)

改進文件

  • 在 fixture 文件中新增了關於如何將 fixture 用作 factory 的章節。 (#3461)

瑣碎/內部變更

  • 啟用 pip/pre-commit 的快取,以減少 travis/appveyor 上的建置時間。 (#3502)

  • 將 pytest 切換到 src/ 佈局,因為我們已經建議將其作為良好實務 – 現在我們也實作它。 (#3513)

  • 修復測試中的 if 以支援 3.7.0b5,其中 AST 中的 docstring 處理被還原。 (#3530)

  • 移除一些 python2.5 相容性程式碼。 (#3529)

pytest 3.6.0 (2018-05-23)

新功能

  • 使用正確的 per node 處理來修改 pytest.mark 實作的內部結構,這修正了舊設計導致的許多長期存在的錯誤。 這引入了新的 Node.iter_markers(name)Node.get_closest_marker(name) API。 強烈建議使用者閱讀 文件中關於修改原因的說明,或跳至關於 更新現有程式碼以使用新 API 的詳細資訊。 (#3317)

  • 現在,當 @pytest.fixture 多次應用於同一個函數時,會引發 ValueError。 這種有錯誤的行為會導致令人驚訝的問題,如果它適用於測試套件,則大多是偶然的。 (#2334)

  • 支援 Python 3.7 的內建 breakpoint() 方法,請參閱 使用內建的 breakpoint 函數 以取得詳細資訊。 (#3180)

  • monkeypatch 現在支援 context() 函數,該函數充當上下文管理器,可撤銷在 with 區塊內完成的所有修補。 (#3290)

  • --pdb 選項現在會導致 KeyboardInterrupt 進入偵錯器,而不是停止測試會期。 在 python 2.7 上,再次按下 CTRL+C 會退出偵錯器。 在 python 3.2 及更高版本上,請使用 CTRL+D。 (#3299)

  • log-level 參數的數值大於根記錄器的級別時,pytest 不再變更根記錄器的日誌級別,這使其在使用者程式碼中更好地與自訂日誌組態配合使用。 (#3307)

錯誤修正

  • 一個罕見的競爭條件,可能會導致 Windows 上損壞的 .pyc 檔案,有望得到解決。 (#3008)

  • 也使用 iter_marker 來發現從 cli 套用標記表達式的標記,以避免來自舊式標記儲存的不良資料。 (#3441)

  • 當顯示失敗斷言的差異時,如果內容僅包含空白字元,請先使用 repr() 逸出它們,以便輕鬆發現差異。 (#3443)

改進文件

  • 將文件版權年份變更為每次發布時自動更新自身的範圍。 (#3303)

瑣碎/內部變更

  • pytest 現在依賴 python-atomicwrites 程式庫。 (#3008)

  • 將所有 pypi.python.org URL 更新為 pypi.org。 (#3431)

  • 偵測使用內部外掛程式管理器的 pytest_ 前綴 hook,因為 pluggy 正在棄用 PluginManagerimplprefix 引數。 (#3487)

  • _pytest.compat 而不是直接從 collections 導入 MappingSequencepython_api.py::approx 中。 新增 Mapping_pytest.compat,從 python 2 上的 collections 導入它,但從 Python 3 上的 collections.abc 導入,以避免 Python 3.7 或更高版本上的 DeprecationWarning。 (#3497)

pytest 3.5.1 (2018-04-23)

錯誤修正

  • 在每次測試執行之前,重置 sys.last_typesys.last_valuesys.last_traceback。 這些屬性在測試執行期間由 pytest 新增,以協助偵錯,但從未重置,因此它們會建立對最後一個失敗測試框架的洩漏參考,而該框架永遠無法被垃圾收集器回收。 (#2798)

  • 當接收到未知的關鍵字引數時,pytest.raises 現在會引發 TypeError。 (#3348)

  • pytest.raises 現在適用於看起來像 iterable 的例外類別。 (#3372)

改進文件

  • 修復 caplog fixture 文件中的錯字,該文件錯誤地將某些屬性識別為方法。 (#3406)

瑣碎/內部變更

  • 當參數化一個引數採用預設值的函數時,新增了更具指示性的錯誤訊息。 (#3221)

  • 移除內部 _pytest.terminal.flatten 函數,改用 more_itertools.collapse。 (#3330)

  • collections.abc 而不是 collections 導入一些模組,因為後者模組會在 Python 3.7 中觸發 DeprecationWarning。 (#3339)

  • record_property 不再是實驗性的,忘記移除警告。 (#3360)

  • 在文件和 CLI 說明中提及,只有在新增 -v 選項時,pytest --fixtures 才會列印帶有前導 _ 的 fixture。 (#3398)

pytest 3.5.0 (2018-03-21)

棄用與移除

  • record_xml_property fixture 現在已被棄用,改用更通用的 record_property。 (#2770)

  • 現在不建議在非頂層 conftest.py 檔案中定義 pytest_plugins,因為它們會「洩漏」到整個目錄樹。 請參閱文件 以了解此決策背後的理由 (#3084)

新功能

  • 新的 --show-capture 命令列選項,允許指定在測試失敗時如何顯示捕獲的輸出:nostdoutstderrlogall(預設值)。 (#1478)

  • 新的 --rootdir 命令列選項,可覆寫用於發現根目錄的規則。 有關詳細資訊,請參閱文件中的 customize。 (#1642)

  • Fixture 現在根據其作用域實例化,作用域較高的 fixture(例如 session)比作用域較低的 fixture(例如 function)更早實例化。 相同作用域的 fixture 的相對順序保持不變,基於其宣告順序及其依賴關係。 (#2405)

  • record_xml_property 重新命名為 record_property,現在與 xdist、markers 和任何 reporter 相容。 record_xml_property 名稱現在已被棄用。 (#2770)

  • 新的 --nf--new-first 選項:首先執行新的測試,然後執行其餘的測試,在這兩種情況下,測試也按檔案修改時間排序,最近修改的檔案排在最前面。 (#3034)

  • 新的 --last-failed-no-failures 命令列選項,允許指定快取外掛程式的 `--last-failed 功能在上次執行中沒有測試失敗時(或未找到快取時)的行為:noneall(預設值)。 (#3139)

  • 新的 --doctest-continue-on-failure 命令列選項,啟用 doctest 以顯示每個程式碼片段的多個失敗,而不是在第一個失敗時停止。 (#3149)

  • 如果 junit_logging ini 選項設定為 system-out,則捕獲的日誌訊息會新增至產生的 junit xml 檔案中的 <system-out> 標籤。 如果此 ini 選項的值為 system-err,則日誌會寫入 <system-err>junit_logging 的預設值為 no,表示捕獲的日誌不會寫入輸出檔案。 (#3156)

  • 允許日誌外掛程式在啟用即時日誌時處理 pytest_runtest_logstartpytest_runtest_logfinish hook。 (#3189)

  • 在命令列中傳遞 --log-cli-level 現在會自動啟用即時日誌。 (#3190)

  • 新增命令列選項 --deselect,以允許在收集時取消選取個別測試。 (#3198)

  • 捕獲的日誌會在進入 pdb 之前列印。 (#3204)

  • 取消選取的項目計數現在會在測試執行之前顯示,例如 collected X items / Y deselected。 (#3213)

  • 內建模組 platform 現在可用於 pytest.mark 中的表達式。 (#3236)

  • 簡短測試摘要資訊 區段現在顯示在終端機中的追溯和警告之後。 (#3255)

  • 新的 --verbosity 標誌,用於顯式設定 verbosity 級別。 (#3296)

  • pytest.approx 現在接受將 numpy 陣列與純量進行比較。 (#3312)

錯誤修正

  • 在 Python 2.7 中關閉用於捕獲串流的臨時檔案時,抑制 IOError。 (#2370)

  • 修復 caplog fixture 上的 clear() 方法,該方法清除了 records,但未清除 text 屬性。 (#3297)

  • 在測試收集期間,當不允許讀取 stdin 時,DontReadFromStdin 物件仍然允許自身可迭代並解析為迭代器,而不會崩潰。 (#3314)

改進文件

瑣碎/內部變更

  • attrs 的最低要求變更為 17.4.0。 (#3228)

  • 重新命名範例目錄,以便從基本目錄執行時所有測試都通過。 (#3245)

  • 內部 mark.py 模組已轉換為套件。 (#3250)

  • pytest 現在依賴 more-itertools 套件。 (#3265)

  • [pytest] 區段用於透過 -c 傳遞的 .cfg 檔案中時,新增警告 (#3268)

  • nodeids 現在可以顯式傳遞給 FSCollectorNode 建構函式。 (#3291)

  • 重構 FormattedExcinfo 以使用 attrs 功能並移除舊版 Python 版本的舊支援程式碼。 (#3292)

  • 重構以統一內部處理 verbosity 的方式。 (#3296)

  • 內部重構以更好地與 argparse 整合。 (#3304)

  • 修正 doc/en/usage.rst 中呼叫 fixture 的 python 範例 (#3308)

pytest 3.4.2 (2018-03-04)

Bug Fixes

  • 移除當 capture 選項為 no 時的進度資訊。 (#3203)

  • 重構從 existsisdir 的 bindir 檢查。 (#3241)

  • 修正當使用 approxDecimal 值時的 TypeError 問題。 (#3247)

  • 修正當使用 request fixture 時產生的參考循環。 (#3249)

  • 現在可以正確識別由 -c 選項傳遞的 *.cfg 檔案中的 [tool:pytest] 區段。 (#3260)

Improved Documentation

  • 新增 logging 外掛程式到外掛程式列表。 (#3209)

Trivial/Internal Changes

  • 修正 fixture.rst 中的小錯誤 (#3259)

pytest 3.4.1 (2018-02-20)

Bug Fixes

  • doctest.UnexpectedException 的 import 移動到頂層,以避免使用 --pdb 時可能發生的錯誤。 (#1810)

  • 在進入 pdb 之前新增印出捕捉到的 stdout/stderr,並改進了一個關於輸出捕捉的錯誤負面測試。 (#3052)

  • 修正使用參數化 fixture 的測試順序,這可能會導致 fixture 被建立超過必要的次數。 (#3161)

  • 修正在 “test run” 鉤子之外的鉤子中發生的記錄,會導致內部錯誤的錯誤。 (#3184)

  • 當安裝並導入 pypi mock.patch 時,正確偵測由 unittest.mock.patch 裝飾器注入的參數。 (#3206)

  • pytest.raises()match= 失敗時顯示的錯誤,現在更清楚地說明發生了什麼事:當沒有引發例外時, “matching ‘…’” 部分被移除,因為它錯誤地暗示引發了例外,但它不匹配。當引發了錯誤的例外時,現在會拋出它(就像沒有 match=pytest.raised() 一樣),而不是抱怨不匹配的文字。 (#3222)

  • 修正 macOS 上 doctest 中的輸出捕捉處理。 (#985)

Improved Documentation

  • pytest.raises 新增 matchmessage 參數的 Sphinx 參數文件。 (#3202)

Trivial/Internal Changes

  • pytest 已經變更了發布程序,現在直接從 Travis 發布到 PyPI。 (#3060)

  • 為了符合命名慣例,將 ParameterSet._for_parameterize() 重新命名為 _for_parametrize()。 (#3166)

  • 跳過 macOS 上失敗的 pdb/doctest 測試。 (#985)

pytest 3.4.0 (2018-01-30)

Deprecations and Removals

  • 所有 pytest 類別現在都繼承 object,以獲得更好的 Python 2/3 相容性。除了非常罕見的邊緣情況外,這不應影響使用者程式碼。 (#2147)

Features

  • 引入 empty_parameter_set_mark ini 選項,以選擇當 @pytest.mark.parametrize 給定一個空的參數集合時要套用的標記。有效的選項為 skip (預設) 和 xfail。請注意,計劃在未來的版本中將預設值變更為 xfail,因為這被認為比較不容易出錯。 (#2527)

  • 不相容的變更:在社群回饋之後,記錄 功能已經進行了一些變更。請參閱 記錄文件 以了解詳細資訊。 (#3013)

  • 當停用捕捉 (-s) 時,主控台輸出會回復為 “classic” 模式,否則輸出會變得難以理解以至於無用。 (#3038)

  • 新的 pytest_runtest_logfinish 鉤子,當測試項目執行完成時會呼叫它,類似於 pytest_runtest_logstart。 (#3101)

  • 改進使用許多 fixture 收集測試時的效能。 (#3107)

  • 新的 caplog.get_records(when) 方法,提供對 "setup""call""teardown" 測試階段的捕捉記錄的存取。 (#3117)

  • 新的 fixture record_xml_attribute,允許在 JUnit 報告中修改和插入 <testcase> xml 節點上的屬性。 (#3130)

  • 預設快取目錄已從 .cache 重新命名為 .pytest_cache,在社群回饋之後,名稱 .cache 並未清楚表明它是由 pytest 使用的。 (#3138)

  • 在即時記錄輸出中著色 levelname 欄位。 (#3142)

Bug Fixes

  • 透過使用 flush() 而非 wait(),修正 macOS 上懸掛的 pexpect 測試。 (#2022)

  • 修正在具有 pytester 外掛程式的程序內 pytest 執行後還原 Python 狀態;如果後續的測試依賴於先前的測試洩漏全域直譯器變更,這可能會破壞使用多個程序內 pytest 執行的測試。 (#3016)

  • 修正當測試在外掛程式設定鉤子之前中止時,跳過外掛程式報告鉤子的問題。 (#3074)

  • 修正在 teardown 期間測試失敗時回報的進度百分比。 (#3088)

  • 不相容的變更-o/--override 選項不再吃掉所有剩餘的選項,這可能會導致令人驚訝的行為:例如,pytest -o foo=1 /path/to/test.py 會失敗,因為 /path/to/test.py 會被視為 -o 命令列引數的一部分。這樣做的一個後果是,現在多個組態覆寫需要多個 -o 旗標:pytest -o foo=1 -o bar=2。 (#3103)

Improved Documentation

  • 記錄無法與 hookwrapper=True 一起使用的鉤子(使用 historic=True 定義)。 (#2423)

  • 闡明預設情況下,警告捕捉不會變更警告篩選器。 (#2457)

  • 在使用 pytest_fixture_setup 與傳回 None 的 fixture 函數時,釐清可能產生的混淆。 (#2698)

  • 修正 pytest 中使用的 doctest 旗標的句子措辭。 (#3076)

  • 對於文件中的連結,偏好使用 https://*.readthedocs.io 而非 http://*.rtfd.org。 (#3092)

  • 改進入門指南的可讀性(措辭、文法) (#3131)

  • 新增註記,指出由於 import 快取,不建議從同一個程序多次呼叫 pytest.main。 (#3143)

Trivial/Internal Changes

  • 當關鍵字運算式觸發語法錯誤時(例如, "-k foo and import" 會顯示您無法在運算式中使用 import 關鍵字的錯誤),顯示一個簡單且容易理解的錯誤。 (#2953)

  • 變更參數化自動測試 ID 生成,以使用函數的 __name__ 屬性,而不是後備引數名稱加上計數器。 (#2976)

  • 將 py.std 替換為 stdlib imports。 (#3067)

  • 在記錄文件中將 ‘you’ 更正為 ‘your’。 (#3129)

pytest 3.3.2 (2017-12-25)

Bug Fixes

  • pytester:忽略用於在 fd 洩漏偵測器中取得當前使用者 metadata 的檔案。 (#2784)

  • 修正 記憶體洩漏,其中 fixture 傳回的物件永遠不會被垃圾回收器解構。 (#2981)

  • 修正在 Python 2 上將 pyargs 轉換為檔案名稱時,不會轉換符號連結。 (#2985)

  • 現在也會檢查外掛程式的 PYTEST_DONT_REWRITE,而不僅僅是測試模組。 (#2995)

Improved Documentation

  • 新增關於多個參數化引數行為的釐清註記 (#3001)

Trivial/Internal Changes

  • 程式碼清理。 (#3015, #3021)

  • 透過將 _ast 的 imports 和 references 替換為 ast 來清理程式碼。 (#3018)

pytest 3.3.1 (2017-12-05)

Bug Fixes

  • 修正關於 -p no:<plugin> 無效的問題。 (#2920)

  • 修正在 Python 2 中,警告的引數包含非字串時的回歸問題。 (#2956)

  • 設定 PYTEST_CURRENT_TEST 時,始終 escape null bytes。 (#2957)

  • 修正在實際未收集任何測試時,使用 testmon 外掛程式時的 ZeroDivisionError。 (#2971)

  • TerminalReporter.writer 帶回作為 TerminalReporter._tw 的別名。此別名在 3.3.0 版本中意外移除。 (#2984)

  • 現在也將 pytest-capturelog 外掛程式列入黑名單,避免在安裝它的情況下執行 pytest 時發生錯誤。 (#3004)

Improved Documentation

  • 修正到外掛程式 pytest-localserver 的損壞連結。 (#2963)

Trivial/Internal Changes

  • 更新 CONTRIBUTING.rst 中的 github “bugs” 連結 (#2949)

pytest 3.3.0 (2017-11-23)

Deprecations and Removals

  • pytest 不再支援 Python 2.63.3。這些 Python 版本已經 EOL 一段時間了,並且在 pytest 核心團隊中產生維護和相容性成本,並且在與社群其他成員溝通後,我們決定從此版本開始不再支援它們。仍然需要這些版本的使用者應該將 pytest pin 到 <3.3。 (#2812)

  • 移除內部 _preloadplugins() 函數。此移除是 pytest_namespace() 鉤子棄用的一部分。 (#2636)

  • 在內部將 CallSpec2 變更為具有標記列表,而不是損壞的關鍵字對應。這移除了內部 CallSpec2 類別的 keywords 屬性。 (#2672)

  • 移除 ParameterSet.deprecated_arg_dict - 它不是公共 API,並且缺少底線是一個命名錯誤。 (#2675)

  • 移除內部多類型屬性 Node._evalskip,並將其替換為布林值 Node._skipped_by_mark。 (#2767)

  • 傳遞給 pytest.fixtureparams 列表現在對於所有效果都視為不可變的,並且在呼叫 pytest.fixture 的那一刻凍結。先前,列表可以在 fixture 的第一次調用之前變更,允許某種形式的動態參數化(例如,從命令列選項更新),但這是一個不必要的實作細節,它使內部結構複雜化並阻止了一些內部清理。有關詳細資訊和建議的解決方法,請參閱 issue #2959

Features

  • pytest_fixture_post_finalizer 鉤子現在可以接收 request 引數。 (#2124)

  • 在 compat.py 中取代舊的 introspection 程式碼,該程式碼使用 Python 3 上的 inspect.signature 和 Python 2 上的 funcsigs.signature 來判斷 fixture 的可用引數。這應該尊重函數上的 __signature__ 宣告。 (#2267)

  • 現在 pytest 只會顯示一次具有全域 pytestmark 變數的測試。 (#2549)

  • 現在 pytest 在執行測試時會顯示總進度百分比。可以透過將 console_output_style 設定配置為 classic 來設定先前的輸出樣式。 (#2657)

  • 透過新增 match 關鍵字,使 warns 簽名與 raises 匹配。 (#2708)

  • 現在 pytest 會捕捉並顯示來自標準 logging 模組的輸出。使用者可以透過在 pytest.ini、命令列和使用標記的個別測試中指定選項,來控制要捕捉的記錄層級。此外,還提供了一個 caplog fixture,讓使用者可以在特定測試期間測試捕捉到的記錄(類似於 capsys)。如需更多資訊,請參閱 logging 文件。此功能是透過合併廣受歡迎的 pytest-catchlog 外掛程式引入的,感謝 @thisch。請注意,在合併期間,已刪除與已停用的 pytest-capturelog 的向後相容性介面。 (#2794)

  • 新增 allow_module_level kwarg 到 pytest.skip(),啟用跳過整個模組。 (#2808)

  • 允許在 PYTEST_ADDOPTS 中設定 file_or_dir-c-o。 (#2824)

  • 將 stdout/stderr 捕捉結果作為 namedtuple 傳回,因此可以透過屬性存取 outerr。 (#2879)

  • 新增 capfdbinary,這是 capfd 的一個版本,它從 readouterr() 傳回 bytes。 (#2923)

  • 新增 capsysbinary,這是 capsys 的一個版本,它從 readouterr() 傳回 bytes。 (#2934)

  • 實作在以 --doctest-modules 執行時跳過 setup.py 檔案的功能。 (#502)

Bug Fixes

  • capsys/capfd.disabled() 上下文管理器之後恢復輸出捕捉。 (#1993)

  • 現在會為所有 conftest.py 檔案呼叫 pytest_fixture_setuppytest_fixture_post_finalizer 鉤子。 (#2124)

  • 如果在外掛程式載入時發生例外,pytest 不再隱藏原始追溯。在 Python 2 中,它將顯示原始追溯,並帶有一條新訊息,說明在哪個外掛程式中。在 Python 3 中,它將顯示 2 個標準化的例外,即載入外掛程式時的原始例外,以及 pytest 拋出的關於載入外掛程式的例外。 (#2491)

  • capsyscapfd 現在可以被其他 fixture 使用。 (#2709)

  • 內部 pytester 外掛程式正確地將 bytes 引數編碼為 utf-8。 (#2738)

  • testdir 現在使用與 tmpdir 相同的方法來建立其臨時目錄。這稍微變更了 testdir 目錄的最終結構,但不應影響正常情況下的使用,並避免了許多潛在的問題。 (#2751)

  • 即使對於 ascii 相容的訊息,pytest 也不再抱怨具有 unicode 訊息的警告是非 ascii 相容的。因此,為了安全起見,具有 unicode 訊息的警告首先會轉換為 ascii 表示法。 (#2809)

  • 當達到 --maxfail 時,將 pytest 命令的傳回值從 2 (中斷) 變更為 1 (失敗)。 (#2845)

  • 修正在斷言重寫中的問題,這可能會導致它重寫不應重寫的模組。 (#2939)

  • 處理 pytest.ini 中沒有描述的標記。 (#2942)

Trivial/Internal Changes

  • 現在 pytest 依賴 attrs 進行內部結構,以簡化程式碼維護性。 (#2641)

  • 重構內部 Python 2/3 相容性程式碼以使用 six。 (#2642)

  • 停止 vendoring pluggy - 我們因為沒有太多好處而錯過了它的最新變更 (#2719)

  • 內部重構:透過在新版本的 Python 3 中使用 backslashreplace 錯誤處理程式,簡化 ascii 字串 escaping。 (#2734)

  • 移除 unittest 外掛程式中不必要的標記評估器 (#2767)

  • 現在呼叫 Metafunc.addcall 會發出棄用警告。此函數計劃在 pytest-4.0 中移除。 (#2876)

  • 將 parameterset 提取的內部移動到更易於維護的位置。 (#2877)

  • 簡化範圍節點查找的內部重構。 (#2910)

  • 配置 pytest 以防止 pip 在不受支援的 Python 版本中安裝 pytest。 (#2922)

pytest 3.2.5 (2017-11-15)

Bug Fixes

  • pytest 中移除 py<1.5 限制,因為這可能會在某些安裝中導致版本衝突。 (#2926)

pytest 3.2.4 (2017-11-13)

Bug Fixes

  • 修正了當從不同的根目錄執行時,使用 --pyargs 執行會導致項目具有空的 parent.nodeid 的錯誤。( #2775)

  • 修正了當 @pytest.parametrizeargnames 以關鍵字參數指定時的問題。( #2819)

  • 從 INI 設定檔讀取標記名稱時,移除名稱中的空白字元。( #2856)

  • 如果 docstring 中失敗範例的行號小於 9,則在 pytest 輸出中顯示 doctest 來源的完整上下文。( #2882)

  • 比對 fixture 路徑時,改為比對實際路徑區段,以避免比對到共用相同前綴的資料夾。( #2836)

改進文件

  • 新增關於 conftest.py 的專門章節。( #1505)

  • xfail 的文件中,明確提及 xpass。( #1997)

  • 在 example/parametrize 文件中加入 pytest.param 的範例。( #2658)

  • 釐清 fixture 參數提案的語言。( #2893)

  • 在入門文件中的支援版本列表中加入 Python 3.6。( #2903)

  • 釐清可用 fixture 作用域的文件說明。( #538)

  • 新增關於 python -m pytest 調用會將目前目錄加入 sys.path 的文件說明。( #911)

pytest 3.2.3 (2017-10-03)

錯誤修正

  • 修正未給定前綴時,Tab 鍵自動完成功能會崩潰的問題。( #2748)

  • MarkDecorator 的相等性檢查函數 (__eq__) 在其中一個物件不是 MarkDecorator 的實例時,會回傳 False。( #2758)

  • 當執行 pytest --fixtures-per-test 時:如果項目沒有 _fixtureinfo 屬性 (例如 doctest),則不會崩潰。( #2788)

改進文件

  • -k 選項的說明文字中,加入使用 not 來排除名稱符合指定表達式的測試範例。( #1442)

  • parametrize.rst 中加入關於多次呼叫 metafunc.parametrize 的註記。( #1548)

瑣碎/內部變更

  • 在 pytest 自身的測試套件中設定 xfail_strict=True,以便在預期會失敗的測試開始通過時立即捕獲。( #2722)

  • 修正將可呼叫物件傳遞給標記的範例中的錯字 (在 example/markers.rst 中)。( #2765)

pytest 3.2.2 (2017-09-06)

錯誤修正

  • 呼叫已棄用的 request.getfuncargvalue() 現在會顯示呼叫的來源。( #2681)

  • 允許宣告為 @staticmethod 的測試使用 fixture。( #2699)

  • 修正收集期間的邊緣案例:當存取會引發 pytest.fail 的屬性時,會中止整個收集程序。( #2707)

  • 修正混合 unicode 和 UTF-8 參數的 ReprFuncArgs。( #2731)

改進文件

  • 在使用自訂標記的範例中,加入示範如何使用 pytest.mark.MARKER_NAME.with_argspytest.mark.MARKER_NAME.__call__ 比較的範例。( #2604)

  • 在其中一個簡單的範例中,使用 pytest_collection_modifyitems() 根據命令列選項跳過測試,允許共用的同時防止使用者在引數解析之前存取 pytest.config 時發生錯誤。( #2653)

瑣碎/內部變更

  • 修正 ‘Good Practices/Manual Integration’ 程式碼片段中的小錯誤。( #2691)

  • 修正 goodpractices.rst 中的錯字。( #2721)

  • 改進關於 --resultlog 棄用的使用者指南。( #2739)

pytest 3.2.1 (2017-08-08)

錯誤修正

  • 修正收集單個測試項目時的小終端機故障。( #2579)

  • 正確地將 / 視為檔案分隔符號,以便在 Windows 上自動標記外掛程式檔案以進行重寫。( #2591)

  • 在設定 PYTEST_CURRENT_TEST 環境變數時,正確地逸出測試名稱。( #2644)

  • 修正在 Windows 和 Python 3.6+ 上,當 sys.stdout 已被替換為不實作完整 io 模組緩衝區協定的類串流物件時發生的錯誤。特別是這會影響上述平台上的 pytest-xdist 使用者。( #2666)

改進文件

  • 明確說明哪些 pytest 功能可與 unittest 搭配使用。( #2626)

pytest 3.2.0 (2017-07-30)

棄用與移除

  • pytest.approx 不再支援 >>=<<= 運算子,以避免令人驚訝/不一致的行為。請參閱 approx() 文件以取得更多資訊。( #2003)

  • pytest API 中目前類別的所有舊式特定行為在此時都被視為已棄用,並將在未來的版本中移除。這僅影響 Python 2 使用者,且僅在少數情況下。( #2147)

  • 現在,當在 pytest.mark.parametrize 中使用標記作為參數時,會引發棄用警告。請改用 pytest.param 將標記應用於參數。( #2427)

新功能

  • 新增對 numpy 陣列 (和 dict) 的 approx 支援。( #1994)

  • 現在,測試函數物件具有 pytestmark 屬性,其中包含直接應用於測試函數的標記列表,而不是從父類別或模組繼承的標記。( #2516)

  • 預設情況下,收集程序會忽略本機虛擬環境;--collect-in-virtualenv 會覆寫此行為。( #2518)

  • 允許裝飾為 @staticmethod 的類別方法作為收集為測試函數的候選者。(僅適用於 Python 2.7 及以上版本。Python 2.6 仍會忽略靜態方法。)( #2528)

  • 引入 mark.with_args 以允許將函數/類別作為唯一引數傳遞給標記。( #2540)

  • 新的 cache_dir ini 選項:設定快取外掛程式內容儲存的目錄。目錄可以是相對或絕對路徑:如果是相對路徑,則目錄會相對於 rootdir 建立,否則會按原樣使用。此外,路徑可能包含在執行期間擴展的環境變數。( #2543)

  • 引入 PYTEST_CURRENT_TEST 環境變數,該變數會設定為目前正在執行的測試的 nodeid 和階段 (setupcallteardown)。請參閱 文件 以取得更多資訊。( #2583)

  • 引入 @pytest.mark.filterwarnings 標記,允許覆寫每個測試、類別或模組層級的警告篩選器。請參閱 文件 以取得更多資訊。( #2598)

  • --last-failed 現在會永久記住測試失敗的時間,只有在再次通過時才會忘記。這使得透過選擇性地執行檔案和逐步修正測試來修正測試套件變得容易。( #2621)

  • 新的 pytest_report_collectionfinish hook,允許外掛程式在收集成功完成後,將訊息新增至終端機報告。( #2622)

  • 新增對 PEP 415Exception.__suppress_context__ 的支援。現在,如果 pytest 捕獲到 raise exception from None,pytest 將不再在測試報告中鏈接上下文。現在的行為與 Python 的追溯行為一致。( #2631)

  • pytest.failpytest.skippytest.xfail 引發的例外現在是 BaseException 的子類別,使其更難被一般程式碼意外捕獲。( #580)

錯誤修正

  • pytester.py.Testdir.popen() 中將 stdin 設定為已關閉的 PIPE,以避免不必要的互動式 pdb。( #2023)

  • 在使用 capsys 捕獲模式時,將遺失的 encoding 屬性新增至 sys.std* 串流。( #2375)

  • 修正在 Windows 上,如果 coloramaconftest.py 檔案中匯入,則終端機顏色會變更為黑色的問題。( #2510)

  • 修正在報告跳過測試摘要時的行號。( #2548)

  • capture:確保 EncodedFile.name 是字串。( #2555)

  • 選項 --fixtures--fixtures-per-test 現在將保留 docstring 中的縮排。( #2574)

  • doctest 行號現在已正確報告,修正了 pytest-sugar#122。( #2610)

  • 修正在 fixture 收集順序中的非決定性行為。為 Python 2.6 新增了新的依賴項 (ordereddict)。( #920)

改進文件

  • 釐清 pytest_configure hook 呼叫順序。( #2539)

  • 使用 pytester 外掛程式擴充測試外掛程式程式碼的文件說明。( #971)

瑣碎/內部變更

  • 更新 --strict 的說明訊息,使其清楚地表明它僅處理未註冊的標記,而不是警告。( #2444)

  • 內部程式碼移動:將 pytest.approx/pytest.raises 的程式碼移動到自己的檔案中,以減少 python.py 的大小。( #2489)

  • 將實用函數 _pytest.compat._escape_strings 重新命名為 _ascii_escaped,以更好地傳達函數的用途。( #2533)

  • 改進 CollectError 與 skip/skipif 的錯誤訊息。( #2546)

  • 針對每個產生器僅發出一次關於 yield 測試已棄用的警告。( #2562)

  • 確保最終收集的行不包含先前寫入的人工產物。( #2571)

  • 修正所有 flake8 錯誤和警告。( #2581)

  • 新增 fix-lint tox 環境,以在程式碼上執行自動 pep8 修正。( #2582)

  • 在 pytest 自身的測試套件中將警告轉換為錯誤,以便更及時地捕獲由於棄用造成的迴歸。( #2588)

  • 在 CHANGELOG 條目中顯示多個 issue 連結。( #2620)

pytest 3.1.3 (2017-07-03)

錯誤修正

  • 修正 Python 2 中 docstring 內 doctest 的解碼錯誤。( #2434)

  • finalizer 在 teardown 期間引發的例外現在會被抑制,直到所有 finalizer 都被呼叫,然後再重新引發初始例外。( #2440)

  • 修正在命令列上指定測試時,不正確的「collected items」報告。( #2464)

  • context-manager 形式的 deprecated_call 現在即使已引發相同的警告,也會捕獲棄用警告。此外,deprecated_call 將始終產生相同的錯誤訊息 (先前在 context-manager 與 function-call 模式下會產生不同的訊息)。( #2469)

  • 修正在 pytest 收集的路徑可能具有三個前導 / 字元的問題。( #2475)

  • 修正在嘗試偵測遞迴追溯的開始時的內部錯誤。( #2486)

改進文件

  • 明確說明哪些 hook 在第一個非 None 結果後停止呼叫。( #2493)

瑣碎/內部變更

  • 建立用於更新供應商套件的 invoke 任務。( #2474)

  • 更新 LICENSE、README.rst 和文件中的版權日期。( #2499)

pytest 3.1.2 (2017-06-08)

錯誤修正

  • 透過 pytest_addoption 新增的必要選項將不再阻止在不傳遞它們的情況下使用 –help。(#1999)

  • 在斷言重寫中尊重 python_files。(#2121)

  • 修正在追溯中的 frame 包含無法比較的物件 (例如 numpy 陣列) 時的遞迴錯誤偵測。(#2459)

  • UnicodeWarning 僅在訊息包含非 ascii unicode 時從內部 pytest 警告外掛程式發出 (僅限 Python 2)。(#2463)

  • 為 Python 3.6 WindowsConsoleIO 由於 Pytests 的 FDCapture 而崩潰的問題新增了 workaround。其他使用控制台句柄的程式碼可能仍會受到相同問題的影響,並且可能需要進一步的 workaround/修正,即 colorama。(#2467)

改進文件

  • 修正指向 pluggy 物件的內部 API 連結。(#2331)

  • 明確指出 pytest.xfail 會在呼叫點停止測試執行,並改進 skipping 文件的整體流程。(#810)

pytest 3.1.1 (2017-05-30)

錯誤修正

  • pytest 警告捕獲不再覆寫現有的警告篩選器。先前的行為會覆寫所有篩選器,並導致在設定警告篩選器以符合其需求的測試套件中發生迴歸。請注意,作為此操作的副作用,DeprecationWarningPendingDeprecationWarning 不再預設顯示。(#2430)

  • 修正在 doctest 文字檔案中包含非 ascii 內容的問題。(#2434)

  • 修正 Python 2 中 unicode 警告的編碼錯誤。(#2436)

  • pytest.deprecated_call 現在在 context manager 形式中捕獲 PendingDeprecationWarning。(#2441)

改進文件

  • 新增 towncrier 以進行變更日誌管理。(#2390)

3.1.0 (2017-05-22)

新功能

  • pytest-warnings 外掛程式已整合到核心中,現在 pytest 會在測試會期結束時自動捕獲並顯示警告。

    警告

    此功能可能會干擾自行套用和處理警告的測試套件,並且可以在您的 pytest.ini 中停用

    [pytest]
    addopts = -p no:warnings
    

    請參閱 警告文件頁面 以取得更多資訊。

    感謝 @nicoddemus 的 PR。

  • 新增 junit_suite_name ini 選項,以指定 JUnit XML 報告的根 <testsuite> 名稱 (#533)。

  • 新增 ini 選項 doctest_encoding,以指定用於 doctest 檔案的編碼。感謝 @wheerd 的 PR (#2101)。

  • pytest.warns 現在檢查子類別關係而不是類別相等性。感謝 @lesteve 的 PR (#2166)

  • pytest.raises 現在使用 match 關鍵字引數斷言錯誤訊息是否與文字或正則表達式匹配。感謝 @Kriechi 的 PR。

  • pytest.param 可用於宣告具有標記和測試 ID 的測試參數集。感謝 @RonnyPfannschmidt 的 PR。

變更

  • 移除所有 pytest_namespace hook 的內部使用,這是為了準備在 pytest 4.0 中移除 preloadconfig。感謝 @RonnyPfannschmidt 的 PR。

  • pytest 現在在參數化測試中,當可呼叫的 id 引發例外時會發出警告。感謝 @fogo 的 PR。

  • 現在可以透過在類別主體中將 __test__ 屬性設定為 False 來跳過收集測試類別 (#2007)。感謝 @syre 的報告和 @lwm 的 PR。

  • 變更 junitxml.py 以產生符合 Junitxml 綱要的報告。如果相同的測試在呼叫中失敗,然後在 teardown 中發生錯誤,我們會將 testcase 元素分成兩個,一個包含錯誤,另一個包含失敗。( #2228) 感謝 @kkoukiou 的 PR。

  • 具有 url 屬性的 Testcase 報告現在將正確地將其寫入 junitxml。感謝 @fushi 的 PR (#1874)。

  • 當 verbosity=1 時,從 dict 比較輸出中移除常見項目。同時更新截斷訊息,使其更清楚地表明如果 verbosity < 2,pytest 會截斷所有斷言訊息 (#1512)。感謝 @mattduck 的 PR

  • --pdbcls 不再暗示 --pdb。這使得可以在 pytest.ini 上使用 addopts=--pdbcls=module.SomeClass。感謝 @davidszotten 的 PR (#1952)。

  • 修正 #2013:將 RecordedWarning 轉換為 namedtuple,以便為其提供可理解的 repr,同時防止不必要的修改。

  • 修正 #2208:確保 _pytest.compat.get_real_func 的迭代限制。感謝 @RonnyPfannschmidt 的報告和 PR。

  • Hook 現在在收集完成後驗證,而不是在載入已安裝的外掛程式後立即驗證。這使得為在收集期間載入的外掛程式編寫 hook 變得容易,例如使用 pytest_plugins 特殊變數 (#1821)。感謝 @nicoddemus 的 PR。

  • 修改 pytest_make_parametrize_id() hook 以接受 argname 作為額外參數。感謝 @unsignedint 的 PR。

  • venv 新增至預設 norecursedirs 設定。感謝 @The-Compiler 的 PR。

  • PluginManager.import_plugin 現在在 Python 2 中接受 unicode 外掛程式名稱。感謝 @reutsharabani 的 PR。

  • 修正 #2308:當同時使用 --lf--ff 時,僅執行上次失敗的測試。感謝 @ojii 的 PR。

  • 將文件中的 minor/patch 層級版本號碼替換為佔位符。這顯著減少了變更雜訊,因為不同的貢獻者在不同的平台上重新產生文件。感謝 @RonnyPfannschmidt 的 PR。

  • 修正 #2391:考慮所有外掛程式模組上的 pytest_plugins。感謝 @RonnyPfannschmidt 的 PR。

錯誤修正

  • 修正使用 python 3 中的 capsys fixture 時,sys.stdout.buffer / sys.stderr.buffer 上的 AttributeError。( #1407)。感謝 @asottile

  • 變更 capture.py 的 DontReadFromInput 類別,使其在 fileno 方法中拋出 io.UnsupportedOperation 錯誤,而不是 ValueErrors。( #2276)。感謝 @metasyn@vlad-dragos 的 PR。

  • 修正當例外訊息包含非 ascii 字元時,匯入模組時的例外格式。( #2336)。感謝 @fabioz 的報告和 @nicoddemus 的 PR。

  • 新增與 issue 相關的文件說明 (#1937) 感謝 @skylarjhdownes 的 PR。

  • 允許收集具有任何副檔名的檔案作為 Python 模組 (#2369)。感謝 @Kodiologist 的 PR。

  • 當收集具有錯誤引數的 “parametrize” 函數時,顯示正確的錯誤訊息 (#2383)。感謝 @The-Compiler 的報告和 @robin0371 的 PR。

3.0.7 (2017-03-14)

  • 修正在斷言重寫中,由於模組在匯入失敗時靜默丟棄其他模組而導致中斷的問題。值得注意的是,修正了匯入 anydbm 模組的問題。( #2248)。感謝 @pfhayes 的 PR。

  • junitxml:修正 XML 報告中每個 testcase 元素出現兩次 system-out 標籤的問題案例。感謝 @kkoukiou 的 PR。

  • 修復了回歸錯誤,現在如果使用 --pdb 執行,pytest 會正確地跳過 unittest (#2137)。感謝 @gst 的報告和 @mbyt 的 PR。

  • 忽略在 Python 測試收集期間,從描述器 (例如 properties) 引發的例外 (#2234)。感謝 @bluetech

  • --override-ini 現在可以正確地覆蓋一些基本選項,例如 python_files (#2238)。感謝 @sirex 的報告和 @nicoddemus 的 PR。

  • 根據 PEP 479 (#2160),將程式碼中 raise StopIteration 的用法替換為簡單的 returns 來結束生成器。感謝 @nicoddemus 的 PR。

  • 修復了在測試中引發無法列印的 AssertionError 時發生的內部錯誤。感謝 @omerhadari 的 PR。

  • 跳過外掛程式現在也適用於自訂收集器產生的測試項目 (#2231)。感謝 @vidartf

  • 修復了在沒有 .ini 檔案時,主控台輸出中尾隨空白的問題 (#2281)。感謝 @fbjorn 的 PR。

  • 無條件的 xfail 標記不再依賴於底層測試項目是 PyobjMixin 的實例,因此可以應用於非內建 python 測試收集器收集的測試。感謝 @barneygale 的 PR。

3.0.6 (2017-01-22)

  • pytest 不再從自身操作產生 PendingDeprecationWarning,這是在 3.0.5 版本中錯誤引入的 (#2118)。感謝 @nicoddemus 的報告和 @RonnyPfannschmidt 的 PR。

  • pytest 不再將協程函數識別為 yield 測試 (#2129)。感謝 @malinoff 的 PR。

  • PYTEST_PLUGINS 環境變數載入的外掛程式現在會自動被考慮用於斷言重寫 (#2185)。感謝 @nicoddemus 的 PR。

  • 改進了 pytest.warns 失敗時的錯誤訊息 (#2150)。預期警告的類型和捕獲的警告列表已添加到錯誤訊息中。感謝 @lesteve 的 PR。

  • 修復了 pytester 內部外掛程式,使其可以與最新版本的 zope.interface 正確協作 (#1989)。感謝 @nicoddemus 的 PR。

  • pytester 外掛程式的斷言語句再次受益於斷言重寫 (#1920)。感謝 @RonnyPfannschmidt 的報告和 @nicoddemus 的 PR。

  • 現在,對於在具有 ini 配置檔案的子目錄中的測試,使用冒號 (例如 test_foo.py::test_bar) 指定測試時,會使用正確的 ini 檔案 (#2148)。感謝 @pelme

  • 如果 testdir.runpytest().assert_outcomes() 依賴的 pytest 終端輸出遺失,則明確地使其失敗。感謝 @eli-b 的 PR。

3.0.5 (2016-12-05)

  • 當未正確地將 option=value 傳遞給 -o/--override-ini 時,新增警告 (#2105)。同時改進了說明文件。感謝 @mbukatov 的報告和 @lwm 的 PR。

  • 現在,如果 --confcutdir--junit-xml 分別是目錄和檔案名稱,則會對它們進行正確的驗證 (#2089#2078)。感謝 @lwm 的 PR。

  • 在錯誤訊息中新增提示,提示可能缺少 __init__.py (#478)。感謝 @DuncanBetts

  • 更準確地在文件中描述 fixture 終結發生的時間 (#687)。感謝 @DuncanBetts

  • recwarn.rst 提供 :ref: 目標,以便我們可以使用 intersphinx 參考。感謝 @dupuy 的報告和 @lwm 的 PR。

  • 在 Python 2 中,在 pytest.approx 的字串表示形式中使用簡單的 +- ASCII 字串 (例如 "4 +- 4.0e-06"),因為在 pytest 內部不同上下文和表示形式中處理它很脆弱,可能會導致諸如 #2111 之類的錯誤。在 Python 3 中,表示形式仍然使用 ± (例如 "4 ± 4.0e-06")。感謝 @kerrick-lyft 的報告和 @nicoddemus 的 PR。

  • 使用 item.Functionitem.Module 等現在會發出棄用警告,請改用 pytest.Functionpytest.Module 等 (#2034)。感謝 @nmundar 的 PR。

  • 修復了將 approx 與複數一起使用時的錯誤訊息 (#2082)。感謝 @adler-j 的報告和 @nicoddemus 的 PR。

  • 修復了由 pytest_plugins 機制多次導入的模組的斷言重寫 hook 中的誤報警告。感謝 @nicoddemus 的 PR。

  • 移除了一個內部快取,該快取可能導致子目錄中 conftest.py 檔案的 hook 在其他目錄中被錯誤地調用 (#2016)。感謝 @d-b-w 的報告和 @nicoddemus 的 PR。

  • 移除旨在支援早期 Python 3 版本的內部程式碼,該程式碼產生了當 pytest 評估表達式時 (例如將條件作為字串傳遞給 pytest.mark.skipif),在 sys.modules 中留下 None 的副作用 (#2103)。感謝 @jaraco 的報告和 @nicoddemus 的 PR。

  • 優雅地處理沒有匹配 .py 檔案的 .pyc 檔案 (#2038)。感謝 @nedbat

3.0.4 (2016-11-09)

  • 現在,收集測試模組時的導入錯誤會顯示完整的追溯 (#1976)。感謝 @cwitty 的報告和 @nicoddemus 的 PR。

  • 修復了具有兩個或多個 metavar 屬性的自訂選項的混淆命令行說明訊息 (#2004)。感謝 @okulynyak@davehunt 的報告和 @nicoddemus 的 PR。

  • 當載入外掛程式時,現在可以在 Python 2 中正確處理包含非 ASCII 訊息的導入錯誤 (#1998)。感謝 @nicoddemus 的 PR。

  • 修復了在 context-manager 形式中使用 pytest.raises 時的循環引用 (#1965)。此外,由於此修復,在 context-manager 和函數調用用法中,sys.exc_info() 都將保持為空。先前,即使發生了預期的例外,sys.exc_info 也會包含 context manager 捕獲的例外。感謝 @MSeifert04 的報告和 PR。

  • 修復了對於已重寫但後來被 pytest.register_assert_rewrite 明確標記或隱式標記為外掛程式的模組,斷言重寫 hook 中的誤報警告 (#2005)。感謝 @RonnyPfannschmidt 的報告和 @nicoddemus 的 PR。

  • 在測試失敗時報告 teardown 輸出 (#442)。感謝 @matclab 的 PR。

  • 修復了生成的 xUnit XML 中的 teardown 錯誤訊息。感謝 @gdyuldin 的 PR。

  • 正確處理 multiprocessing 任務中的例外 (#1984)。感謝 @adborden 的報告和 @nicoddemus 的 PR。

  • 在測試完成後清理 unittest TestCase 物件 (#1649)。感謝 @d-b-w 的報告和 PR。

3.0.3 (2016-09-28)

  • parametrizeids 參數再次接受 Python 2 中的 unicode 字串 (#1905)。感謝 @philpep 的報告和 @nicoddemus 的 PR。

  • 現在,在開發模式 (pip install -e) 下,斷言將會為外掛程式重寫 (#1934)。感謝 @nicoddemus 的 PR。

  • 修復了 Jython 專案中的 pkg_resources 導入錯誤 (#1853)。感謝 @raquelalegre 的 PR。

  • 解決了 Python 3 中的 AttributeError: 'Module' object has no attribute '_obj' 例外 (#1944)。感謝 @axil 的 PR。

  • 解釋傳遞給 @fixture 宣告或 MetaFunc.parametrize() 呼叫的錯誤 scope 值。

  • 此版本包含 pluggy-0.4.0,它可以正確處理外掛程式中的 VersionConflict 錯誤 (#704)。感謝 @nicoddemus 的 PR。

3.0.2 (2016-09-01)

  • 改進了將非字串 id 傳遞給 pytest.mark.parametrize 時的錯誤訊息 (#1857)。感謝 @okken 的報告和 @nicoddemus 的 PR。

  • buffer 屬性新增至 stdin stub 類別 pytest.capture.DontReadFromInput。感謝 @joguSD 的 PR。

  • 修復了與 unicode 字串比較失敗時的 UnicodeEncodeError (#1864)。感謝 @AiOO 的 PR。

  • 當模組被考慮用於斷言重寫時,如果 pytest_plugins 被定義為字串 (而不是字串序列),現在可以正確處理。由於此錯誤,如果測試套件使用 pytest_plugins 載入內部外掛程式,則會重寫比必要更多的模組 (#1888)。感謝 @jaraco 的報告和 @nicoddemus 的 PR (#1891)。

  • 當使用啟用 --pdbunittest.TestCase 子類別執行測試時,不要調用 tearDown 和 cleanups。這允許對所有在其 tearDown 機制中具有重要邏輯的應用程式進行適當的事後除錯 (#1890)。感謝 @mbyt 的 PR。

  • 修復了在內部 doctest 外掛程式中使用已棄用的 getfuncargvalue 方法。感謝 @ViviCoder 的報告 (#1898)。

3.0.1 (2016-08-23)

  • 修復了在模組層級使用 importorskip 時的回歸錯誤 (#1822)。感謝 @jaraco@The-Compiler 的報告和 @nicoddemus 的 PR。

  • 修復了在同一次呼叫中,當 session fixture 與常規參數結合使用時的參數化 scope (#1832)。感謝 @The-Compiler 的報告,以及 @Kingdread@nicoddemus 的 PR。

  • 修復了在使用空的 ids 參數參數化測試或 fixture 時的內部錯誤 (#1849)。感謝 @OPpuolitaival 的報告和 @nicoddemus 的 PR。

  • 修復了在 zipfile 中嵌入 pytest 時執行的載入器錯誤。感謝 @mbachry 的 PR。

3.0.0 (2016-08-18)

不相容的變更

在此版本中進行了一些不相容的變更,目的是移除長期棄用的功能或變更現有行為,以使其更不令人意外/更有用。

  • Reinterpretation 模式現在已被移除。僅提供 plain 和 rewrite 模式,因此 --assert=reinterp 選項不再可用。這也意味著從外掛程式或 conftest.py 導入的檔案預設不會從改進的斷言中受益,您應該使用 pytest.register_assert_rewrite() 來顯式地為這些檔案啟用斷言重寫。感謝 @flub 的 PR。

  • 以下棄用的命令行選項已被移除

    • --genscript: 不再支援;

    • --no-assert: 請改用 --assert=plain

    • --nomagic: 請改用 --assert=plain

    • --report: 請改用 -r

    感謝 @RedBeardCode 的 PR (#1664)。

  • 外掛程式中的 ImportErrors 現在是致命錯誤,而不是發出 pytest 警告 (#1479)。感謝 @The-Compiler 的 PR。

  • 移除對 Python 3 版本 < 3.3 的支援程式碼 (#1627)。

  • 移除所有 py.test-X* entry points。版本化的、帶後綴的 entry points 從未記錄在案,並且是 virtualenv 時代之前的遺留物。這些 entry points 也在 wheels 中創建了損壞的 entry points,因此移除它們也消除了用戶的困惑來源 (#1632)。感謝 @obestwalter 的 PR。

  • 現在,當 pytest.skip() 用於裝飾測試函數時,會引發錯誤,而不是其原始意圖 (在測試函數內部命令式地跳過測試)。先前,此用法會導致整個模組被跳過 (#607)。感謝 @omarkohl 的完整 PR (#1519)。

  • 如果發生收集錯誤,則退出測試。一項民意調查顯示,大多數用戶在看到收集錯誤時無論如何都會按下 CTRL-C,因此 pytest 不妨將其設為預設行為 (#1421)。已新增 --continue-on-collection-errors 選項以恢復先前的行為。感謝 @olegpidsadnyi@omarkohl 的完整 PR (#1628)。

  • 將 pytest pdb 模組 (外掛程式) 重命名為 debugging,以避免與內建 pdb 模組衝突。

  • 當在運行時請求參數化的 fixture 時 (例如使用 request.getfixturevalue),引發有用的失敗訊息。先前,這些參數根本未定義,因此像 @pytest.fixture(params=[0, 1, 2]) 這樣裝飾的 fixture 只會運行一次 (#460)。感謝 @nikratio 的錯誤報告,以及 @RedBeardCode@tomviner 的 PR。

  • _pytest.monkeypatch.monkeypatch 類別已重命名為 _pytest.monkeypatch.MonkeyPatch,以使其不與 monkeypatch fixture 衝突。

  • --exitfirst / -x 現在可以被後續的 --maxfail=N 覆蓋,並且只是 --maxfail=1 的同義詞。

新功能

  • 支援 nose 風格的 __test__ 屬性在類別的方法上,包括 unittest 風格的類別。如果設定為 False,則不會收集測試。

  • 新的 doctest_namespace fixture,用於將名稱注入到 doctest 運行的命名空間中。感謝 @milliams 的完整 PR (#1428)。

  • 新的 --doctest-report 選項可用於在運行 (失敗) doctest 時更改 diff 的輸出格式 (實作 #1749)。感謝 @hartym 的 PR。

  • pytest.fixture 裝飾器的新 name 參數,允許為 fixture 自訂名稱 (以解決 funcarg-shadowing-fixture 問題)。感謝 @novas0x2a 的完整 PR (#1444)。

  • 新的 approx() 函數,用於在測試中輕鬆比較浮點數。感謝 @kalekundert 的完整 PR (#1441)。

  • 通過訪問內部 junitxml 外掛程式 (實驗性),可以在最終 xunit 輸出檔案中添加全域屬性。感謝 @tareqalayan 的完整 PR #1454)。

  • 新的 ExceptionInfo.match() 方法,用於在例外的字串表示形式上匹配正則表達式 (#372)。感謝 @omarkohl 的完整 PR (#1502)。

  • __tracebackhide__ 現在也可以設定為可調用物件,然後它可以決定是否根據傳遞給它的 ExceptionInfo 物件來過濾追溯。感謝 @The-Compiler 的完整 PR (#1526)。

  • 新的 pytest_make_parametrize_id(config, val) hook,外掛程式可以使用它為自訂類型提供友好的字串。感謝 @palaviv 的 PR。

  • capsyscapfd 現在有一個 disabled() context-manager 方法,可以用於在測試中暫時停用捕獲。感謝 @nicoddemus 的 PR。

  • 新的 cli 標誌 --fixtures-per-test: 顯示每個選定的測試項目正在使用的 fixture。預設顯示 fixture 的 doc 字串。如果與 -v 結合使用,還可以顯示 fixture 的定義位置。感謝 @hackebrot 的 PR。

  • 引入 pytest 命令作為推薦的 entry point。請注意,py.test 仍然有效,並且未計劃移除。關閉提案 #1629。感謝 @obestwalter@davehunt 的完整 PR (#1633)。

  • 新的 cli 標誌

    • --setup-plan: 執行正常收集並報告潛在的 setup 和 teardown,並且不執行任何 fixture 和測試;

    • --setup-only: 執行正常收集,執行 fixture 的 setup 和 teardown 並報告它們;

    • --setup-show: 執行正常測試執行,並額外顯示 fixture 的 setup 和 teardown;

    • --keep-duplicates: py.test 現在忽略命令行中給定的重複路徑。要保留先前的行為 (即通過在命令行中多次指定相同的測試可以多次運行),請傳遞 --keep-duplicates 參數 (#1609);

    感謝 @d6e@kvas-it@sallner@ioggstream@omarkohl 的 PR。

  • 新的 CLI 標誌 --override-ini/-o: 覆蓋 ini 檔案中的值。例如: "-o xfail_strict=True"。感謝 @blueyed@fengxx 的 PR。

  • 新的 hooks

    • pytest_fixture_setup(fixturedef, request): 執行 fixture setup;

    • pytest_fixture_post_finalizer(fixturedef): 在 fixture 的 finalizer 之後調用,並且可以訪問 fixture 的結果快取。

    感謝 @d6e@sallner

  • 對於測試為 tuple literal 的 asserts 發出警告。此類 asserts 永遠不會失敗,因為 tuple 始終為 truthy,並且通常是錯誤 (#1562)。感謝 @kvas-it 的 PR。

  • 允許傳遞自訂 debugger 類別 (例如 --pdbcls=IPython.core.debugger:Pdb)。感謝 @anntzer 的 PR。

變更

  • 外掛程式現在受益於斷言重寫。感謝 @sober7@nicoddemus@flub 的 PR。

  • 在非 strict 模式下,將 xpassed 測試的 report.outcome 更改為 "passed",在 strict 模式下更改為 "failed"。感謝 @hackebrot 的 PR (#1795) 和 @gprasad84 的報告 (#1546)。

  • 標記為 xfail(strict=False) (預設值) 的測試現在會在 JUnitXML 報告中顯示為通過的測試,而不是略過的測試。感謝 @hackebrot 的 PR (#1795)。

  • 在錯誤報告中高亮顯示檔案位置路徑,使其更容易複製/貼上。感謝 @suzaku 的 PR (#1778)。

  • 標記為 @pytest.fixture 的 Fixture 現在可以使用 yield 陳述式,就像那些標記為 @pytest.yield_fixture 裝飾器的 Fixture 一樣。此變更使 @pytest.yield_fixture 成為已棄用的項目,並使帶有 yield 陳述式的 @pytest.fixture 成為撰寫 teardown 程式碼的偏好方式 (#1461)。感謝 @csaftoiu 提出此問題,並感謝 @nicoddemus 的 PR。

  • 明確傳遞的 parametrize id 不會被逸出為 ascii (#1351)。感謝 @ceridwen 的 PR。

  • Fixture 現在會在測試函數中宣告未知 fixture 時顯示的錯誤訊息中排序。感謝 @nicoddemus 的 PR。

  • pytest_terminal_summary hook 現在接收測試會話的 exitstatus 作為引數。感謝 @blueyed 的 PR (#1809)。

  • Parametrize id 可以接受 None 作為特定的測試 id,在這種情況下,將使用該引數的自動產生 id。感謝 @palaviv 的完整 PR (#1468)。

  • xunit 樣式的 setup/teardown 方法 (setup_methodsetup_module 等) 的參數現在是選用的,可以省略。感謝 @okken 提出此問題,並感謝 @nicoddemus 的 PR。

  • 改進了在 parametrize 中出現重複 id 時的自動 id 產生選擇。感謝 @palaviv 的完整 PR (#1474)。

  • 現在預設會顯示 pytest 警告摘要。新增了一個新的旗標 --disable-pytest-warnings 以明確停用警告摘要 (#1668)。

  • 透過提醒使用者檢查測試模組/套件的名稱,使收集期間的 ImportError 更加明確 (#1426)。感謝 @omarkohl 的完整 PR (#1520)。

  • build/dist/ 新增至預設的 --norecursedirs 清單中。感謝 @mikofski 的報告,以及 @tomviner 的 PR (#1544)。

  • context manager 形式的 pytest.raises 接受自訂的 message,以便在未發生例外時引發。感謝 @palaviv 的完整 PR (#1616)。

  • conftest.py 檔案現在受益於 assertion rewriting;先前僅適用於測試模組。感謝 @flub@sober7@nicoddemus 的 PR (#1619)。

  • 沒有任何 doctest 的文字文件不再顯示為「略過」。感謝 @graingert 的報告和提供完整的 PR (#1580)。

  • 確保當在命令列上與 --pyargs 選項一起指定命名空間套件中的模組時,可以找到該模組。感謝 @taschini 的 PR (#1597)。

  • 在 assertion rewriting 期間始終包含完整的 assertion explanation。先前的行為是隱藏碰巧為 False 的子表示式,假設這是多餘的資訊。感謝 @bagerard 的報告 (#1503)。感謝 @davehunt@tomviner 的 PR。

  • OptionGroup.addoption() 現在檢查選項名稱是否已新增過,以便更輕鬆地追蹤像 #1618 之類的問題。在此之前,您只會在稍後從 argparse 程式庫收到例外,但沒有提供關於重複新增選項的實際原因的線索。

  • 基於 yield 的測試被視為已棄用,並將在 pytest-4.0 中移除。感謝 @nicoddemus 的 PR。

  • setup.cfg 檔案中的 [pytest] 區段現在應命名為 [tool:pytest],以避免與其他 distutils 命令衝突 (請參閱 #567)。pytest.initox.ini 檔案中的 [pytest] 區段受到支援且未變更。感謝 @nicoddemus 的 PR。

  • 使用 pytest_funcarg__ 前綴宣告 fixture 被視為已棄用,並將在 pytest-4.0 中移除 (#1684)。感謝 @nicoddemus 的 PR。

  • 將命令列字串傳遞給 pytest.main() 被視為已棄用,並計劃在 pytest-4.0 中移除。建議改為傳遞引數清單 (#1723)。

  • getfuncargvalue 重新命名為 getfixturevaluegetfuncargvalue 仍然存在,但現在被視為已棄用。感謝 @RedBeardCode@tomviner 的 PR (#1626)。

  • optparse 類型用法現在會觸發 DeprecationWarning (#1740)。

  • optparse 向後相容性支援 float/complex 類型 (#457)。

  • 改進了用於判斷 rootdir 的邏輯,僅考慮有效的路徑,這修正了許多問題:#1594#1435#1471。根據目前的行為更新了文件。感謝 @blueyed@davehunt@matthiasha 的 PR。

  • 始終包含完整的 assertion explanation。先前的行為是隱藏碰巧為 False 的子表示式,假設這是多餘的資訊。感謝 @bagerard 的報告 (#1503)。感謝 @davehunt@tomviner 的 PR。

  • 在未使用 parametrize 變數的情況下,提供更好的訊息 (請參閱 #1539)。感謝 @tramwaj29 的 PR。

  • 更新了文件字串,使其具有更統一的樣式。

  • 在啟動期間為 pytest.exit(msg) 新增 stderr 寫入。先前訊息從未顯示。感謝 @BeyondEvil 的報告 #1210。感謝 @jgsonesen 和 @tomviner 的 PR。

  • 不再顯示不正確的測試取消選取原因 (#1372)。感謝 @ronnypfannschmidt 的 PR。

  • --resultlog 命令列選項已被棄用:它很少使用,並且有更現代且更好的替代方案 (請參閱 #830)。感謝 @nicoddemus 的 PR。

  • 改進 fixture 查閱錯誤的錯誤訊息:在第一行新增 'E',其餘行新增 '>'。修正了 #717。感謝 @blueyed 的報告和 PR、@eolo999 的初始 PR,以及 @tomviner 在 EuroPython2016 sprint 期間的指導。

錯誤修正

  • Parametrize 現在可以正確處理重複的測試 id。

  • 修正 teardown_method() 缺少 method 引數時的內部錯誤問題 (#1605)。

  • 修正在測試期間刪除目前工作目錄 (CWD) 時的例外視覺化問題 (#1235)。感謝 @bukzor 的報告。由 @marscher 提供 PR。

  • 改進帶括號的邏輯表示式的測試輸出 (#925)。感謝 @DRMacIver 的報告,以及 @RedBeardCode 的 PR。

  • 為以換行符號結尾的字串建立正確的差異 (#1553)。感謝 @Vogtinator 的報告,以及 @RedBeardCode@tomviner 的 PR。

  • ConftestImportFailure 現在顯示追蹤記錄,使其更容易識別 conftest.py 檔案中的錯誤 (#1516)。感謝 @txomon 的 PR。

  • 沒有任何 doctest 的文字文件不再顯示為「略過」。感謝 @graingert 的報告和提供完整的 PR (#1580)。

  • 修正了具有自訂 __new__ 方法的類別的收集。修正了 #1579。感謝 @Stranger6667 的 PR。

  • 修正了 metafunc.parametrize 內部的範圍覆寫 (#634)。感謝 @Stranger6667 的 PR。

  • 修正了 junit xml 輸出中的測試總數 (#1798)。感謝 @cboelsen 的 PR。

  • 修正了 request.node.warn 中的行號的 off-by-one 錯誤。感謝 @blueyed 的 PR。

2.9.2 (2016-05-31)

錯誤修正

  • 修正 #510:略過一個 parameterize 維度為空的測試。感謝 Alex Stapleton 的報告,以及 @RonnyPfannschmidt 的 PR

  • 修正 Xfail 無法與 condition 關鍵字引數搭配運作的問題。感謝 @astraw38 報告此問題 (#1496),以及 @tomviner 的 PR (#1524)。

  • 修正在 pytest.main("-c your_absolute_path") 中使用絕對路徑放置自訂設定檔時的 win32 路徑問題。

  • 修正當引發的錯誤類別未意識到 unicode/encoded bytes 時的最大遞迴深度偵測。感謝 @prusse-martin 的 PR (#1506)。

  • 修正 strict 模式下使用的 pytest.mark.skip 標記。感謝 @pquentin 的 PR,以及 @RonnyPfannschmidt 展示如何修正錯誤。

  • 對文件進行了細微的改進和修正。感謝 @omarkohl 的 PR。

  • 修正 --fixtures 以顯示所有 fixture 定義,而不是每個 fixture 名稱僅顯示一個。感謝 @hackebrot 的 PR。

2.9.1 (2016-03-17)

錯誤修正

  • 改進外掛程式載入失敗時的錯誤訊息。感謝 @nicoddemus 的 PR。

  • 修正 (#1178):帶有非 ascii 字元的 pytest.fail 會引發內部 pytest 錯誤。感謝 @nicoddemus 的 PR。

  • 修正 (#469):當參數 ID 包含 :: 時,junit 會錯誤地剖析 report.nodeid。感謝 @tomviner 的 PR (#1431)。

  • 修正 (#578):在失敗點包含非 ascii 行的 SyntaxError 會產生內部 py.test 錯誤。感謝 @asottile 的報告,以及 @nicoddemus 的 PR。

  • 修正 (#1437):當將位元組字串 regex 模式傳遞給 parameterize 時,嘗試將其解碼為 utf-8,並忽略錯誤。

  • 修正 (#649):無法在命令列上指定參數化的測試節點以執行。

  • 修正 (#138):針對 python 3.3+ 鏈結例外提供更好的報告

2.9.0 (2016-02-29)

新功能

  • 新的 pytest.mark.skip 標記,無條件略過標記的測試。感謝 @MichaelAquilina 的完整 PR (#1040)。

  • --doctest-glob 現在可以在命令列中多次傳遞。感謝 @jab@nicoddemus 的 PR。

  • 新的 -rp-rP 報告選項分別提供通過測試的摘要和完整輸出。感謝 @codewarrior0 的 PR。

  • pytest.mark.xfail 現在有一個 strict 選項,它使 XPASS 測試在測試套件中失敗 (預設為 False)。還有一個 xfail_strict ini 選項可用於專案層級的組態設定。感謝 @rabbbit 的請求,以及 @nicoddemus 的 PR (#1355)。

  • Parser.addini 現在支援 bool 類型的選項。感謝 @nicoddemus 的 PR。

  • 新的 ALLOW_BYTES doctest 選項。這會從 doctest 輸出中的位元組字串中剝離 b 前綴 (類似於 ALLOW_UNICODE)。感謝 @jaraco 的請求,以及 @nicoddemus 的 PR (#1287)。

  • KeyboardInterrupt 上提供提示,使用 --fulltrace 選項來顯示錯誤。修正了 #1366。感謝 @hpk42 的報告,以及 @RonnyPfannschmidt 的 PR。

  • 在取得例外來源位置時,捕捉 IndexError 例外。修正了針對動態產生的程式碼 (fixture 和測試) 的 pytest 內部錯誤,其中來源行是有意偽造的。

變更

  • 重要py.code 已合併到 pytest 儲存庫中,作為 pytest._code。做出此決策是因為 py.codepytest 之外的用途非常少,而且它位於不同的儲存庫中,使得及時修正其程式碼中的錯誤變得困難。團隊希望透過此舉能夠更好地重構並改進該程式碼。此變更不應影響使用者,但讓使用者知道他們是否遇到任何奇怪的行為會很有用。

    請記住,pytest._code 的程式碼是私有的實驗性的,因此您絕對不應明確匯入它!

    請注意,原始的 py.code 仍然在 pylib 中提供。

  • pytest_enter_pdb 現在可以選擇性地接收 pytest config 物件。感謝 @nicoddemus 的 PR。

  • 移除了 Python 2.5 或更低版本的程式碼和文件,包括移除已過時的 _pytest.assertion.oldinterpret 模組。感謝 @nicoddemus 的 PR (#1226)。

  • 當在環境中找到 CIBUILD_NUMBER 時,比較現在始終會完整顯示,即使未使用 -vv 也一樣。感謝 @The-Compiler 的 PR。

  • --lf--ff 現在支援長名稱:分別為 --last-failed--failed-first。感謝 @MichaelAquilina 的 PR。

  • 將預期的例外新增至 pytest.raises 失敗訊息。

  • 只有在終端機中時,收集才會顯示進度 ("collecting X items")。這避免了在使用 --color=yes 以在 CI 整合系統中取得色彩時,輸出變得雜亂 (#1397)。

錯誤修正

  • -s-c 選項現在應在 xdist 下運作;Config.fromdictargs 現在更忠實地表示其輸入。感謝 @bukzor 的完整 PR (#680)。

  • 修正 (#1290):在 assertion rewriting 中支援 Python 3.5 的 @ 運算子。感謝 @Shinkenjoe 提供的包含測試案例的報告,以及 @tomviner 的 PR。

  • 修正格式化 utf-8 explanation 訊息 (#1379)。感謝 @biern 的 PR。

  • 修正 追蹤記錄樣式文件 以描述所有可用的選項 (auto/long/short/line/native/no),其中 auto 是自 v2.6 以來的預設值。感謝 @hackebrot 的 PR。

  • 修正 (#1422):junit record_xml_property 不允許使用相同名稱的多個記錄。

2.8.7 (2016-01-24)

  • 修正 #1338:針對 monkeypatch 使用可預測的物件解析

2.8.6 (2016-01-21)

  • 修正 #1259:允許在 junitxml 中使用重複的節點 ID,這是一個迴歸錯誤,導致 pytest-pep8 + pytest-flakes 等外掛程式組合失敗

  • 使用啟用標準 I/O 捕捉的 --pdb 時,針對 pyreadline 中發生的例外提供解決方案。感謝 Erik M. Bray 的 PR。

  • 修正 #900:在 monkeypatch 呼叫的目標引發 ImportError 的情況下,提供更好的錯誤訊息。

  • 修正 #1292:monkeypatch 呼叫 (setattr、setenv 等) 現在為 O(1)。感謝 David R. MacIver 的報告,以及 Bruno Oliveira 的 PR。

  • 修正 #1223:當使用 --pdb 而不是丟棄時,捕捉到的 stdout 和 stderr 現在會在進入 pdb 之前正確顯示。感謝 Cal Leeming 的 PR。

  • 修正 #1305:在 pytest_terminal_summary 期間發出的 pytest 警告現在可以正確顯示。感謝 Ionel Maries Cristian 的報告,以及 Bruno Oliveira 的 PR。

  • 修正 #628:修正 doctest 包含 unicode 時的內部 UnicodeDecodeError。感謝 Jason R. Coombs 的報告,以及 Bruno Oliveira 的 PR。

  • 修正 #1334:在設定錯誤時,將捕捉到的 stdout 新增至 jUnit XML 報告。感謝 Georgy Dyuldin 的 PR。

2.8.5 (2015-12-11)

  • 修正 #1243:修正了在收集期間注入的類別屬性可能會破壞 pytest 的問題。由 Alexei Kozlenok 提供 PR,感謝 Ronny Pfannschmidt 和 Bruno Oliveira 的審查和協助。

  • 修正 #1074:預先計算 junitxml 區塊,而不是將整個樹狀結構儲存在物件中。感謝 Bruno Oliveira 的報告,以及 Ronny Pfannschmidt 的 PR

  • 修正 #1238:修正 pytest.deprecated_call() 接收多個引數 (在 2.8.4 中引入的迴歸錯誤)。感謝 Alex Gaynor 的報告,以及 Bruno Oliveira 的 PR。

2.8.4 (2015-12-06)

  • 修正 #1190:當已棄用的函數已被同一個模組中的另一個測試呼叫時,deprecated_call() 現在可以運作。感謝 Mikhail Chernykh 的報告,以及 Bruno Oliveira 的 PR。

  • 修正 #1198:--pastebin 選項現在可在 Python 3 上運作。感謝 Mehdy Khoshnoody 的 PR。

  • 修正 #1219:當捕捉到的輸出包含非 ascii 字元時,--pastebin 現在可以正確運作。感謝 Bruno Oliveira 的 PR。

  • 修正 #1204:另一個在使用惡意 __getattr__() 進行收集時發生的錯誤。感謝 Florian Bruhin 的 PR。

  • 修正未執行任何測試時列印的摘要。感謝 Florian Bruhin 的 PR。

  • 修正 #1185 - 確保 MANIFEST.in 與應放入 sdist 的內容完全相符

  • 一些關於良好實務的文件現代化。感謝 Bruno Oliveira 的 PR。

2.8.3 (2015-11-18)

  • 修正 #1169:將 __name__ 屬性新增至 TestCaseFunction 中的 testcase,以支援函數和方法上的 @unittest.skip 裝飾器。感謝 Lee Kamentsky 的 PR。

  • 修正 #1035:如果測試模組層級物件具有 __getattr__(),則收集測試。感謝 Suor 的報告,以及 Bruno Oliveira / Tom Viner 的 PR。

  • 修正 #331:如果無法正確報告測試的失敗,則不要收集測試,例如,它們是類別的可呼叫執行個體。

  • 修正 #1133:修正在篩選追蹤記錄時,如果其中一個項目屬於不再可用的檔案,則會發生的內部錯誤。感謝 Bruno Oliveira 的 PR。

  • 增強功能,以紅色突出顯示失敗測試的名稱,使其在輸出中更為突出。感謝 Gabriel Reis 的 PR。

  • 在文件中新增更多講座

  • 擴充關於 –ignore cli 選項的文件

  • 將 pytest-runner 用於 setuptools 整合

  • 針對與 OS X El Capitan 系統完整性保護互動的細微修正 (感謝 Florian)

2.8.2 (2015-10-07)

  • 修正 #1085:在 Python 2 中將編碼的位元組字串傳遞給 pytest.parametrize 時,正確處理編碼錯誤。感謝 Themanwithoutaplan 的報告,以及 Bruno Oliveira 的 PR。

  • 修正 #1087:在 Python 3 中將空白位元組字串傳遞給 pytest.parametrize 時,處理 SystemError。感謝 Paul Kehrer 的報告,以及 Bruno Oliveira 的 PR。

  • 修正 #995:修正在篩選追蹤記錄時,如果其中一個項目是由 exec() 陳述式產生的,則會發生的內部錯誤。感謝 Daniel Hahler、Ashley C Straw、Philippe Gauthier 和 Pavel Savchenko 的貢獻,以及 Bruno Oliveira 的 PR。

  • 修正 #1100 和 #1057:使用 autouse fixture 和 doctest 模組時發生的錯誤。感謝 Sergey B Kirpichev 和 Vital Kudzelka 的貢獻,以及 Bruno Oliveira 的 PR。

2.8.1 (2015-09-29)

  • 修正 #1034:在 addhook 中的 pytest_logwarning 呼叫中新增遺失的節點 ID。感謝 Simon Gomizelj 的 PR。

  • 「deprecated_call」現在僅在 DeprecationWarning 或 PendingDeprecationWarning 的情況下才會滿足。在 2.8.0 之前,它接受任何警告,而 2.8.0 使其僅接受 DeprecationWarning (但不接受 PendingDeprecationWarning)。感謝 Alex Gaynor 提出的問題,以及 Eric Hunsberger 的 PR。

  • 修正問題 #1073:避免在外掛程式物件上呼叫 __getattr__。這修正了與 pytest-django 的不相容性。感謝 Andreas Pelme、Bruno Oliveira 和 Ronny Pfannschmidt 的貢獻,以及 Holger Krekel 的修正。

  • 修正問題 #704:更優雅地處理外掛程式載入期間的 versionconflict。感謝 Bruno Oliveira 的 PR。

  • 修正問題 #1064:「」–junitxml」 在與「pytest-xdist」外掛程式一起使用時的迴歸錯誤,測試報告被指派給錯誤的測試。感謝 Daniel Grunwald 的報告,以及 Bruno Oliveira 的 PR。

  • (實驗性) 採用更多 SEMVER 樣式版本控制,並變更 git 儲存庫中 master 分支的意義:「master」分支現在保留錯誤修正,目標用於微發行版本。「features」分支將僅隨附次要或主要 pytest 版本發行。

  • 透過移除對 distutils 的文件參考來修正問題 #766。感謝 Russel Winder。

  • 修正問題 #1030:現在會逸出位元組字串以產生項目節點 ID,使其始終可序列化。感謝 Andy Freeland 的報告,以及 Bruno Oliveira 的 PR。

  • Python 2:如果 unicode 參數化值可轉換為 ascii,則其 ascii 表示法會用於節點 ID。

  • 修正問題 #411:將 __eq__ 方法新增至 assertion 比較範例。感謝 Ben Webb。

  • 修正問題 #653:deprecated_call 可以用作 context manager。

  • 修正問題 877:正確處理帶有非 ascii repr 的 assertion explanation。感謝 Mathieu Agopian 的報告,以及 Ronny Pfannschmidt 的 PR。

  • 修正問題 1029:將寫入快取值時的錯誤轉換為 pytest-warnings

2.8.0 (2015-09-18)

  • 新的 --lf-ff 選項,用於僅從上次執行中執行上次失敗的測試或「先執行失敗的測試」。此功能是透過將先前外部的 pytest-cache 外掛程式移植到 pytest 核心中來提供的。向後不相容:如果您使用 pytest-cache 的功能在測試執行之間持續保存資料,請注意我們不再序列化集合。感謝 Ronny Pfannschmidt 完成大部分合併工作。

  • "-r" 選項現在接受 "a" 以包含所有可能的報告,類似於明確傳遞 "fEsxXw" (issue960)。感謝 Abhijeet Kasurde 的 PR。

  • 透過引入版本特定的檢查協助程式來避免 python3.5 棄用警告,感謝 Michael Droettboom。

  • 修正 issue562:@nose.tools.istest 現在完全受到尊重。

  • 修正 issue934:當字串比較失敗且差異太大而無法在未傳遞 -vv 的情況下顯示時,仍然顯示差異的幾行。感謝 Florian Bruhin 的報告,以及 Bruno Oliveira 的 PR。

  • 修正 issue736:修正在與參數化標記結合使用時,fixture 參數會被捨棄的錯誤。感謝 Markus Unterwaditzer 的 PR。

  • 修正 issue710:引入 ALLOW_UNICODE doctest 選項:啟用後,會從預期的 doctest 輸出中的 unicode 字串中剝離 u 前綴。這允許使用 unicode 的 doctest 在 Python 2 和 3 中不變地執行。感謝 Jason R. Coombs 的報告,以及 Bruno Oliveira 的 PR。

  • parametrize 現在也為 enum、regex 和類別物件 (而不是類別執行個體) 產生有意義的測試 ID。感謝 Florian Bruhin 的 PR。

  • 新增 'warns' 以 assertion 警告是否已擲回 (類似於 'raises')。感謝 Eric Hunsberger 的 PR。

  • 修正 issue683:不要套用已套用的標記。感謝 ojake 的 PR。

  • 更好地處理捕捉失敗,以便更少的例外遺失到 /dev/null。感謝 David Szotten 的 PR。

  • 修正 issue730:棄用並警告關於 –genscript 選項。感謝 Ronny Pfannschmidt 的報告,以及 Christian Pommranz 的 PR。

  • 修正 issue751:如果使用 id 參數化類別且該類別具有兩個或多個測試方法,則會發生多個 parametrize 與 id 相關的錯誤。感謝 Sergey Chipiga 的報告,以及 Jan Bednarik 的 PR。

  • 修復 issue82:預設避免從 setup.cfg/pytest.ini/tox.ini 檔案及向上層目錄載入 conftest 檔案 (–confcutdir 仍然可以設定來覆寫此行為)。感謝 Bruno Oliveira 的 PR。

  • 修復 issue768:在 python 模組中找到的文件字串未設定 session fixtures。感謝 Jason R. Coombs 的回報以及 Bruno Oliveira 的 PR。

  • 新增了 tmpdir_factory,一個 session 作用域的 fixture,可用於在基礎暫存目錄下建立目錄。先前此物件是以 config 物件的 _tmpdirhandler 屬性安裝的,但現在它是官方 API 的一部分,使用 config._tmpdirhandler 已被棄用。感謝 Bruno Oliveira 的 PR。

  • 修復 issue808:pytest 的內部斷言重寫 hook 現在實作了選用的 PEP 302 get_data API,因此測試可以存取與它們相鄰的資料檔案。感謝 xmo-odoo 的請求與範例,以及 Bruno Oliveira 的 PR。

  • rootdir 和 inifile 現在會在用法錯誤期間顯示,以協助使用者診斷問題,例如意外的 ini 檔案,這些檔案新增了 pytest 拾取的未知選項。感謝 Pavel Savchenko 在 #821 中提出此問題,以及 Bruno Oliveira 的 PR。

  • 摘要列現在對於警告情況會以黃色著色,例如:所有測試都被跳過或 xpass/xfailed,或根本沒有執行任何測試(這是 issue500 的部分修復)。

  • 修復 issue812:在完全沒有執行任何測試的情況下,pytest 現在會以狀態碼 5 退出,例如在命令列中給定的目錄不包含任何測試,或是由於命令列選項篩選掉所有測試(例如 -k)。感謝 Eric Siegerman (issue812) 以及 Bruno Oliveira 的 PR。

  • 摘要列現在對於警告情況會以黃色著色,例如:所有測試都被跳過或 xpass/xfailed,或根本沒有執行任何測試(與 issue500 相關)。感謝 Eric Siegerman。

  • 新的 testpaths ini 選項:當從根目錄執行 pytest 時,要搜尋測試的目錄列表。當專案針對測試有明確指定的目錄時,這可以用於加速測試收集,通常比為所有不包含測試的目錄配置 norecursedirs 更實用。感謝 Adrian 的想法 (#694) 以及 Bruno Oliveira 的 PR。

  • 修復 issue713:doctest 失敗的 JUnit XML 報告。感謝 Punyashloka Biswal。

  • 修復 issue970:內部 pytest 警告現在在終端機中顯示為 “pytest-warnings” 而不是 “warnings”,以便使用者清楚知道這些警告來自 pytest 而不是內建的 “warnings” 模組。感謝 Bruno Oliveira。

  • 在 junitxml 測試持續時間中包含 setup 和 teardown。感謝 Janne Vanhala。

  • 修復 issue735:Python 3.4+ debug 版本上的斷言失敗

  • 新的選項 --import-mode 允許變更測試模組匯入行為為附加到 sys.path 而不是前置。即使受測套件具有相同的匯入根,這也能更好地允許針對已安裝版本的套件執行測試模組。在這個範例中

    testing/__init__.py
    testing/test_pkg_under_test.py
    pkg_under_test/
    

    當使用 --import-mode=append 時,測試將針對已安裝版本的 pkg_under_test 執行,而預設情況下它們總是會選取本機版本。感謝 Holger Krekel。

  • pytester:新增方法 TmpTestdir.delete_loaded_modules(),並從 inline_run() 呼叫它,以允許重新載入暫存模組。感謝 Eduardo Schettino。

  • 內部重構 pluginmanager API 和程式碼,以便在 pytest 不可知且相當簡單的 pluginmanager 與 PytestPluginManager 之間有明確的區別,PytestPluginManager 新增了許多行為,其中包括處理本機 conftest 檔案。就文件化的方法而言,這是一個向後相容的變更,但它仍然可能會破壞依賴細節(例如 pluginmanager.add_shutdown() API)的第三方外掛程式。感謝 Holger Krekel。

  • 外掛程式管理:引入 pytest.hookimplpytest.hookspec 裝飾器,用於設定 impl/spec 特定參數。這取代了先前已棄用的 pytest.mark 用法,pytest.mark 僅用於包含測試函數的標記。

  • 撰寫/精進「撰寫外掛程式」的文件,現在這些文件有自己的頁面,並與「使用/安裝外掛程式」頁面分開。

  • 修復 issue732:正確地從任何 hook 呼叫點取消註冊外掛程式,允許在測試執行期間擁有暫存外掛程式。

  • 棄用並警告 hook 實作中的 __multicall__ 引數。改用 pytest-2.7 已引入的 hookwrapper 機制。

  • 透過預設使用 inprocess 測試,大幅加速 pytest 自身的測試套件(testrun 可以使用 –runpytest=subprocess 修改,以便在許多地方建立子程序)。在測試中執行 pytest 的主要 API 是 “runpytest()” 或 “runpytest_subprocess” 和 “runpytest_inprocess”(如果您需要特定的執行測試方式)。在所有情況下,您都會得到 RunResult,但 inprocess 版本也會有一個 “reprec” 屬性,其中包含記錄的事件/報告。

  • 修復 monkeypatch.setattr(“x.y”, raising=False) 在 “y” 不是預先存在的屬性時實際上不會引發錯誤。感謝 Florian Bruhin。

  • 修復 issue741:使 testdir.run 的執行輸出可複製/貼上。感謝 Bruno Oliveira。

  • 新增一個新的 --noconftest 引數,它會忽略所有 conftest.py 檔案。

  • fileline 屬性新增到 JUnit-XML 輸出。

  • 修復 issue890:將所有文件檔案的副檔名從 txt 變更為 rst。感謝 Abhijeet 的 PR。

  • 修復 issue714:新增在特定 argnames 上套用 indirect=True 參數的功能。感謝 Elizaveta239。

  • 修復 issue890:將所有文件檔案的副檔名從 txt 變更為 rst。感謝 Abhijeet 的 PR。

  • 修復 issue957:“# doctest: SKIP” 選項現在會將 doctest 註冊為 SKIPPED 而不是 PASSED。感謝 Thomas Grainger 的報告以及 Bruno Oliveira 的 PR。

  • issue951:新增新的 record_xml_property fixture,支援記錄 XML 輸出上的額外資訊。感謝 David Diaz 的 PR。

  • issue949:普通選項(例如 -s-v 等)之後的路徑現在會正確地用於探索 rootdirini 檔案。感謝 Peter Lauri 的報告以及 Bruno Oliveira 的 PR。

2.7.3 (2015-09-15)

  • 允許在 importorskip 中使用 ‘dev’、‘rc’ 或其他非整數版本字串。感謝 Eric Hunsberger 的 PR。

  • 修復 issue856:在所有輸出中考量 –color 參數(例如 –fixtures)。感謝 Barney Gale 的報告以及 Bruno Oliveira 的 PR。

  • 修復 issue855:將 str 物件作為 plugins 引數傳遞給 pytest.main 現在會被解釋為要匯入並註冊為外掛程式的模組名稱,而不是無聲無息地沒有效果。感謝 xmo-odoo 的報告以及 Bruno Oliveira 的 PR。

  • 修復 issue744:修復 Python 3.5+ 中 ast.Call 的變更。感謝 Guido van Rossum、Matthias Bussonnier、Stefan Zimmermann 和 Thomas Kluyver。

  • 修復 issue842:在類別中套用標記不再將此標記傳播到也具有標記的超類別。感謝 xmo-odoo 的報告以及 Bruno Oliveira 的 PR。

  • 在呼叫 pytest.deprecated_call 後保留警告函數。感謝 Pieter Mulder 的 PR。

  • 修復 issue854:定義為 unittest.TestCase 子類別的類別成員的 autouse yield_fixtures 現在可以如預期般運作。感謝 xmo-odoo 的報告以及 Bruno Oliveira 的 PR。

  • 修復 issue833:–fixtures 現在會顯示收集的測試檔案的所有 fixtures,而不僅僅是第一個檔案上宣告的 fixtures。感謝 Florian Bruhin 的報告以及 Bruno Oliveira 的 PR。

  • 修復 issue863:當使用多個標記時,跳過的測試現在會報告正確的原因(當滿足 skip/xfail 條件時)。感謝 Raphael Pierzina 的報告以及 Bruno Oliveira 的 PR。

  • 最佳化 tmpdir fixture 初始化,這應使測試 session 更快(特別是在使用 pytest-xdist 時)。唯一可見的效果是,現在 pytest 在 $TEMP 目錄中使用子目錄來放置此 fixture 建立的所有目錄(預設為 $TEMP/pytest-$USER)。感謝 Bruno Oliveira 的 PR。

2.7.2 (2015-06-23)

  • 修復 issue767:pytest.raises value 屬性在 Python 2.6 上不包含例外實例。感謝 Eric Siegerman 提供測試案例,以及 Bruno Oliveira 的 PR。

  • 自動為 junitxml 和結果記錄建立目錄。感謝 Aron Curzon。

  • 修復 issue713:doctest 失敗的 JUnit XML 報告。感謝 Punyashloka Biswal。

  • 修復 issue735:Python 3.4+ debug 版本上的斷言失敗。感謝 Benjamin Peterson。

  • 修復 issue114:skipif 標記報告給內部跳過外掛程式;感謝 Floris Bruynooghe 的報告以及 Bruno Oliveira 的 PR。

  • 修復 issue748:unittest.SkipTest 報告給內部 pytest unittest 外掛程式。感謝 Thomas De Schampheleire 的報告以及 Bruno Oliveira 的 PR。

  • 修復 issue718:無法在 python 2 中建立包含不可排序元素的集合的表示。感謝 Edison Gustavo Muenz。

  • 修復 issue756、修復 issue752(以及類似問題):依賴於 py-1.4.29,它具有用於 traceback 生成的精細演算法。

2.7.1 (2015-05-19)

  • 修復 issue731:在摺疊 False 解釋時,不要被物件的 repr 中可能存在且不平衡的大括號混淆。感謝 Carl Meyer 的報告和測試案例。

  • 修復 issue553:正確處理 FixtureLookupError 中 inspect.getsourcelines 的失敗,這會導致內部錯誤,混淆原始問題。感謝 talljosh 的初始診斷/修補程式,以及 Bruno Oliveira 的最終修補程式。

  • 修復 issue660:獨立於 fixture 引數的順序,正確報告 scope-mismatch-access 錯誤。並避免 pytest 內部 traceback,它不會向使用者提供資訊。感謝 Holger Krekel。

  • 簡化並記錄發布流程。此外,所有版本(在 setup.py 和文件生成中)現在都從 _pytest/__init__.py 讀取。感謝 Holger Krekel。

  • 修復文件以移除 yield-fixtures 是實驗性的概念。它們將會繼續存在 :) 感謝 Bruno Oliveira。

  • 透過使用需求的环境標記來支援建置 wheels。感謝 Ionel Maries Cristian。

  • 修復了 2.6.4 的迴歸問題,例如在測試引發 SystemExit 時,遺失 stdout 捕獲列印。感謝 Holger Krekel。

  • 重新引入 pytester 外掛程式的 _pytest fixture,pytest-xdist 至少會用到它。

2.7.0 (2015-03-26)

  • 修復 issue435:使 reload() 在斷言重寫處於活動狀態時可以運作。感謝 Daniel Hahler。

  • 修復 issue616:conftest.py 檔案及其包含的 fixtures 現在會正確地考量可見性,獨立於確切的目前工作目錄和使用的測試引數。非常感謝 Eric Siegerman 及其 PR235,其中包含 conftest 可見性的系統測試,現在已通過。此變更還引入了 rootdir 的概念,它作為新的 pytest 標頭列印,並記錄在 pytest 自訂網頁中。

  • 變更「轉移」測試的報告,即在一個檔案中收集但在另一個檔案中實際來自的測試(例如,當測試類別中的測試來自不同檔案中的基底類別時)。我們現在顯示 nodeid,並透過後綴指示另一個檔案。

  • 新增透過環境變數 PYTEST_ADDOPTS 設定命令列選項的功能。

  • 新增關於 bitbucket 和 github 上新的 pytest-dev 團隊的文件。請參閱 https://pytest.dev.org.tw/en/stable/contributing.html 。感謝 Anatoly 推動和在此方面的初步工作。

  • 修復 issue650:新的選項 --doctest-ignore-import-errors,它會將 doctest 中的匯入錯誤轉換為跳過。感謝 Charles Cloud 的完整 PR。

  • 修復 issue655:解決導致 python2/3 將 sys.exc_info 洩漏到 fixtures/tests 中的不同方式,導致第三方程式碼失敗

  • 修復 issue615:斷言重寫在格式化布林運算時未正確逸出 % 符號,這會在將布林值與模數運算子混合時導致問題。感謝 Tom Viner 的報告、分類和修復。

  • 實作 issue351:新增將 parametrize ids 指定為可呼叫物件以產生自訂測試 id 的功能。感謝 Brianna Laugher 的想法和實作。

  • 引入並記錄新的 hookwrapper 機制,對於想要為了自身目的包裝特定 hook 的執行的外掛程式很有用。這取代了未記錄的 __multicall__ 協定,pytest 自身和一些外部外掛程式使用它。請注意,pytest-2.8 計劃放棄支援舊的 __multicall__,而僅支援 hookwrapper 協定。

  • 大幅加速外掛程式 hook 的調用

  • 在內建 pytest 外掛程式中使用 hookwrapper 機制。

  • 為 doctest 標誌新增 doctest ini 選項,感謝 Holger Peters。

  • 在文件中新增註解,如果您想要標記參數且參數是可呼叫物件,您也需要傳入原因以將其與「裝飾器」案例區分開來。感謝 Tom Viner。

  • “python_classes” 和 “python_functions” 選項現在支援用於測試探索的 glob 模式,如 issue600 中所討論的。感謝 Ldiary Translations。

  • 允許使用非參數化的 fixtures 覆寫參數化的 fixtures,反之亦然 (bubenkoff)。

  • 修復 issue463:針對 ‘parameterize’ 拼寫錯誤引發特定錯誤 (pfctdayelise)。

  • 在失敗時,會設定 sys.last_valuesys.last_typesys.last_traceback,以便使用者可以透過事後偵錯來檢查錯誤 (almarklein)。

2.6.4 (2014-10-24)

  • 透過使用 ndiff 和 pprint,改進關於可迭代物件的斷言失敗報告。

  • 從來源樹中移除過時的日文文件。

  • 關於 “pytest_addhooks” hook 的文件。感謝 Bruno Oliveira。

  • 更新外掛程式索引文件。感謝 Bruno Oliveira。

  • 修復 issue557:使用 “-k” 時,我們僅允許舊樣式 “-” 用於字串開頭的否定,即使這樣也已棄用。請改用 “not”。這應該允許選取參數化的測試,其中 “-” 出現在參數中。

  • 修復 issue604:逸出斷言訊息中的 % 字元。

  • 修復 issue620:在 –genscript 目標中新增關於二進位 blob 意義的說明。感謝 Dinu Gherman。

  • 修復 issue614:修復 pastebin 支援。

  • 修復 issue620:在 –genscript 目標中新增關於二進位 blob 意義的說明。感謝 Dinu Gherman。

  • 修復 issue614:修復 pastebin 支援。

2.6.3 (2014-09-24)

  • 修復 issue575:xunit-xml 將收集錯誤報告為失敗而不是錯誤,感謝 Oleg Sinyavskiy。

  • 修復 issue582:修復 setuptools 範例,感謝 Laszlo Papp 和 Ronny Pfannschmidt。

  • 修復在 pickling capture.EncodedFile 時的無限遞迴錯誤,感謝 Uwe Schmitt。

  • 修復 issue589:修復在顯示例外時與 numpy 和其他程式庫的不良互動。檢查精確的「超出最大遞迴深度」例外,而不是假設任何 RuntimeError 都是該例外(在 py dep 中實作)。感謝 Charles Cloud 分析此問題。

  • 修復與 conftest 相關的 fixture 可見性問題:當在測試套件外部的 CWD 中執行時,pytest 會錯誤地進行 fixture 探索。感謝 Wolfgang Schnerring 找出可重現的範例。

  • 引入 pytest_enter_pdb hook(例如 pytest_timeout 需要它,以便在互動式進入 pdb 時取消逾時)。感謝 Wolfgang Schnerring。

  • 也使用非 python 函數測試項目檢查 xfail/skip。感謝 Floris Bruynooghe。

2.6.2 (2014-09-05)

  • 新增函數 pytest.freeze_includes(),這使得使用 cx_freeze 等工具輕鬆地將 pytest 嵌入到可執行檔中。請參閱文件以取得範例和理由。感謝 Bruno Oliveira。

  • 改進斷言重寫快取失效精確度。

  • 修復 issue561:調整 python3 的 autouse fixture 範例。

  • 修復 issue453:斷言重寫問題,__repr__ 包含 “n{”、“n}” 和 “n~”。

  • 修復 issue560:如果 “else:” 或 “finally:” 後面接著同一行上的陳述式,則正確顯示程式碼。

  • 修復 monkeypatch 文件中的範例,感謝 t-8ch。

  • 修復 issue572:更正 python3 的 tmpdir 文件範例。

  • 不要標記為通用 wheel,因為 Python 2.6 與其他建置不同,因為額外的 argparse 依賴性。修復 issue566。感謝 sontek。

  • 實作 issue549:使用者提供的斷言訊息現在不再取代 py.test 內省訊息,而是與它們一起顯示。

2.6.1 (2014-08-07)

  • 不再在 –verbose 輸出中顯示行號,輸出現在純粹是 nodeid。行號仍然顯示在失敗報告中。感謝 Floris Bruynooghe。

  • 修復 issue437,其中斷言重寫可能會導致 pytest-xdist worker 節點收集不同的測試。感謝 Bruno Oliveira。

  • 修復 issue555:將 “errors” 屬性新增到 capture-streams,以滿足某些 distutils 以及可能存取 sys.stdout.errors 的其他程式碼。

  • 修復 issue547 capsys/capfd 也可在停用輸出捕獲 (“-s”) 時運作。

  • 解決 issue170:允許 pytest.mark.xfail(…) 透過選用的 “raises=EXC” 引數指定預期的例外,其中 EXC 可以是單一例外或例外類別的元組。感謝 David Mohr 的完整 PR。

  • 修復 pytest 與 unittest.mock.patch 裝飾器的整合,當它使用 “new” 引數時。感謝 Nicolas Delaby 的測試和 PR。

  • 修復在引數包含 “::” 節點 id 規格時偵測 conftest 檔案的問題(從 “-v” 輸出複製貼上)

  • 修復 issue544,僅移除 “::” 分隔部分的結尾的 “@NUM”,且僅當該部分具有 “.py” 副檔名時

  • 不要使用 py.std 匯入 helper,而是直接匯入物件。感謝 Bruno Oliveira。

2.6

  • 根據 fixtures 的作用域快取來自 fixtures 的例外 (issue 467)。

  • 修復 issue537:預設情況下避免匯入舊的斷言重新解釋程式碼。

  • 修復 issue364:預設情況下縮短和增強 tracebacks 表示。新的 “–tb=auto” 選項(預設)將僅顯示第一個和最後一個條目的長 tracebacks。您可以使用 “–tb=long” 取得將所有條目列印為長條目的舊行為。此外,預設情況下,短條目現在的列印方式與 “–tb=native” 非常相似。

  • 修復 issue514:教導斷言重新解釋關於私有類別屬性的知識

  • 變更 -v 輸出以包含測試的完整節點 ID。使用者可以從測試執行中複製節點 ID(包括行號),並將其用作位置引數,以便僅執行單一測試。

  • 修復 issue 475:如果使用錯誤的例外類型呼叫 pytest.raises,則提早且可理解地失敗。

  • 修復 issue516:在 getting-started 中告知目前的依賴性。

  • 稍微清理 setup.py 並指定支援的版本。感謝 Jurko Gospodnetic 的 PR。

  • 將 XPASS 顏色變更為黃色而不是紅色(當測試以 -v 執行時)。

  • 修復 issue473:解決 mock 在雙重修補時將 unbound 方法放入類別 dict 中的問題。

  • 修復 issue498:如果 fixture finalizer 失敗,請確保 fixture 仍然失效。

  • 修復 issue453:pytest_assertrepr_compare hook 的結果現在會對其換行符號進行逸出,以便 format_exception 不會崩潰。

  • 內部新的警告系統:當 pytest 偵測到您的測試收集或執行中的異常情況時,現在會產生警告。警告最終會傳送到新的 pytest_logwarning hook,目前僅由終端機外掛程式實作,該外掛程式在摘要行中顯示警告,並在指定 -rw(報告警告)時顯示更多詳細資訊。

  • 將測試類別的跳過變更為警告(具有 __init__)以及測試模組中看起來像測試但不是函數的可呼叫物件。

  • 修復 issue436:透過使用 parse_known_args 的結果而不是先前不可靠的啟發式方法,改進從命令列引數尋找初始 conftest 檔案。

  • 修復 issue #479:在收集/載入測試模組期間正確處理 nose/unittest(2) SkipTest 例外。感謝 Marc Schlaich 的完整 PR。

  • 修復 issue490:在文件中包含 pytest_load_initial_conftests 並改進 docstring。

  • 修復 issue472:闡明如果 pytest.config.getvalue() 在命令列剖析之前觸發,則它無法運作。

  • 合併 PR123:改進與測試中 mock.patch 裝飾器的整合。

  • 修復 issue412:處理 stdout/stderr FD 層級串流現在可以捕獲而不會崩潰。

  • 修復 issue483:trial/py33 現在可以正常運作。感謝 Daniel Grana 的 PR。

  • 改進 pytest 與 “python setup.py test” 整合的範例,現在它具有通用的 “-a” 或 “–pytest-args” 選項,您可以在其中將其他選項作為引號字串傳遞。感謝 Trevor Bekolay。

  • 簡化內部捕獲機制,使其對測試或 setup 變更 FD1/FD2 更穩健,現在也與單一測試中的 pytest.pdb() 更好地整合。

  • 改進 pytest 自身測試套件的洩漏偵測,感謝 Marc Abramowitz 的 PR

  • 修復 issue492:避免 test_writeorg 中的洩漏。感謝 Marc Abramowitz。

  • 修復 issue493:不要在 doc 目錄中使用 python setup.py test 執行測試(針對該目的請使用 tox -e doctesting)

  • 修復 issue486:更好地報告和處理早期 conftest 載入失敗

  • 一些清理和簡化內部 conftest 處理。

  • 更努力地在捕獲例外時中斷參考循環。感謝 Jurko Gospodnetic。

  • 修復 issue443:修復跳過範例以使用正確的比較。感謝 Alex Groenholm。

  • 支援模組、類別和函數(包括 unittest 樣式類別)上的 nose 樣式 __test__ 屬性。如果設定為 False,則不會收集測試。

  • 修復 issue512:針對 monkeypatch 外掛程式中可能未設定的引數顯示 “<notset>”。改進文件中的輸出。

2.5.2 (2014-01-29)

  • 修復 issue409 – 透過不嘗試從 collections.abc 匯入來更好地與 cx_freeze 互操作,這會導致 py27/cx_freeze 的問題。感謝 Wolfgang L. 的報告和追蹤。

  • 修復文件和程式碼,幾乎所有地方都使用 “pytest” 而不是 “py.test”。感謝 Jurko Gospodnetic 的完整 PR。

  • 修復 issue425:在 “py.test -h” 結尾提及 –markers 和 –fixtures 根據指定的測試路徑(或目前目錄)運作

  • 修復 issue413:具有 unicode 屬性的例外現在在 python2 上以及使用 pytest-xdist 執行時也能正確列印。(此修復需要 py-1.4.20)

  • 從 pylib 1.4.20.dev2 (rev 13d9af95547e) 複製、清理和整合 py.io 捕獲

  • 解決 issue416:闡明關於 conftest.py 載入語意的文件

  • 修復 issue429:在斷言表達式中比較具有非 ascii 字元的位元組字串現在可以更好地運作。感謝 Floris Bruynooghe。

  • 使 capfd/capsys.capture 私有,它未使用且不應公開

2.5.1 (2013-12-17)

  • 合併來自 Tobias Bieniek 的新文件樣式 PR。

  • 修復 issue403:允許在收集節點中參數化多個同名函數。感謝 Andreas Kloeckner 和 Alex Gaynor 的報告和分析。

  • 允許參數化的 fixtures 透過將 ids 引數新增到 pytest.fixture() 和 pytest.yield_fixture() 來指定參數的 ID。感謝 Floris Bruynooghe。

  • 修復 issue404,始終在 junitxml 外掛程式中使用二進位 xml 逸出。感謝 Ronny Pfannschmidt。

  • 修復 issue407:修復 addoption docstring 以指向 argparse 而不是 optparse。感謝 Daniel D. Wright。

2.5.0 (2013-12-12)

  • 從 pytest 自身的自動發布測試中刪除 python2.5,這表示它可能很快就會中斷(但我們相信它仍然適用於此版本)。

  • 簡化並修復在涉及參數化 fixtures 或函數引數時呼叫 finalizers 的實作。finalization 現在是在 setup 時間延遲執行的,而不是在「teardown 階段」。雖然這乍聽之下可能很奇怪,但它有助於確保我們即使在複雜的程式碼中也能正確處理 setup/teardown。除非使用者層級程式碼實作 pytest_runtest_teardown hook 並期望某些 fixture 實例在其中被拆解(非常不可能且無論如何都不可靠),否則使用者層級程式碼不應受到影響。

  • PR90:新增 –color=yes|no|auto 選項以強制終端機著色模式(“auto” 是預設值)。感謝 Marc Abramowitz。

  • 修復 issue319 - 正確顯示斷言錯誤中的 unicode。非常感謝 Floris Bruynooghe 的完整 PR。也表示我們現在依賴 py>=1.4.19。

  • 修復 issue396 - 獨立於類別上的方法數,正確排序和最終化類別作用域的參數化測試。

  • 以更好的方式重新修復 issue323 – 參數化現在絕不應導致 Runtime Recursion 錯誤,因為每個作用域/每個 fixture 重新排序測試的底層演算法不再是遞迴的(以前是尾呼叫遞迴,這可能會導致超過 >966 個非函數作用域參數的問題)。

  • 修復 issue290 - 現在初步支援使用重複的相同值進行參數化(有時用於測試第二次呼叫是否與第一次呼叫一樣有效)。

  • 關閉 issue240 - 精確地記錄 pytest 模組匯入如何運作,討論兩種常見的測試目錄佈局,以及它如何與 PEP 420-命名空間套件互動。

  • 修復 issue246,在依賴於參數化的高於函數作用域的 fixture 的獨立 fixtures 上修復 finalizer 順序以成為 LIFO。(這需要相當多的努力,所以請容忍此句子的複雜性 :) 感謝 Ralph Schmitt 的精確失敗範例。

  • 修復 issue244,透過為參數實作特殊索引,僅對參數化測試 id 使用索引

  • 修復 issue287,透過執行所有 finalizers,但儲存來自第一個失敗 finalizer 的例外並重新引發它,以便 teardown 仍然會失敗。我們重新引發第一個失敗的例外,因為它可能是導致其他 finalizers 失敗的原因。

  • 修復將 mock.patch 或其他標準裝飾器包裝與測試方法一起使用時的排序。這修復了 issue346,並應有助於隨機的 “xdist” 收集失敗。感謝 Ronny Pfannschmidt 和 Donald Stufft 協助隔離它。

  • 修復 issue357 - 特殊情況 “-k” 表達式,以允許使用不是有效 python 表達式的簡單字串進行篩選。範例:“-k 1.3” 符合所有以 1.3 參數化的測試。“-k None” 篩選名稱中具有 “None” 的所有測試,反之亦然 “-k ‘not None’”。先前這些範例會引發語法錯誤。

  • 透過移除 trial 支援程式碼來修復 issue384,因為 unittest 相容性增強功能允許 trial 自行處理它

  • 匯入外掛程式產生 ImportError 時,不要隱藏它。修復 issue375。

  • 修復 issue275 - 允許 usefixtures 和 autouse fixtures 用於執行 doctest 文字檔案。

  • 修復 issue380,透過使 –resultlog 僅依賴 longrepr 而不是僅有時存在的 “reprcrash” 屬性。

  • 解決 issue122:允許 @pytest.fixture(params=iterator) 透過提早展開為列表。

  • 修正 pexpect-3.0 相容性問題,以用於 pytest 自身的測試。(修正 issue386)

  • 允許巢狀 parametrize-value 標記 (marker),感謝 James Lan 的 PR。

  • 修正使用新的 monkeypatch.setattr(import_path, value) API 時的 unicode 處理問題。感謝 Rob Dennis。修正 issue371。

  • 修正 junitxml 的 unicode 處理問題,修正 issue368。

  • 在 Python 2 的 assertion rewriting 模式下,修正 coding cookie 的偵測。請參閱 issue #330。

  • 使 “–runxfail” 將命令式的 pytest.xfail 呼叫轉換為 no ops (它已經中和 pytest.mark.xfail 標記)

  • 改進 pytest / pkg_resources 互動:AssertionRewritingHook PEP 302 相容的載入器現在正確地向 setuptools/pkg_resources 註冊自身,以便 pkg_resources.resource_stream 方法可以正常運作。修正 issue366。感謝 Jason R. Coombs 的調查和完整的 PR。

  • pytestconfig fixture 現在是 session-scoped,因為在整個測試執行期間它是相同的物件。修正 issue370。

  • 避免一個令人驚訝的 marker 故障/混淆案例

    @pytest.mark.some(lambda arg: ...)
    def test_function():
    

    無法正確運作,因為 pytest 假設 @pytest.mark.some 取得一個要裝飾的函式。我們現在至少偵測到此 arg 是否為 lambda,因此範例將會運作。感謝 Alex Gaynor 提出此問題。

  • 在 pypy 上 xfail 一個檢查錯誤編碼/ascii 的測試 (pypy 不會報錯)。修正 issue385。

  • 在內部使 varnames() 處理類別的 __init__,雖然 pytest 本身目前不需要。同時修正快取。修正 issue376。

  • 修正 issue221 - 正確處理匯入沒有 __init__.py 的 namespace-package。

  • 重構內部 FixtureRequest 處理,以避免 monkeypatching。其中一個對使用者友好的正面影響是 “request” 物件現在可以在 closures 中使用。

  • 修正 pytest.importskip(modname, minverstring) 中的版本比較

  • 修正 issue377,方法是在 nose-compat 文件中澄清 pytest 不會將 unittest-API 複製到 “plain” namespace 中。

  • 修正 @mock’d 測試函式的 verbose 報告

2.4.2 (2013-10-04)

  • 在 Windows 上,需要 colorama 和較新版本的 py lib,以便 py.io.TerminalWriter() 現在使用 colorama 而不是它自己的 ctypes hacks。(修正 issue365) 感謝 Paul Moore 提出此問題。

  • 修正 “-k” 比對測試的問題,其中 “repr” 和 “attr” 以及其他名稱會因為內部實作的怪癖 (別問) 而導致錯誤的比對,現在已正確實作。修正 issue345。

  • 避免 tmpdir fixture 建立過長的檔案名稱,尤其是在使用 parametrization 時 (issue354)

  • 修正 pytest-pep8 和 pytest-flakes / pytest 互動問題 (mark plugin 中的 collection names 假設 item 總是具有函式,但對於這些 plugins 等而言並非如此)。感謝 Andi Zeidler。

  • 為 plugins (例如 pytest-pep8 和 pytest-flakes) 引入 node.get_marker/node.add_marker API,以避免 node.keywords pseudo-dicts 的混亂細節。已調整文件。

  • 移除在啟動時 “dup” stdout 的嘗試,因為它很糟糕。正常的 capturing 應該可以捕捉到足夠多的測試搞亂標準 FDs 的可能性。

  • 新增 pluginmanager.do_configure(config) 作為 config.do_configure() 的連結,以實現 plugin-compatibility

2.4.1 (2013-10-02)

  • 當使用 parser.addoption() 時,“type” 關鍵字的 unicode 引數也應該轉換為各自的類型。感謝 Floris Bruynooghe, @dnozay。(修正 issue360 和 issue362)

  • 修正使用 argcomplete 時的 dotted filename completion,感謝 Anthon van der Neuth。(修正 issue361)

  • 修正當使用 1-tuple (“arg”,) 來指定 parametrization 時的 regression (parametrization 的值以 tuple 巢狀方式傳遞)。感謝 Donald Stufft。

  • 合併 doc typo 修正,感謝 Andy Dirnberger

2.4

已知不相容性

  • 如果從 python2.7 或更高版本呼叫 –genscript,您只會獲得一個在 python2.7 或更高版本上運作的獨立腳本。使用 Python2.6 也可以獲得 python2.5 相容的版本。

  • 如果對應的 setup 方法失敗,則所有 xunit-style teardown 方法 (nose-style、pytest-style、unittest-style) 將不會被呼叫,請參閱下方的 issue322。

  • pytest_plugin_unregister hook 從未被正確呼叫,並且沒有已知的 hook 實作 - 因此它被移除了。

  • pytest.fixture-decorated 函式不能再是 generators (即使用 yield)。如果這造成無法預見的實際問題,此變更可能會在 2.4.1 中被撤銷。但是,您始終可以編寫並傳回內部函式/generator,並變更 fixture consumer 以迭代傳回的 generator。進行此變更是為了新的 pytest.yield_fixture decorator,請參閱下方。

新功能

  • 實驗性地引入新的 pytest.yield_fixture decorator,它接受與 pytest.fixture 完全相同的參數,但強制要求從 fixture 函式中使用 yield statement 而不是 return statement。這允許與 fixture 函式中的 “with-style” context managers 直接整合,並通常避免註冊 finalization callbacks,而是將 “after-yield” 視為 teardown code。感謝 Andreas Pelme、Vladimir Keleshev、Floris Bruynooghe、Ronny Pfannschmidt 和許多其他人的討論。

  • 如果也指定了 “reason”,則允許直接使用布林運算式與 skipif/xfail。重新設計 skipping 文件以建議 “condition as booleans”,因為它可以防止在模組之間匯入 markers 時出現意外情況。以字串形式指定條件將仍然完全支援。

  • reporting:根據是否發生 failures/errors 或所有項目都通過,將最後一行著色為紅色或綠色。感謝 Christian Theunert。

  • 使 “import pdb ; pdb.set_trace()” 在 capturing 方面原生運作 (不再需要 “-s”),使 pytest.set_trace() 僅僅是一個捷徑。

  • 修正 issue181:–pdb 現在也適用於 collect errors (以及 internal errors)。這是通過輕微的內部重構和引入新的 hook pytest_exception_interact hook (請參閱下一個項目) 來實作的。

  • 修正 issue341:為 IDEs/terminals 引入新的實驗性 hook 以攔截 debugging:pytest_exception_interact(node, call, report)

  • 新的 monkeypatch.setattr() 變體,用於為從模組中 patching out 類別/函式提供更簡短的調用

    monkeypatch.setattr(“requests.get”, myfunc)

    將使用 myfunc 替換 “requests” 模組的 “get” 函式。

  • 修正 issue322:如果 setUpClass 失敗,則 tearDownClass 不會執行。感謝 Mathieu Agopian 的初步修正。同時使所有 pytest/nose finalizer 模仿相同的通用行為:如果 setupX 存在且失敗,則不要執行 teardownX。這在內部引入了一個新的方法 “node.addfinalizer()” helper,它只能在節點的 setup 階段呼叫。

  • 簡化 pytest.mark.parametrize() 簽名:允許傳遞 CSV 分隔的字串來指定 argnames。例如:pytest.mark.parametrize("input,expected",  [(1,2), (2,3)]) 與之前的版本一樣有效:pytest.mark.parametrize(("input", "expected"), ...)

  • 新增對 setUpModule/tearDownModule 偵測的支援,感謝 Brian Okken。

  • 通過使用 “argcomplete” 整合選項卡的自動完成功能。感謝 Anthon van der Neut 的 PR。

  • 變更選項名稱為連字號分隔的長選項,但保持舊的拼寫向後相容。py.test -h 將僅顯示連字號版本,例如 “–collect-only”,但 “–collectonly” 也將保持有效 (為了向後相容性)。非常感謝 Anthon van der Neut 的實作和 Hynek Schlawack 的推動。

  • 修正 issue 308 - 允許在 parametrization 時標記/xfail/skip 個別參數集。感謝 Brianna Laugher。

  • 呼叫新的實驗性 pytest_load_initial_conftests hook,以允許第三方 plugins 在載入 conftest 之前執行某些操作。

Bug 修正

  • 修正 issue358 - capturing 選項現在通過使用新的 parser.parse_known_args 方法更正確地解析。

  • pytest 現在使用 argparse 而不是 optparse (感謝 Anthon),這表示如果安裝到 python2.6 或更低版本的環境中,則 “argparse” 將作為相依性新增。

  • 修正 issue333:修正 unittest/pytest hook 互動不良的案例。

  • PR27:正確處理 collection 期間的 nose.SkipTest。感謝 Antonio Cuni, Ronny Pfannschmidt。

  • 修正 issue355:junitxml 將 name=”pytest” 屬性放入 testsuite 標籤中。

  • 修正 issue336:plugins 中的 autouse fixture 應再次運作。

  • 修正 issue279:改進 assertion failure 時對標準資料類型的物件比較,並識別 collections.abc。感謝 Brianna Laugher 和 Mathieu Agopian。

  • 修正 issue317:assertion rewriter 支援 is_package 方法

  • 修正 issue335:記錄從 pytest.raises() 傳回的 py.code.ExceptionInfo() 物件,感謝 Mathieu Agopian。

  • 從 setup.py 中移除隱含的 distribute_setup 支援。

  • 修正 issue305:忽略寫入 pyc 檔案時的任何問題。

  • SO-17664702:即使 fixture 函式部分失敗,也呼叫 fixture finalizers (finalizers 之前並非總是會被呼叫)

  • 修正 issue320 - 修正與模組級函式混合使用時 fixtures 的類別 scope。感謝 Anatoly Bubenkoff。

  • 您可以指定 “-q” 或 “-qq” 以獲得不同程度的 “quieter” 報告 (感謝 Katarzyna Jachim)

  • 修正 issue300 - 修正當在子目錄中啟動 py.test 時 conftest 載入的順序。

  • 修正 issue323 - 對許多模組級 arg parametrizations 進行排序

  • 使 sessionfinish hooks 以與 session 啟動時相同的 cwd-context 執行 (有助於修正使用相對路徑寫入輸出檔案的 plugin 行為,例如 pytest-cov)

  • 修正 issue316 - 在 docs 中正確參考 collection hooks

  • 修正 issue 306 - 清理 -k/-m 選項,使其僅分別比對 markers/test names/keywords。感謝 Wouter van Ackooy。

  • 改進 python 模組中 doctests 的 doctest 計數 – 沒有任何 doctest items 的檔案將不再顯示,並且 doctest 範例將被計為單獨的測試項目。感謝 Danilo Bellini。

  • 通過依賴發布的 py-1.4.14 來修正 issue245,該版本修正了 py.io.dupfile 以使其適用於沒有 mode 的檔案。感謝 Jason R. Coombs。

  • 修正當測試輸出包含控制字元時的 junitxml 生成問題,解決 issue267,感謝 Jaap Broekhuizen

  • 修正 issue338:setup/teardown errors 也應遵循 –tb style。感謝 Maho。

  • 修正 issue307 - 在範例中使用 yaml.safe_load,感謝 Mark Eichin。

  • 更好的 parametrize 錯誤訊息,感謝 Brianna Laugher

  • pytest_terminal_summary(terminalreporter) hooks 現在可以使用 “.section(title)” 和 “.line(msg)” 方法在測試執行結束時列印額外資訊。

2.3.5 (2013-04-30)

  • 修正 issue169:setup/teardown errors 也應遵循 –tb=style。

  • 永遠不要將 fixture 函式視為測試函式 collection

  • 允許重新執行測試項目 / 有助於修正 pytest-reruntests plugin,並有助於減少 fixture/resource 參考的存活時間

  • 即使對於通過的測試,也將 captured stdout/stderr 放入 junitxml 輸出中 (感謝 Adam Goucher)

  • Issue 265 - 將 nose setup/teardown 與 setupstate 整合,使其不會嘗試 teardown 未 setup 的項目

  • issue 271 - 不要在 worker nodes 上寫入 junitxml

  • Issue 274 - 當 doctest 不知道範例位置時,不要嘗試顯示完整的 doctest 範例

  • issue 280 - 在有 bug 的 CPython 2.6.0 上停用 assertion rewriting

  • 注入 “getfixture()” helper 以從 doctests 中檢索 fixtures,感謝 Andreas Zeidler

  • issue 259 - 當 assertion rewriting 時,與 Python 2 上 ASCII 的預設 source encoding 保持一致

  • issue 251 - 報告 skip 而不是忽略具有 init 的類別

  • issue250 parametrization names 和 values 中的 unicode/str 混合現在可以運作

  • issue257,assertion-triggered compilation of source ending in a comment line 不會在 python2.5 中崩潰 (通過 py>=1.4.13.dev6 修正)

  • 修正 –genscript 選項以生成也適用於 python3.3 的獨立腳本 (importer ordering)

  • issue171 - 在 assertion rewriting 中,顯示一些全域變數的 repr

  • 修正 “-k” 的選項說明

  • 將發行版的長描述移至 README.rst

  • 改進 metafunc.parametrize() 的 docstring

  • 修正在測試函式中使用 capsys 和 pytest.set_trace() 時,查看 capsys.readouterr() 會中斷的 bug

  • 允許在自訂 python_functions 測試探索時指定以 “_” 開頭的前綴。(感謝 Graham Horler)

  • 通過在新行上使用額外的縮排放置額外資料,來改進 PYTEST_DEBUG tracing 輸出

  • 確保 OutcomeExceptions (例如 skip/fail) 已初始化 exception attributes

  • issue 260 - 不要在 plain unittest cases 上使用 nose special setup

  • 修正 issue134 - 列印阻止執行指定測試項目的 collect errors

  • 修正 issue266 - 接受 MarkEvaluator 運算式中的 unicode

2.3.4 (2012-11-20)

  • yielded 測試函式現在將具有 active 的 autouse-fixtures,但不能接受 fixtures 作為 funcargs - 無論如何建議使用 post-2.0 parametrize 功能而不是 yield,請參閱:https://pytest.dev.org.tw/en/stable/example/how-to/parametrize.html

  • 修正 autouse-issue,其中如果在 a/conftest.py 檔案中定義 autouse-fixtures,並且測試位於 a/tests/test_some.py 中,則不會探索到 autouse-fixtures

  • 修正 issue226 - fixture teardowns 的 LIFO ordering

  • 修正 issue224 - 使用 >256 個字元引數的調用現在可以運作

  • 修正 issue91 - 在範例中新增/討論 package/directory level setups

  • 允許通過與 “-m” 選項整合的 item.keywords[…]=assignment 動態定義 markers

  • 使 “-k” 接受與 “-m” 相同的運算式,以便可以編寫:-k “name1 or name2” 等。如果您使用特殊語法 (例如 “TestClass.test_method”),這是一個輕微的不相容性,您現在需要將其編寫為 -k “TestClass and test_method” 以比對特定測試類別中的特定方法。

2.3.3 (2012-11-06)

  • 修正 issue214 - 解析包含特殊物件的模組,例如 flask 的 request 物件,如果沒有 active 的 request,則在 getattr 存取時會崩潰。感謝 Thomas Waldmann。

  • 修正 issue213 - 允許使用 numpy arrays 之類的值進行 parametrize,這些值不支援 __eq__ operator

  • 修正 issue215 - 將 test_python.org 分割成多個檔案

  • 修正 issue148 - 現在可以識別類別上的 @unittest.skip,並避免呼叫 setUpClass/tearDownClass,感謝 Pavel Repin

  • 修正 issue209 - 通過依賴更新的 pylib 重新引入 python2.4 支援,該 pylib 重新引入了 pre-AST interpreters 的 statement-finding

  • nose 支援:僅在它是 callable 時才呼叫 setup,感謝 Andrew Taumoefolau

  • 修正 issue219 - 將 py2.4-3.3 classifiers 新增至 TROVE list

  • 在 tracebacks 中,,* arg values 現在顯示在 normal arguments 旁邊 (感謝 Manuel Jacob)

  • 修正 issue217 - 支援 mock.patch 與 pytest 的 fixtures - 請注意,您需要 mock-1.0.1 或 python3.3 內建的 unittest.mock。

  • 修正 issue127 - 改進 pytest_addoption() 的文件,並為一致性新增 config.getoption(name) helper 函式。

2.3.2 (2012-10-25)

  • 修正 issue208 和 issue29 使用新的 py 版本,以避免在長模組中列印 tracebacks 時出現長時間的暫停

  • 修正 issue205 - subdirs 中的 conftests 自訂 pytest_pycollect_makemodule 和 pytest_pycollect_makeitem 現在可以正常運作

  • 修正 parametrized setups 的 teardown-ordering

  • 修正 issue127 - 更好的 pytest_addoption 和相關物件的文件。

  • 修正 unittest 行為:僅在定義了測試方法時才呼叫 TestCase.runtest

  • 改進 trial 支援:不要 collection 其空的 unittest.TestCase.runTest() 方法

  • “python setup.py test” 現在可以與 pytest 本身一起運作

  • 修正/改進 internal/packaging 相關部分

    • test_nose.py 的 exception message check 現在也可以在 python33 上通過

    • issue206 - 修正 test_assertrewrite.py,使其在存在全域 PYTHONDONTWRITEBYTECODE=1 時可以運作

    • 將 tox.ini 新增至 pytest 發行版,以便 ignore-dirs 和其他 config bits 可以正確地分發給執行 pytest-own tests 的維護人員

2.3.1 (2012-10-20)

  • 修正 issue202 - 修正 regression:現在可以按預期從 fixture 函式中使用 “self” (它與使用 fixture 的測試方法看到的 “self” instance 相同)

  • 由於 pexpect 無法正確支援 (hanging),因此在 freebsd* 系統上 skip pexpect using tests (主要是 test_pdb.py)

  • 從 –markers 輸出連結到網頁,其中提供了 pytest.mark.* 用法的說明。

2.3.0 (2012-10-19)

  • 修正 issue202 - 為 parametrized 測試函式提供更好的自動名稱

  • 修正 issue139 - 引入 @pytest.fixture,它允許直接 scoping 和 parametrization funcarg factories。

  • 修正 issue198 - 由於路徑操作問題,在 windows32 上具有巢狀目錄結構的某些情況下找不到 conftest fixtures

  • 修正 issue193 skip 使用空參數集進行 parametrization 的測試函式

  • 修正 python3.3 compat,主要是先前依賴 dict ordering 的 reporting bits

  • 引入按 resource 和 parametrization setup 重新排序測試的功能,它優先於通常的檔案排序

  • 修正 issue185 monkeypatching time.time 不會導致 pytest 失敗

  • 修正 issue172 重複呼叫 pytest.fixture decorated setup_module 函式

  • 修正 junitxml=path construction,以便如果測試變更了 current working directory 並且路徑是相對路徑,則會從原始 current working dir 正確建構路徑。

  • 修正 “python setup.py test” 範例以導致正確的 “errno” return

  • 修正 issue165 - 修正 broken doc links 並提及 stackoverflow 以獲取 FAQ

  • 捕捉寫入 failure representations 到終端時的 unicode-issues,以防止整個 session 崩潰

  • 修正 xfail/skip confusion:skip-mark 或 imperative pytest.skip 現在將優先於 xfail-markers,因為在 skip 的情況下我們無法確定 xfail/xpass 狀態。另請參閱:http://stackoverflow.com/questions/11105828/in-py-test-when-i-explicitly-skip-a-test-that-is-marked-as-xfail-how-can-i-get

  • 始終在測試執行的 header 中報告已安裝的第三方 plugins

  • 修正 issue160:xfail-marked 測試的 failing setup 應報告為 xfail (而不是 xpass)

  • 修正 issue128:當使用 capsys/capfd 時顯示 captured output

  • 修正 issue179:正確顯示 factories 的 dependency chain

  • 如果 plugin 已註冊或名稱已被佔用,pluginmanager.register(…) 現在會引發 ValueError

  • 修正 issue159:改進 https://pytest.dev.org.tw/en/6.0.1/faq.html,尤其是在 “magic” history 方面,還提及 pytest-django、trial 和 unittest 整合。

  • 使 request.keywords 和 node.keywords 可寫入。所有 descendant collection nodes 都將看到 keyword values。Keywords 是包含 markers 和其他資訊的 dictionaries。

  • 修正 issue 178:xml binary escapes 現在封裝在 py.xml.raw 中

  • 修正 issue 176:即使我們在 python 層級將 AssertionError 替換為 subclass,也能正確捕捉內建的 AssertionError

  • factory discovery 不再因提供不健全 __code__ 物件的 magic global callables (例如 mock.call) 而失敗

  • 修正 issue 182:testdir.inprocess_run 現在考慮 passed plugins

  • 修正 issue 188:確保 python2 上的 sys.exc_info 已清除

    在呼叫測試之前

  • 修正 issue 191:新增 unittest TestCase runTest 方法支援

  • 修正 issue 156:monkeypatch 正確處理類別級描述器

  • reporting refinements

    • pytest_report_header 現在接收 “startdir”,以便您可以使用 startdir.bestrelpath(yourpath) 來顯示美觀的相對路徑

    • 允許 plugins 同時實作 pytest_report_header 和 pytest_sessionstart (sessionstart 首先被調用)。

    • 如果沒有 deselected reason line,則不顯示

    • py.test -vv 將顯示所有 assert comparisons 而不是截斷

2.2.4 (2012-05-22)

  • 修正涉及 % operator 的 rewritten assertions 的錯誤訊息

  • 修正 issue 126:正確比對 junitxml binary escape 的所有 invalid xml characters

  • 修正 unittest 的問題:現在應該正確處理 @unittest.expectedFailure markers (您也可以使用 @pytest.mark markers)

  • 記錄與 extended distribute/setuptools test commands 的整合

  • 修正 issue 140:正確取得 setup/teardown_class 的 bound classmethods 的 real functions

  • 修正 issue #141:從已關閉的 paste.pocoo.org 切換到 bpaste.net

  • 修正 issue #143:始終在 configure/sessionstart 被呼叫時呼叫 unconfigure/sessionfinish

  • 修正 issue #144:更好地 mangle test ids 為 junitxml classnames

  • 將 distribute_setup.py 升級到 0.6.27

2.2.3 (2012-02-05)

  • 修正 uploaded package 以僅包含 necessary files

2.2.2 (2012-02-05)

  • 修正 issue101:unittest.TestCase 測試函式的 wrong args 現在產生更好的輸出

  • 修正 issue102:當測試目錄被重新命名並且一些 pyc/__pycache__ 仍然存在時,報告更有用的錯誤和提示

  • 修正 issue106:允許 parametrize 多次應用,例如從 module、class 和 function level。

  • 修正 issue107:實際執行 session scope finalization

  • 不要在 parametrize 中檢查 indirect parameters 是否為 funcarg names

  • 將 chdir 方法新增至 monkeypatch funcarg

  • 修正因第二次呼叫 monkeypatch undo 而導致的 crash

  • 修正 issue115:使 –collectonly 對於 early failure (missing files/directories) 具有 robust 性

  • “-qq –collectonly” 現在僅顯示檔案及其中的測試數量

  • “-q –collectonly” 現在顯示 test ids

  • 允許將 attributes 新增至 test reports,使其也適用於 distributed testing (無需升級 pytest-xdist)

2.2.1 (2011-12-16)

  • 修正 issue99 (在 pytest 和 py 中) internallerrors 與 resultlog 現在產生更好的輸出 - 通過正規化 pytest_internalerror input arguments 來修正。

  • 修正 issue97 / traceback issues (在 pytest 和 py 中) 改進與 hack tracebacks 的 jinja2 和 cython 結合使用的 traceback 輸出

  • 修正 issue93 (在 pytest 和 pytest-xdist 中) 避免 “delayed teardowns”:測試節點中的 final test 現在將直接執行其 teardown,而不是等待 session 結束。感謝 Dave Hunt 的良好報告和回饋。pytest_runtest_protocol 以及 pytest_runtest_teardown hooks 現在具有 “nextitem” 可用,它將為 None,表示測試執行結束。

  • 修正由於 unknown-source collected items 導致的 collection crash,感謝 Ralf Schmitt (通過依賴更近期的 pylib 修正)

2.2.0 (2011-11-18)

  • 修正 issue90:引入 eager tearing down of test items,以便更早呼叫 teardown function。

  • 新增 all-powerful metafunc.parametrize function,它允許在多個步驟中 parametrize test function arguments,因此可以從 independent plugins 和 places 進行 parametrize。

  • 新增 @pytest.mark.parametrize helper,它允許輕鬆地使用不同的引數 values 呼叫測試函式

  • 將範例新增至 “parametrize” 範例頁面,包括 Test scenarios 的快速移植以及新的 parametrize function 和 decorator。

  • 通過 ini-files 或 plugin hooks 引入 “pytest.mark.*” helpers 的註冊。同時引入 “–strict” 選項,它會將 unregistered markers 視為 errors,從而避免 typos 並維護一套 well described set of markers 以用於您的測試套件。請參閱 https://pytest.dev.org.tw/en/stable/how-to/mark.html 及其連結中的範例。

  • issue50:引入 “-m marker” 選項以根據 markers 選擇測試 (這是 ‘-k’ 的更嚴格且更可預測的版本,因為 “-m” 僅比對 complete markers,並且對於 and/or 語義具有更明顯的規則。

  • 協助優化測試速度的新功能:–durations=N 選項,用於顯示 N 個最慢的測試呼叫和 setup/teardown 方法。

  • 修正 issue87:–pastebin 現在可以與 python3 一起運作

  • 修正 issue89:–pdb 與 doctest 中 unexpected exceptions 的結合使用更合理

  • 修正並清理 pytest 自身的測試套件,使其不會 leak FDs

  • 修正 issue83:連結到 generated funcarg list

  • 修正 issue74:pyarg module names 現在針對 imp.find_module false positives 進行檢查

  • 修正與 twisted/trial-11.1.0 use cases 的相容性

  • 簡化 Node.listchain

  • 通過依賴 py.xml 簡化 junitxml output code

  • 新增對 unittest 類別和函式上的 skip properties 的支援

2.1.3 (2011-10-18)

  • 修正 issue79:assertion rewriting 在 boolops 中的某些 comparisons 上失敗

  • 正確處理 zero length arguments (a la pytest ‘’)

  • 修正 issue67 / junitxml 現在包含 correct test durations,感謝 ronny

  • 修正 issue75 / skipping test failure on jython

  • 修正 issue77 / 允許 assertrepr_compare hook 應用於 tests 的 subset

2.1.2 (2011-09-24)

  • 修正在某些 Python 版本上具有 windows newlines 的檔案上的 assertion rewriting

  • 通過 package/module name (–pyargs) 改進 test discovery,感謝 Florian Mayer

  • 修正 issue69 / assertion rewriting fixed 在某些 boolean operations 上

  • 修正 issue68 / packages 現在可以與 assertion rewriting 一起運作

  • 修正 issue66:當傳遞 -O 選項時,使用不同的 assertion rewriting caches

  • 不要在 Jython 上嘗試 assertion rewriting,使用 reinterp

2.1.1

  • 修正 issue64 / pytest.set_trace 現在可以在 pytest_generate_tests hooks 中運作

  • 修正 issue60 / 修正涉及 __pycache__ 建立的 error conditions

  • 修正 issue63 / assertion rewriting 在 inserts 上,其中 inserts 包含 strings containing ‘%’

  • 修正 assertion rewriting 在具有 ** arg 的 calls 上

  • 如果 bytecode generation 已停用,則不要快取 rewritten modules

  • 修正在 read-only directories 中的 assertion rewriting

  • 修正 issue59:為 junitxml output 提供 system-out/err tags

  • 修正 issue61:assertion rewriting 在具有 3 個或更多 operands 的 boolean operations 上

  • 您現在可以使用 “cd doc ; make man” 建置 man page

2.1.0 (2011-07-09)

  • 修正 issue53 以 correct ordering 呼叫 nosestyle setup functions

  • 修正 issue58 和 issue59:new assertion code fixes

  • 合併 Benjamin 的 assertionrewrite branch:現在 python 2.6 及更高版本上的測試模組的 assertions 是通過 rewriting AST 並在匯入測試模組之前儲存 pyc 檔案來完成的。請參閱 doc/assert.txt 以獲取更多資訊。

  • 修正 issue43:改進 doctests,在 unexpected exceptions 上提供更好的 traceback reporting

  • 修正 issue47:junitxml 中 test cases 的 timing output 現在是 correct 的

  • 修正 issue48:MarkInfo repr 中的 typo 導致 exception

  • 修正 issue49:避免在 initialization partially fails 時出現 confusing error

  • 修正 issue44:junitxml file path 的 env/username expansion

  • 在 pypy 的 test runs 中顯示 releaselevel information

  • 重新設計 doc pages 以獲得更好的 navigation 和 PDF generation

  • 即使在 session startup 期間中斷,也報告 KeyboardInterrupt

  • 修正 issue 35 - 從 index page 提供 PDF doc version 和 download link

2.0.3 (2011-05-11)

  • 修正 issue38:在 hooks 的呼叫上提供 nicer tracebacks,尤其是 early configure/sessionstart ones

  • 修復 junitxml 檔案中 missing skip reason/meta information,通過 http://lists.idyll.org/pipermail/testing-in-python/2011-March/003928.html 報告

  • 修正 issue34:避免 “test” prefixed classes 從 object 派生時的 collection failure。

  • 如果沒有實際使用 –genscript,則 genscript plugin 不需要 zlib (和其他 libs)。

  • 加速 skips (通過不在內部執行 full traceback representation)

  • 修正 issue37:避免 junitxml 的 output 中的 invalid characters

2.0.2 (2011-03-09)

  • 解決 issue32 - 通過減少 relative overhead 來加速 very quick test functions 的 test runs

  • 修正 issue30 - extended xfail/skipif handling 和 improved reporting。如果在 skip/xfail expressions 中存在 syntax error,您現在會獲得 nice error reports。

    此外,您現在可以從 xfail/skipif expressions 存取 module globals,以便例如這個現在可以運作

    import pytest
    import mymodule
    @pytest.mark.skipif("mymodule.__version__[0] == "1")
    def test_function():
        pass
    

    如果模組的 version string 未以 “1” 開頭,則這將不會執行測試函式。請注意,指定字串而不是布林運算式允許 py.test 在摘要測試執行時報告 meaningful information,說明哪些條件導致 skipping (或 xfail-ing) tests。

  • 修正 issue28 - setup_method 和 pytest_generate_tests 協同運作 setup_method fixture 方法現在也針對從 pytest_generate_tests hook 生成的測試函式調用呼叫。

  • 修正 issue27 - collectonly 和 keyword-selection (-k) 現在協同運作 此外,如果您執行 “py.test –collectonly -q”,您現在會獲得 test ids 的 flat list,您可以使用這些 ids 貼到 py.test commandline 以執行特定測試。

  • 修正 issue25 避免報告的與 –pdb 和 python3.2/encodings output 相關的問題

  • 修正 issue23 - tmpdir argument 現在可以在 Python3.2 和 WindowsXP 上運作 從 Python3.2 開始,os.symlink 可能受到支援。通過要求更新的 py lib 版本,py.path.local() 實作確認了這一點。

  • fixed typos in the docs (感謝 Victor Garcia, Brianna Laugher) 以及特別感謝 Laura Creighton 也審閱了部分文件。

  • 修正 classes 的 verbose progress reporting 的 slightly wrong output (感謝 Amaury)

  • 更 precise (avoiding of) deprecation warnings for node.Class|Function accesses

  • 避免 tracebacks 中的 std unittest assertion helper code (感謝 Ronny)

2.0.1 (2011-02-07)

  • refine and unify initial capturing,使其即使在 early-loaded conftest.py 檔案或 plugin 上使用 logging module 時也能很好地運作。

  • 允許在 test ids 中 omit “()”,以允許 Alfredo 的 nice pytest.vim plugin 產生的 uniform test ids。

  • 修正 issue12 - 使用 “–version” 和 “–traceconfig” 顯示 plugin versions,並記錄如何將 extra information 新增至 reporting test header

  • 修正 issue17 (python3 上的 import-* reporting issue),方法是要求 py>1.4.0 (1.4.1 將包含它)

  • 修正 issue10 (numpy arrays truth checking),方法是 refining assertion interpretation 在 py lib 中

  • 修正 issue15:使 nose compatibility tests 與 python3 相容 (現在 nose-1.0 支援 python3)

  • 移除 somewhat surprising “same-conftest” detection,因為當 conftest.py 出現在多個 subdirs 中時,它會忽略 conftest.py。

  • improve assertions (“not in”),感謝 Floris Bruynooghe

  • improve behaviour/warnings 當在 “python -OO” 之上執行時 (assertions 和 docstrings 已關閉,導致 potential false positives)

  • 引入 pytest_cmdline_processargs(args) hook 以允許 dynamic computation of command line arguments。這修復了一個 regression,因為 2.0 之前的 py.test 允許從 conftest.py 檔案設定 command line options,而到目前為止 pytest-2.0 僅允許從 ini-files 設定。

  • 修正 issue7:doctest modules 中的 assert failures。doctests 中 unexpected failures 通常會顯示 nicer,即在 doctest failing context 中。

  • 修正 issue9:xfail-marked 測試的 setup/teardown functions 如果失敗,將 report as xfail,但如果成功,則 report as normally passing (not xpassing)。這僅適用於 “direct” setup/teardown invocations,因為 teardown_class/ teardown_module 無法與 single test 密切相關。

  • 修正 issue14:在 process exit 時 no logging errors

  • refinements to “collecting” output 在 non-ttys 上

  • refine internal plugin registration 和 –traceconfig output

  • 引入一種 mechanism 以 prevent/unregister plugins 從 command line,請參閱 https://pytest.dev.org.tw/en/stable/how-to/plugins.html#cmdunregister

  • activate resultlog plugin by default

  • 修正 wrt yielded tests 的 regression,由於 collection-before-running semantics,因此未像 pytest 1.3.4 那樣 setup。但是請注意,執行測試 parameterization 的 recommended 和 much cleaner way 仍然是 “pytest_generate_tests” mechanism,請參閱 docs。

2.0.0 (2010-11-25)

  • pytest-2.0 現在是其 own package,並且依賴 pylib-2.0

  • 新功能:python -m pytest / python -m pytest.main 功能

  • 新 python invocation:pytest.main(args, plugins) 以 early 載入一些 custom plugins。

  • try harder 以更相容的方式執行 unittest test suites,方法是將 setup/teardown semantics deferring 到 unittest package。 also work harder 以執行 twisted/trial 和 Django tests,這些 tests 現在基本上應該預設可以運作。

  • 引入一種新方法來透過 ini 樣式檔案設定組態選項,預設會搜尋 setup.cfg 和 tox.ini 檔案。舊方法 (特定的環境變數、動態 conftest.py 讀取) 已移除。

  • 新增一個 “-q” 選項,可降低詳細程度,並印出更像 nose/unittest 風格的 “點” 輸出。

  • 修正 issue135 - 標記現在也適用於 unittest 測試案例

  • 修正 issue126 - 引入 py.test.set_trace() 以在測試執行期間,即使正在進行擷取時,也能透過 PDB 追蹤執行。

  • 修正 issue123 - py.test 的新 “python -m py.test” 呼叫方式 (需要 Python 2.5 或以上版本)

  • 修正 issue124 - 使報告更能抵抗測試在檔案描述符 1 (stdout) 上開啟檔案的情況。

  • 修正 issue109 - 同層級的 conftest.py 檔案將不會被載入。(而且目錄收集器無法再從目錄的 conftest.py 檔案中自訂 - 這需要至少在高一層級進行)。

  • 引入 (可自訂的) 斷言失敗表示法,並增強比較和其他情況下斷言失敗的輸出 (Floris Bruynooghe)

  • nose-plugin: 傳遞 setup/teardown 函數中的類型簽章失敗,而不是不呼叫它們 (Ed Singleton)

  • 移除 py.test.collect.Directory (源於集合流程的重大重構和簡化)

  • 大幅減少 py.test 核心程式碼,將函數/python 測試轉移到自己的外掛程式

  • 修正 issue88 (從命令列引數尋找自訂測試節點)

  • 改進 ‘tmpdir’ 的建立,現在將建立與測試名稱更相關聯的基名 (感謝 Ronny)

  • “xpass” (非預期的通過) 測試不會導致 exitcode!=0

  • 修正 issue131 / issue60 - 在用作命名空間套件的 __init__ 檔案中匯入 doctests

  • 修正 issue93 在匯入 conftest.py 時擷取 stdout/stderr

  • 修正錯誤:unittest 收集的函數現在也可以在類別/模組層級套用 “pytestmark”

  • 新增在 cached_setup 輔助程式中使用 “類別” 層級的能力

  • 修正奇怪之處:mark.* 物件現在是不可變的,建立新的實例

1.3.4 (2010-09-14)

  • 修正 issue111:改進 windows 的安裝文件

  • 修正 issue119:修正 __init__.py 作為模組的自訂可收集性

  • 修正 issue116:–doctestmodules 也適用於 __init__.py 檔案

  • 修正 issue115:統一內部異常傳遞/捕獲/GeneratorExit

  • 修正 issue118:新的 –tb=native 選項,用於呈現 cpython 標準異常

1.3.3 (2010-07-30)

  • 修正 issue113:三引號字串 (以及可能其他情況) 的斷言表示問題

  • 使 conftest 載入偵測到具有相同內容的 conftest 檔案已載入,避免在巢狀目錄結構中產生意外,例如 Hudson 可能會產生這種情況。這可能會消除在大多數情況下使用 –confcutdir 的需求。

  • 修正 win32 的終端機著色問題 (感謝 Michael Foord 的報告)

  • 修正怪異之處:使終端機寬度偵測在 stdout 而非 stdin 上運作 (感謝 Armin Ronacher 的報告)

  • 移除所有 py/text 發行檔案中的尾隨空白

1.3.2 (2010-07-08)

新功能

  • 修正 issue103:引入 py.test.raises 作為上下文管理器,範例

    with py.test.raises(ZeroDivisionError):
        x = 0
        1 / x
    
    with py.test.raises(RuntimeError) as excinfo:
        call_something()
    
    # you may do extra checks on excinfo.value|type|traceback here
    

    (感謝 Ronny Pfannschmidt)

  • Funcarg 工廠現在可以動態地將標記套用至測試調用。例如,如果工廠為預期會失敗的測試提供參數,這會很有用

    def pytest_funcarg__arg(request):
        request.applymarker(py.test.mark.xfail(reason="flaky config"))
        ...
    
    def test_function(arg):
        ...
    
  • 改進收集和匯入錯誤的錯誤報告。這利用了更通用的機制,也就是對於自訂測試項目/收集節點,現在會統一呼叫 node.repr_failure(excinfo),以便您可以覆寫它以傳回您選擇的字串錯誤表示法,該表示法將以 (紅色) 字串的形式報告。

  • 引入 ‘–junitprefix=STR’ 選項,將前綴附加到 junitxml 檔案中的所有報告。

Bug 修正

  • 使測試和 pytest_recwarn 外掛程式特別完全相容於 Python2.7 (如果您使用 recwarn funcarg,將啟用警告,以便您可以正確地以跨 python 的方式檢查它們是否存在)。

  • 改進 –pdb:忽略 xfailed 測試,統一其 TB 報告,且不再在結尾再次顯示失敗。

  • 修正使用 ** 運算子的斷言解讀 (感謝 Benjamin Peterson)

  • 修正 issue105 與失敗斷言在同一行上的賦值 (感謝 Benjamin Peterson)

  • 修正 issue104 junitxml 外掛程式中測試名稱的正確逸出 (感謝匿名人士)

  • 修正 issue57 -f|–looponfail 以與 xpassing 測試搭配運作 (感謝 Ronny)

  • 修正 issue92 collectonly 報告器和 –pastebin (感謝 Benjamin Peterson)

  • 修正 py.code.compile(source) 以產生唯一檔案名稱

  • 修正 PyPy 上的斷言重新解讀問題,方法是將程式碼編譯延遲到 (可覆寫的) Frame.eval 類別。(感謝 Amaury Forgeot)

  • 修正 py.path.local.pyimport() 以與目錄搭配運作

  • 簡化 py.path.local.mkdtemp 實作和用法

  • 顯示 junitxml 檔案名稱時,不要印出空行

  • 為 py.path.local.remove 新增選用的布林值 ignore_errors 參數

  • 修正 win32/python2.4 上的終端機寫入問題

  • py.process.cmdexec() 現在更努力嘗試在所有 python 版本上傳回正確編碼的 unicode 物件

  • 也為 Jython 安裝純 py.test/py.which 腳本,這有助於在 virtualenv 情況下取得標準腳本路徑

  • 使 path.bestrelpath(path) 傳回 “.”,請注意,當呼叫 X.bestrelpath 時,假設 X 是目錄。

  • 使初始 conftest 探索忽略 “–” 前綴引數

  • 修正在 multicpu/multihost xdist 情況下使用的 resultlog 外掛程式 (感謝 Jakub Gustak)

  • 在 xdist-plugin 中執行分散式測試相關報告,而不是在通用 py.test 發行版中包含 dist 相關程式碼

  • 修正 Windows 上的 homedir 偵測

  • 發布 distribute_setup.py 版本 0.6.13

1.3.1 (2010-05-25)

新功能

  • issue91:引入新的 py.test.xfail(reason) 輔助程式,以命令式地將測試標記為預期會失敗。可以從 setup 和測試函數內部使用。這對於參數化測試特別有用,在參數化測試中,某些組態預期會失敗。在這種情況下,無法使用 @py.test.mark.xfail 的宣告方法,因為它會將所有組態標記為 xfail。

  • issue102:引入新的 –maxfail=NUM 選項,在 NUM 次失敗後停止測試執行。這是 ‘-x’ 或 ‘–exitfirst’ 選項的通用化,現在等效於 ‘–maxfail=1’。’-x’ 和 ‘–maxfail’ 現在也都會在接近結尾處印出一行,指示中斷。

  • issue89:允許在類別上使用 py.test.mark 裝飾器 (類別裝飾器是在 python2.6 中引入的),也允許透過指定清單,在類別/模組層級套用多個標記。

  • 改進並改進進度列中的字母報告:. 通過 f 失敗測試 s 跳過測試 (提醒:僅用於依賴性/平台不符) x xfailed 測試 (預期會失敗的測試) X xpassed 測試 (預期會失敗但通過的測試)

    您可以將 ‘fsxX’ 的任何組合與 ‘-r’ 擴充報告選項搭配使用。xfail/xpass 結果將在 junitxml 輸出中顯示為跳過的測試 - 這也修正了 issue99。

  • 使 py.test.cmdline.main() 傳回 exitstatus 而不是引發 SystemExit,並允許多次呼叫它。當然,這需要您的應用程式和測試已正確拆解,且沒有全域狀態。

錯誤修正

  • 改進的追溯呈現:- 改進並統一 “–tb=short” 選項的報告 - 測試模組匯入期間的錯誤更短,(使用 –tb=short 樣式) - raises 顯示更短、更相關的追溯 - –fulltrace 現在更系統地延長追溯/禁止截斷

  • 透過操作 python 的 linecache.cache 而不是先前相當粗糙的建立自訂程式碼物件的方式,改進對 raises 和其他動態編譯程式碼的支援。這使其在 Jython 和 PyPy 上無縫運作,而先前在這些平台上無法運作。

  • 修正 issue96:使擷取更能抵抗 Control-C 中斷 (涉及對基礎擷取功能進行相當大的重構,以避免競爭條件)。

  • 修正條件式 skipif/xfail 裝飾器的鏈結 - 因此現在可以如預期般使用多個 @py.test.mark.skipif(condition) 裝飾器,包括特定報告,指出哪個條件導致跳過。

  • 修正 issue95:延遲匯入 zlib,使其不是一般 py.test 啟動的必要條件。

  • 修正 issue94:使報告更能抵抗偽造的原始碼 (並在內部呈現非預期的位元組序列時更加小心)

1.3.0 (2010-05-05)

  • 棄用 –report 選項,改用新的更短且更容易記住的 -r 選項:它接受一個字串引數,該引數由 ‘xfsX’ 字元的任何組合組成。它們與您在點狀進度列印期間看到的單個字元相關,並且會在測試執行結束時,為每個測試印出一行額外行。此額外行指示您可以直接貼到 py.test cmdline 的確切位置或測試 ID,以便重新執行特定測試。

  • 允許外部外掛程式透過新的 pytest_addhooks(pluginmanager) hook 註冊新的 hooks。用於分散式和 looponfailing 測試的 pytest-xdist 外掛程式的新版本需要此功能。

  • 新增新的 pytest_ignore_collect(path, config) hook,以允許專案和外掛程式為其目錄結構定義排除行為 - 例如,您可以在 conftest.py 中定義此方法

    def pytest_ignore_collect(path):
        return path.check(link=1)
    

    以防止甚至嘗試收集符號連結目錄中的任何測試。

  • 新的 pytest_pycollect_makemodule(path, parent) hook,用於允許自訂符合的測試模組的模組收集物件。

  • 擴充和改進 xfail 機制:@py.test.mark.xfail(run=False) 不執行裝飾的測試 @py.test.mark.xfail(reason="...") 在 xfail 摘要中印出原因字串,在命令列上指定 --runxfail 實際上會忽略 xfail 標記

  • 公開 (先前為內部) 常用的方法:py.io.get_terminal_with() -> 傳回終端機寬度 py.io.ansi_print(…) -> 在 linux/win32 上印出彩色/粗體文字 py.io.saferepr(obj) -> 傳回有限的表示字串

  • 將測試結果相關的例外公開為 py.test.skip.Exception、py.test.raises.Exception 等,主要對執行特殊結果解讀/調整的外掛程式有用

  • (issue85) 修正 junitxml 外掛程式以處理具有非 ascii 輸出的測試

  • 修正/改進 python3 相容性 (感謝 Benjamin Peterson)

  • 修正使 jython/win32 組合運作的問題,但請注意:jython2.5.1/win32 未提供命令列啟動器,請參閱 https://bugs.jython.org/issue1491 。請參閱 pylib 安裝文件,以了解如何解決。

  • 修正處理 unicode 例外值和無法列印的物件的問題

  • (issue87) 修正 assertionold 程式碼中的 unboundlocal 錯誤

  • (issue86) 改進 looponfailing 的文件

  • 改進 IO 擷取:stdin-redirect 偽檔案現在具有 NOP close() 方法

  • 發布 distribute_setup.py 版本 0.6.10

  • 新增指向新的 capturelog 和 coverage 外掛程式的連結

1.2.0 (2010-01-18)

  • 改進 “py.cleanup” 的用法和選項

    py.cleanup     # remove "*.pyc" and "*$py.class" (jython) files
    py.cleanup -e .swp -e .cache # also remove files with these extensions
    py.cleanup -s  # remove "build" and "dist" directory next to setup.py files
    py.cleanup -d  # also remove empty directories
    py.cleanup -a  # synonym for "-s -d -e 'pip-log.txt'"
    py.cleanup -n  # dry run, only show what would be removed
    
  • 新增一個新選項 “py.test –funcargs”,它會顯示給定測試路徑的可用 funcargs 及其說明字串 (其各自工廠函數上的 docstrings)

  • 如果 funcarg 查找失敗,則顯示簡短而簡潔的追溯

  • 在非點開頭的第一層子目錄中提前載入 “conftest.py” 檔案。允許在 test 子目錄中方便地保留和存取測試相關選項,並且仍然新增命令列選項。

  • 修正 issue67:新的超短追溯列印選項:“–tb=line” 將為每個失敗的 (python) 測試印出一行,指示其檔案名稱、行號和失敗值

  • 修正 issue78:即使對應的 setup 失敗,也始終呼叫 python 層級的 teardown 函數。這包括改進呼叫 setup_module/class 函數,現在只會呼叫一次,而不是先前的行為,如果它們引發例外 (包括 Skipped 例外),則會多次呼叫它們。任何例外都會被重新記錄,並與對應模組/類別範圍中的所有測試相關聯。

  • 修正 issue63:假設 <40 欄是偽造的終端機寬度,預設為 80

  • 修正 pdb 偵錯以在 raises 相關錯誤的正確框架中進行

  • 更新 apipkg.py 以修正在遞迴匯入可能不必要地中斷匯入的問題

  • 修正外掛程式連結

1.1.1 (2009-11-24)

  • 將 dist/looponfailing 從 py.test 核心移至新的獨立發布的 pytest-xdist 外掛程式。

  • 新的 junitxml 外掛程式:–junitxml=path 將產生 junit 樣式的 xml 檔案,例如 Hudson CI 系統可以處理該檔案。

  • 新選項:–genscript=path 將產生一個獨立的 py.test 腳本,該腳本不需要安裝任何程式庫。感謝 Ralf Schmitt。

  • 新選項:–ignore 將防止收集指定的路徑。可以多次指定。

  • 新選項:–confcutdir=dir 將使 py.test 僅考慮相對於指定目錄的 conftest 檔案。

  • 新的 funcarg:“pytestconfig” 是 pytest 組態物件,用於存取命令列引數,現在可以輕鬆地在測試中使用。

  • 安裝 py.testpy.which 時帶有 -$VERSION 後綴,以消除 Python3、python2.X、Jython 和 PyPy 已安裝版本之間的歧義。

  • 新的 “pytestconfig” funcarg 允許存取測試組態物件

  • 新的 “pytest_report_header” hook 可以傳回額外行,以顯示在測試執行的標頭中。

  • (實驗性) 允許 “py.test path::name1::name2::…” 直接指向測試集合中的測試。這最終可能會演變為完全替代 “-k” 規格。

  • 簡化外掛程式載入:順序現在如 customize.html 中所述:setuptools、ENV、命令列、conftest。setuptools 進入點名稱也已轉換為標準名稱 (“pytest_*”)

  • 自動跳過需要 ‘capfd’ 但沒有 os.dup 的測試

  • 允許在類別中定義 pytest_generate_tests

  • 棄用使用 ‘disabled’ 屬性,改用 pytestmark

  • 棄用在 conftest.py 檔案中定義 Directory、Module、Class 和 Function 節點。改用 pytest collect hooks。

  • collection/item 節點特定的 runtest/collect hooks 僅在完全符合的 conftest.py 檔案上呼叫,即位於項目檔案系統路徑正下方的檔案

  • 變更:第一個傳回某些內容的 pytest_collect_directory hook 現在將阻止呼叫進一步的 hooks。

  • 變更:figleaf 外掛程式現在需要 –figleaf 才能執行。也將其長命令列選項變更為稍短一些 (請參閱 py.test -h)。

  • 變更:pytest doctest 外掛程式現在預設為啟用,並具有一個新選項 –doctest-glob,用於設定檔案比對的模式。

  • 變更:移除內部 py._* 輔助變數,僅保留 py._pydir

  • 增強擷取的穩健性,以在自訂 pytest_runtest_setup 程式碼失敗並阻止擷取 setup 程式碼執行時倖存下來。

  • 使預設外掛程式提供的 py.test.* 輔助程式提早可見 - 對於 pydoc 和互動式會話都透明地運作,這些會話將定期看到例如 py.test.mark 和 py.test.importorskip。

  • 簡化內部外掛程式管理器機制

  • 透過引入 RootCollector 節點來簡化內部收集樹狀結構

  • 修正斷言重新解讀,該解讀會看到包含 “keyword=…” 的呼叫

  • 修正 issue66:在 dist-testing 期間的工作節點上調用 pytest_sessionstart 和 pytest_sessionfinish hooks,正確報告模組/會話 teardown hooks。

  • 修正 issue65:如果遠端未安裝 execnet/py 程式庫,則正確處理 dist-testing。

  • 如果沒有 execnet 可用,則跳過一些安裝測試

  • 修正文件,修正內部 bin/ 腳本產生

1.1.0 (2009-11-05)

  • 透過 setuptools’ pkg_resources.iter_entry_points 引入透過 ‘pytest11’ 進入點自動外掛程式註冊

  • 修正 py.test dist-testing 以與 execnet >= 1.0.0b4 搭配運作

  • 重新引入 py.test.cmdline.main() 以獲得更好的向後相容性

  • svn 路徑:修正 svn 路徑的 path.check(versioned=True) 的錯誤,允許 svn 路徑中的 ‘%’,使 svnwc.update() 預設為像 1.0.x 中的互動模式,並新增 svnwc.update(interactive=False) 以禁止互動。

  • 改進分散式 tarball 以包含測試且不包含 pyc 檔案

  • 更努力地使 py.compat.* 存取的棄用警告報告正確的位置

1.0.3

  • 調整和改進文件

  • 移除 py.rest 工具和內部命名空間 - 它從未真正宣傳過,如果需要,仍然可以使用舊版本。如果有人感興趣,它可以恢復為自己的工具。

  • 修正 issue48 和 issue59:如果從匯入的測試檔案中的模組似乎不是來自檔案路徑,則引發 Error - 避免重複報告的 “同名” 混淆

  • 合併 Ronny 的 nose 相容性 hack:現在支援 nose 風格的 setup_module() 和 setup() 函數

  • 引入廣義的 py.test.mark 函數標記

  • 重新調整/改進命令列分組

  • 棄用 parser.addgroup,改用 getgroup,後者會建立選項群組

  • 新增 –report 命令列選項,允許控制跳過/xfail 區段的顯示

  • 廣義的跳過:一種新的方法,用於基於平台或 sys-module 屬性,在函數、類別和模組層級使用 skipif 或 xfail 標記 python 函數。

  • 擴充 py.test.mark 裝飾器以允許位置引數

  • 引入並測試 “py.cleanup -d” 以移除空目錄

  • 修正 issue #59 - 增強 unittest 測試收集的穩健性

  • 透過將 __all__ 屬性新增至 ApiModule,簡化 initpkg,使 bpython/help 互動運作

  • 對 pylib 使用 MIT 授權,新增一些貢獻者

  • 移除 py.execnet 程式碼,並用 ‘execnet’ proper 替換所有用法

  • 修正 issue50 - cached_setup 現在更符合預期地快取具有多個引數的測試函數。

  • 合併 Jarko 的修正,issue #45 和 #46

  • 新增為 py.lookup 指定搜尋路徑的能力

  • 修正 funcarg cached_setup 錯誤,該錯誤可能僅在分散式測試和具有 teardown 的 “module” 範圍中發生。

  • 許多修正和變更,以使程式碼庫與 python3 相容,非常感謝 Benjamin Peterson 在這方面的幫助。

  • 合併 builtins 實作以與 >=2.3 相容,新增輔助程式以簡化保持 2 和 3k 相容的程式碼

  • 棄用 py.compat.doctest|subprocess|textwrap|optparse

  • 棄用 py.magic.autopath,移除 py/magic 目錄

  • 將 pytest 斷言處理移至 py/code 和 pytest_assertion 外掛程式,新增 “–no-assert” 選項,棄用 py.magic 命名空間,改用 (較少的) py.code 命名空間。

  • 合併和清理 py/code 類別和檔案

  • 清理 py/misc,將測試移至 bin-for-dist

  • 將 delattr/delitem/delenv 方法引入 py.test 的 monkeypatch funcarg

  • 合併 py.log 實作,移除舊方法。

  • 引入 py.io.TextIO 和 py.io.BytesIO 以區分文字/unicode 和位元組串流 (如果可用,則使用基礎標準程式庫 io.*)

  • 提供 py.unittest_convert 輔助腳本,該腳本將 “unittest.py” 樣式檔案轉換為更簡單的 assert/direct-test-classes py.test/nosetests 樣式。該腳本由 Laura Creighton 編寫。

  • 簡化內部 localpath 實作

1.0.2 (2009-08-27)

  • 修正封裝問題,由 fedora redhat 封裝觸發,也將 doc、examples 和 contrib 目錄新增至 tarball。

  • 新增指向新的 django 外掛程式的文件連結。

1.0.1 (2009-08-19)

  • 新增 ‘pytest_nose’ 外掛程式,該外掛程式處理 nose.SkipTest、nose 風格的函數/方法/產生器 setup/teardown,並嘗試正確報告函數。

  • 更好地擷取 unicode 寫入或編碼字串到 sys.stdout/err,終端機寫入也已調整,並在 windows 和 linux 之間在某種程度上統一。

  • 大幅改進文件版面配置和內容

  • 新增 “–help-config” 選項,以顯示所有 longopt cmdline 選項的 conftest.py / ENV-var 名稱,以及一些特殊的 conftest.py 變數。相應地將 ‘conf_capture’ conftest 設定重新命名為 ‘option_capture’。

  • 修正 issue #27:更好地報告在命令列上給定的不可收集項目 (例如 pyc 檔案)

  • 修正 issue #33:新增 –version 標誌 (感謝 Benjamin Peterson)

  • 修正 issue #32:為 wcpath.status() 新增對 “不完整” 路徑的支援

  • 如果 “Test” 前綴類別具有 __init__ 方法,則預設情況下不再收集它們

  • monkeypatch setenv() 現在接受 “prepend” 參數

  • 改進收集錯誤追溯的報告

  • 簡化 multicall 機制和外掛程式架構,重新命名一些內部方法和引數名稱

1.0.0 (2009-08-04)

  • 更簡潔的報告嘗試顯示相對於目前目錄的檔案系統路徑

  • 稍微改進 xfail 輸出

1.0.0b9 (2009-07-31)

  • 乾淨地處理和報告測試 setup 的最終 teardown

  • 修正 py.path.svnwc().versioned() 的 svn-1.6 相容性問題 (感謝 Wouter Vanden Hove)

  • setup/teardown 或收集問題現在顯示為 ERROR 或進度行中的大 “E”。它們會被單獨報告和計數。

  • dist-testing:正確處理在本機收集但無法在遠端收集的測試項目 - 通常是由於平台/依賴性原因

  • 簡化 py.test.mark API - 請參閱 keyword 外掛程式文件

  • 更好地與記錄整合:擷取現在預設情況下在單個串流中擷取測試函數及其直接 setup/teardown

  • capsys 和 capfd funcargs 現在具有 readouterr() 和 close() 方法 (基礎地使用 py.io.StdCapture/FD 物件,它們也擴充了 readouterr() 方法,以傳回擷取的 out/err 快照)

  • 使斷言重新解讀在比較不傳回布林值的比較中更好地運作 (從 numpy 報告,感謝 maciej fijalkowski)

  • 將每個測試的輸出擷取重新設計到 pytest_iocapture.py 外掛程式中,因此從組態物件中移除擷取程式碼

  • item.repr_failure(excinfo) 而不是 item.repr_failure(excinfo, outerr)

1.0.0b8 (2009-07-22)

  • pytest_unittest-plugin 現在預設為啟用

  • 引入 pytest_keyboardinterrupt hook 並改進 pytest_sessionfinish hooked,新增測試。

  • 解決有錯誤的記錄模組互動 (“關閉已關閉的檔案”)。感謝 Sridhar Ratnakumar 觸發。

  • 如果外掛程式使用 “py.test.importorskip” 匯入依賴性,則只會發出警告,而不是結束測試程序。

  • 文件的許多改進:- 改進 funcargs 文件,使用術語 “factory” 而不是 “provider” - 新增新的演講/教學文件頁面 - 更好的下載頁面 - 更好的外掛程式 docstrings - 新增新的外掛程式頁面和自動文件產生腳本

  • 修正與部分失敗的 funcarg setups 相關的 teardown 問題 (感謝 MrTopf 的報告),“pytest_runtest_teardown” 現在始終被調用,即使 “pytest_runtest_setup” 失敗。

  • 調整 py 模組中 docstrings 的 doctest 輸出,感謝 Radomir。

1.0.0b7

  • 將 py.test.xfail 重新命名回 py.test.mark.xfail,以避免兩種裝飾 xfail 的方式

  • 重新新增 py.test.mark 裝飾器,用於在函數上設定關鍵字 (它實際上已記錄在案,因此移除它是不好的)

  • 從 request.addfinalizer() 中移除 scope 引數,因為 request.cached_setup 具有 scope 引數。TOOWTDI。

  • 在報告失敗之前執行 setup 完成

  • 套用 Andreas Kloeckner 修改的修補程式,以允許測試函數沒有 func_code (#22),並使 “-k” 和函數關鍵字運作 (#20)

  • 套用 Daniel Peolzleithner 的修補程式 (issue #23)

  • 解決 issue #18,multiprocessing.Manager() 和重新導向衝突

  • 使 __name__ == “__channelexec__” 用於 remote_exec 程式碼

1.0.0b3 (2009-06-19)

  • 外掛程式類別已移除:現在可以直接在 conftest.py 或全域 pytest_*.py 檔案中定義 hooks。

  • 新增新的 pytest_namespace(config) hook,允許直接將輔助程式注入到 py.test.* 命名空間。

  • 記錄和改進了許多 hooks

  • 透過 pytest_generate_tests hook 新增產生式測試的新樣式,該樣式與函數引數良好整合。

1.0.0b1

  • 引入新的 “funcarg” setup 方法,請參閱 doc/test/funcarg.txt

  • 引入外掛程式架構和許多新的 py.test 外掛程式,請參閱 doc/test/plugins.txt

  • 保證在測試方法執行後呼叫 teardown_method。

  • 新方法:py.test.importorskip(mod,minversion) 將匯入或呼叫 py.test.skip()

  • 完全修訂內部 py.test 架構

  • 新的 py.process.ForkedFunc 物件,允許將函數的執行 fork 到子程序,並取回結果。

XXX 此處遺失了很多內容 XXX

0.9.2

  • 改進安裝和中繼資料,建立新的 setup.py,現在基於 setuptools/ez_setup (感謝 Ralf Schmitt 的支援)。

  • 改進在 windows 環境中提供 py.* 腳本的方式,它們現在以 “.cmd” 檔案的形式新增到 Scripts 目錄。

  • py.path.svnwc.status() 現在更完整,並使用來自 ‘svn’ 命令的 xml 輸出 (如果可用) (Guido Wesdorp)

  • 修正 py.path.svn* 以與 svn 1.5 搭配運作 (Chris Lamb)

  • 修正在 windows 上,path.relto(otherpath) 方法使用 normcase 來檢查路徑是否為相對路徑。

  • py.test 的追溯更容易從編輯器解析 (遵循 filenames:LINENO: MSG 慣例) (感謝 Osmo Salomaa)

  • 修正 javascript 產生,“py.test –runbrowser” 現在應更可靠地運作

  • 移除先前意外新增的 py.test.broken 和 py.test.notimplemented 輔助程式。

  • 現在有一個 py.__version__ 屬性

0.9.1

這是 v0.9.1 的相當完整的清單,可以作為開發人員的參考。

  • 允許 py.path.svn urls 中使用 + 號 [39106]

  • 修正在 py.test 中,對沒有 excinfo 的 Failed 例外的支援 [39340]

  • 在 py.misc.killproc 中,為 Windows (以及支援 os.kill 的平台) 新增了對終止程序的支援 [39655]

  • 為 py.test 中的產生式測試新增 setup/teardown [40702]

  • 為 py.test 新增 FAILED TO LOAD MODULE 的偵測 [40703, 40738, 40739]

  • 修正在 py.path 中,在非版本控制檔案的 wcpaths 上呼叫 .remove() 的問題 [44248]

  • 修正 py.test 中的一些匯入和繼承問題 [41480, 44648, 44655]

  • 當 pypy 可用但沒有 stackless 時,無法執行 greenlet 測試 [45294]

  • rsession 測試中的小修正 [45295]

  • 修正 py.test 中 2.5 類型表示的問題 [45483, 45484]

  • 使得內部報告問題顯示在 py.test 中以原子方式完成 [45518]

  • 使得 py.lookup 腳本忽略不存在的檔案 [45519]

  • 改進 py.test 中的例外名稱建立 [45535]

  • 使得在 execnet 中使用較少的執行緒 [合併於 45539]

  • 移除原子報告問題顯示在 py.test 中所需的鎖定 [45545]

  • 從 execnet 中移除全域變數 [45541, 45547]

  • 重構清理機制,使得 setDaemon 設定為 1,以使 atexit 在 2.5 (py.execnet) 中被呼叫 [45548]

  • 修正在 py.execnet 的 servemain 中聯接執行緒的錯誤 [45549]

  • 重構 py.test.rsession 測試,使其不再依賴確切的輸出格式 [45646]

  • 在測試結果上使用 repr() [45647]

  • 為 py.test.skip() 新增 ‘Reason’ 類別 [45648, 45649]

  • 在 py.test.collect 中終止了一些不必要的健全性檢查 [45655]

  • 避免在 py.io.fdcapture 中使用 os.tmpfile(),因為在 Windows 上,它僅供管理員使用 [45901]

  • 為 py.path.svnwc 新增對鎖定和非遞迴提交的支援 [45994]

  • 鎖定 py.execnet 中的檔案,以防止 CPython 發生區段錯誤 [46010]

  • 為 py.path.svnurl 新增 export() 方法

  • 修正在 py.test 中的 -d -x [47277]

  • 修正 py.path.svnwc 中的引數串連問題 [49423]

  • 還原 py.test 行為,當存在失敗時,它會以程式碼 1 結束 [49974]

  • 不要在沒有附帶 .txt 檔案的 html 檔案上失敗 [50606]

  • 修正 ‘utestconvert.py < input’ [50645]

  • py.code.source 中程式碼縮排的小修正 [50755]

  • 修正 _docgen.py 文件建置 [51285]

  • 改進 py.test 中程式碼區塊的原始碼表示的檢查 [51292]

  • 新增對將驗證傳遞至 py.path.svn* 物件的支援 [52000, 52001]

  • 移除 py.apigen 測試的 sorted() 呼叫,改用 [].sort() 以支援 Python 2.3 [52481]