更新日誌¶
版本遵循語義化版本控制 (<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 可能會崩潰的問題。
改進的文件¶
#12842:新增了關於在 pytest 中使用類型的專門頁面。
請參閱 pytest 中的類型標註 以了解詳細用法。
面向貢獻者的變更¶
pytest 8.3.4 (2024-12-01)¶
錯誤修復¶
#12592:修復了在目錄佈局中,當目錄包含同名子目錄時,使用
--import-mode=importlib
時的KeyError
崩潰。#12818:斷言重寫現在保留了原始指令的原始範圍,使其可以與處理
AST
的工具(如 executing)良好地協同工作。#12849:用於彩色輸出的 ANSI 轉義代碼現在在
pytest.fail()
與pytrace=False
中正確處理。#9353:
pytest.approx()
現在在給定布林值時使用嚴格相等。
改進的文件¶
#10558:修復了
pytest.Config.getoption()
的含糊不清的文檔字串。#12966:闡明了當使用多個 @pytest.mark.filterwarnings 標記時,關於過濾優先順序/順序的 @pytest.mark.filterwarnings 文檔。
面向貢獻者的變更¶
#12497:修復了 Python 3.13 上兩個與 pdb 相關的測試失敗。
pytest 8.3.3 (2024-09-09)¶
錯誤修復¶
#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
改進的文件¶
其他內部變更¶
#12769:修復了 codespell 發現的錯字,並將 codespell 新增到 pre-commit hooks。
pytest 8.3.2 (2024-07-24)¶
錯誤修復¶
#12652:解決了
conda
環境不再被自動偵測到的回歸問題。
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
、(未轉義的)str
、bool
和None
。請參閱 標記範例 以獲取更多資訊。
– 由 @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 中修復。
#11797:
pytest.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
#12577:
CI
和BUILD_NUMBER
環境變數的角色在參考文檔中描述。它們現在也出現在執行pytest -h
時 – 由 @MarcBresson。
面向貢獻者的變更¶
#12467:通過使用
annotations
未來導入,將所有內部類型註釋遷移到 python3.10+ 風格。#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
變更日誌片段類型,其含義不明確且廣泛。它已被移除,我們現在有contrib
、misc
和packaging
來代替它。新的變更說明類型針對下游封裝者和專案貢獻者。此外,雜項章節保留用於不適合任何其他地方的未指定更新。
– 由 @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)¶
錯誤修正¶
改進文件¶
pytest 8.2.1 (2024-05-19)¶
改進¶
#12334: 支援 Python 3.13(撰寫時為 beta1 版本)。
錯誤修正¶
微小/內部變更¶
#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 實作的影響最初未被適當考慮,這就是為什麼它在次要版本中完成的原因。對於造成的不便,我們深感抱歉。
棄用¶
#12069: 當以下 hook 之一的實作要求已棄用的
py.path.local
參數,而不是取代它的pathlib.Path
參數時,現在會引發棄用警告pytest_ignore_collect
-path
參數 - 請改用collection_path
。pytest_collect_file
-path
參數 - 請改用file_path
。pytest_pycollect_makemodule
-path
參數 - 請改用module_path
。pytest_report_header
-startdir
參數 - 請改用start_path
。pytest_report_collectionfinish
-startdir
參數 - 請改用start_path
。
替換參數自 pytest 7.0.0 起可用。舊參數將在 pytest 9.0.0 中移除。
有關更多詳細資訊,請參閱 用於 hook 的 py.path.local 參數已替換為 pathlib.Path。
新功能¶
改進¶
#11523: 如果找到模組,但引發
ImportError
而不是ModuleNotFoundError
,pytest.importorskip()
現在會發出警告。可以透過傳遞
exc_type=ImportError
給pytest.importorskip()
來抑制此警告。有關詳細資訊,請參閱 pytest.importorskip 關於 ImportError 的預設行為。
#11728: 對於基於
unittest
的測試,類別清理期間的例外狀況(由使用TestCase.addClassCleanup
註冊的函數引發)現在會被報告,而不是靜默失敗。#11777: 當給定
-vv
時,short test summary info
區段中的文字不再被截斷。#12112: 當啟用
consider_namespace_packages
時,改進命名空間套件偵測,涵蓋更多情況(例如可編輯安裝)。#9502: 新增
PYTEST_VERSION
環境變數,該變數在 pytest 會話開始時定義,並在之後取消定義。它包含pytest.__version__
的值,並且除其他外,可用於輕鬆檢查程式碼是否在 pytest 執行中執行。
錯誤修正¶
#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 的拆卸不會以它們初始化的相反順序發生的問題。
微小/內部變更¶
pytest 8.1.2 (2024-04-26)¶
錯誤修正¶
#12114: 修正
pytest.approx()
在與numpy
陣列一起使用並與其他類型比較時的錯誤。
pytest 8.1.1 (2024-03-08)¶
注意
此版本不是通常的錯誤修正版本 – 它包含新功能和改進,是 8.1.0
的後續版本,8.1.0
已從 PyPI 撤回。
新功能¶
#11475: 新增新的
consider_namespace_packages
組態選項,預設為False
。如果設定為
True
,pytest 將嘗試在匯入模組時識別屬於 命名空間套件 的模組。#11653: 新增新的
verbosity_test_cases
組態選項,用於精細控制測試執行詳細程度。有關更多詳細資訊,請參閱 精細詳細程度。
改進¶
#10865:
pytest.warns()
現在驗證是否使用str
或Warning
呼叫了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 (已撤回)¶
pytest 8.0.2 (2024-02-24)¶
錯誤修正¶
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)¶
錯誤修正¶
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 中新增評論。
版本相容性¶
#11151: 停止支援 Python 3.7,該版本已於 2023-06-27 達到生命週期結束。
現在需要
pluggy>=1.3.0
。
集合變更¶
在此版本中,我們對 pytest 的集合階段進行了數項重大變更,特別是關於檔案系統目錄和 Python 套件的集合方式,修正了缺陷,並允許清理和改進 pytest 的內部結構。這些變更無法進行停用期。
#7777:現在檔案和目錄會聯合依字母順序收集,除非被外掛程式變更。先前,檔案會在目錄之前收集。範例請見下方。
#8976:執行
pytest pkg/__init__.py
現在只會收集pkg/__init__.py
檔案(模組)。先前,它會收集整個pkg
套件,包括目錄中的其他測試檔案,但不包括__init__.py
檔案本身的測試(除非python_files
已變更為允許__init__.py
檔案)。若要收集整個套件,請僅指定目錄:
pytest pkg
。#11137:
pytest.Package
不再是pytest.Module
或pytest.File
。Package
收集器節點指定一個 Python 套件,也就是具有__init__.py
檔案的目錄。先前Package
是pytest.Module
的子類型(代表單一 Python 模組),該模組是__init__.py
檔案。這已被視為設計上的錯誤(詳情請參閱 #11137 和 #7777)。Package
節點的path
屬性現在指向套件目錄,而不是__init__.py
檔案。請注意,
__init__.py
的Module
節點(不是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:類別
Node
、Collector
、Item
、File
、FSCollector
現在標記為抽象類別(請參閱abc
)。我們預期此變更不會影響使用者和外掛程式作者,它只會在程式碼已經錯誤或有問題時才會導致錯誤。
其他重大變更¶
以下是無法進行停用的重大變更。
#11282:清理了定義組態選項時
default
參數的處理方式。先前,如果未為
parser.addini
提供default
,且組態選項值未在測試會期中定義,則呼叫config.getini
會傳回空列表或空字串,具體取決於是否提供了type
,這顯然是不正確的。此外,即使在使用default=None
明確定義選項時,None
也未被採納。現在
parser.addini
的行為如下如果未傳遞
default
但提供了type
,則會傳回類型特定的預設值。例如,type=bool
將傳回False
,type=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 以取得替代方案。#9288:
warns()
現在會在上下文關閉時重新發出不符的警告 – 先前它會消耗所有警告,隱藏那些未被函數比對到的警告。雖然這是一項新功能,但我們將其宣布為重大變更,因為許多測試套件都設定為在警告時產生錯誤,因此會在新重新發出的警告上失敗。
內部
FixtureManager.getfixtureclosure
方法已變更。使用此方法或繼承FixtureManager
並覆寫該方法的外掛程式將需要適應此變更。
停用¶
#10465:傳回
None
以外值的測試函數現在將發出pytest.PytestWarning
而不是pytest.PytestRemovedIn8Warning
,這表示這將保持為警告,而不是在未來成為錯誤。#3664:將標記應用於 fixture 函數現在會發出警告:fixture 中的標記從未產生任何效果,但將標記應用於 fixture(例如
usefixtures
)並期望它能運作是常見的使用者錯誤。這將在 pytest 9.0 中變成錯誤。
功能和改進¶
改進的差異¶
這些變更改進了 pytest 在斷言失敗時列印的差異。請注意,語法突顯需要 pygments
套件。
個別控制斷言詳細程度¶
#11387:新增了新的
verbosity_assertions
組態選項,用於精細控制失敗斷言的詳細程度。如果您曾經希望 pytest 始終向您顯示完整差異,但又不想讓其他所有內容都變得詳細,那麼這就是為您而設的。
請參閱 精細的詳細程度 以取得更多詳細資訊。
對於外掛程式作者,可以使用
config.get_verbosity
來檢索特定詳細程度類型的詳細程度。
對例外群組和 __notes__
的額外支援¶
這些變更改進了 pytest 對例外群組的支援。
#10441:新增了
ExceptionInfo.group_contains()
,一個斷言輔助函數,用於測試ExceptionGroup
是否包含符合的例外。範例請參閱 比對例外群組。
#11227:允許
pytest.raises()
match
引數比對PEP-678 <https://peps.python.org/pep-0678/>
__notes__
。
自訂目錄收集器¶
#7777:新增了新的 hook
pytest_collect_directory
,它由檔案系統遍歷收集器節點呼叫,例如pytest.Session
、pytest.Dir
和pytest.Package
,以便為子目錄建立收集器節點。它預期傳回pytest.Directory
的子類別。此 hook 允許外掛程式自訂目錄的集合。
「新樣式」Hook 包裝器¶
#11122:pytest 現在在內部使用「新樣式」hook 包裝器,自 pluggy 1.2.0 起可用。請參閱 pluggy 的 1.2.0 變更日誌和 更新的文件 以取得詳細資訊。
如果外掛程式想要使用新樣式包裝器,如果它們需要
pytest>=8
即可使用。
其他改進¶
#11216:如果測試是從 xunit setup fixture 內部跳過的,則測試摘要現在會顯示測試位置,而不是 fixture 位置。
#11314:使用
--log-file
選項記錄到檔案將使用--log-level
、--log-format
和--log-date-format
作為後備,如果未分別提供--log-file-level
、--log-file-format
和--log-file-date-format
。#11610:新增了
LogCaptureFixture.filtering()
上下文管理器,它將給定的logging.Filter
物件新增至caplog
fixture。#11447:
pytest.deprecated_call()
現在也將FutureWarning
類型的警告納入考量。#11600:改進了
pytest.mark.xfail
的condition
參數的文件和類型簽章,以使用False
作為預設值。#7469:
FixtureDef
現在匯出為pytest.FixtureDef
以用於類型標註。#11353:為
PytestPluginManager
新增了類型標註。
錯誤修正¶
#10701:
pytest.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_COLOR
和FORCE_COLOR
以忽略空值。#9036:
pytest.warns
和類似函數現在會在with
區塊內引發例外時捕獲警告。
改進的文件¶
瑣碎/內部變更¶
#11208:(內部)
FixtureDef.cached_result
類型已變更。現在第三個項目cached_result[2]
在設定時是例外實例,而不是例外三元組。#11218:(此條目旨在協助存取私有 pytest 內部結構以實例化
FixtureRequest
物件的外掛程式。)FixtureRequest
現在是一個抽象類別,無法直接實例化。已為測試函數中的request
fixture 新增了新的具體TopRequest
子類別FixtureRequest
,作為 fixture 函數中request
fixture 的現有SubRequest
子類別的對應物。#11315:
pytester
fixture 現在使用monkeypatch
fixture 來管理目前的工作目錄。如果您結合monkeypatch.undo()
使用pytester
,則 CWD 可能會還原。請改用monkeypatch.context()
。#11333:更正了
Config.ArgsSource.INVOCATION_DIR
的拼寫。先前的拼寫INCOVATION_DIR
仍然作為別名保留。#11638:修正了 selftest,以便在呼叫環境中設定
FORCE_COLOR
、NO_COLOR
或PY_COLORS
時正確通過。
pytest 7.4.4 (2023-12-31)¶
錯誤修正¶
#11140:修正了 Python>=3.8 上檔案頂部的非字串常數被偵測為文件字串的問題。
#11572:處理了
sys.stderr
和sys.__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.stderr
在sys.__stderr__
在 Fault Handler 關閉時可能已關閉的邊緣情況。
pytest 7.4.2 (2023-09-07)¶
錯誤修正¶
改進的文件¶
#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)¶
新功能¶
#10901: 新增了
ExceptionInfo.from_exception()
,一種從例外建立ExceptionInfo
的更簡單方法。這可以取代大多數情況下使用的ExceptionInfo.from_exc_info()
。
改進¶
#10872: 將測試日誌報告註解更新為具名元組,並修正了
pytest_report_teststatus
Hook 文件中的不一致之處。#10907: 當要顯示的例外追溯完全被過濾掉時(透過
__tracebackhide__
、內部框架和類似機制),現在只會顯示例外字串和以下訊息“所有追溯條目都已隱藏。傳遞
--full-trace
以查看隱藏和內部框架。”。先前,即使最後一幀追溯是隱藏的,也會顯示出來。
#10940: 透過執行文字換行,同時為進度輸出保留清晰的邊距,改進了
skip
和xfail
原因的詳細輸出 (-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
時,將無法編碼的文字寫入日誌檔案的問題。
改進的文件¶
#9146: 改進了
caplog.set_level()
的文件。
瑣碎/內部變更¶
#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 版)。
#10999:
monkeypatch
setitem
/delitem
型別註解現在允許TypedDict
引數。#11028: 修正了斷言重寫中的錯誤,其中使用海象運算子指定的變數稍後無法在函數呼叫中使用。
#11054: 修正了
--last-failed
的 “(跳過了 N 個檔案)” 功能對於套件內(具有__init__.py
檔案的目錄)的檔案。
pytest 7.3.1 (2023-04-14)¶
改進¶
錯誤修正¶
#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_count
和tmp_path_retention_policy
設定選項,以控制tmp_path
Fixture 建立的目錄的保留方式。
改進¶
#10226: 如果在 teardown 中引發多個錯誤,我們現在會重新引發它們的
ExceptionGroup
,而不是捨棄除了最後一個以外的所有錯誤。#10658: 允許
-p
引數包含空格 (例如:-p no:logging
而不是-pno:logging
)。在設定檔的addopts
區段中特別有用。#10710: 將
start
和stop
時間戳記新增至TestReport
物件。#10727: 分割
rootdir
、config file
和testpaths
的報告標頭,以便每個項目都有自己的行。#10840: pytest 不應再因具有病態位置屬性的 AST 而崩潰,例如測試由
Hylang <https://github.com/hylang/hy>__
產生的 AST。#6267: 如果截斷訊息比隱藏文字長,則不再截斷測試的完整輸出。顯示的行號也已修正。
錯誤修正¶
改進的文件¶
瑣碎/內部變更¶
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'。
改進的文件¶
pytest 7.2.1 (2023-01-13)¶
錯誤修正¶
pytest 7.2.0 (2022-10-23)¶
棄用¶
#10012: 將
pytest.PytestUnhandledCoroutineWarning
更新為棄用;它將在 pytest 8 中引發錯誤。#10396: pytest 不再依賴
py
函式庫。pytest
提供了py.error
和py.path
模組的供應商副本,但如果安裝了py
函式庫,則會使用它。 如果您需要其他py.*
模組,請繼續單獨安裝已棄用的py
函式庫,否則通常可以將其作為依賴項移除。#4562: 棄用使用屬性/標記設定 Hook 規格/實作。
請改用
pytest.hookimpl()
和pytest.hookspec()
。如需更多詳細資訊,請參閱 文件。#9886: 執行為
nose
撰寫的測試的功能已正式棄用。這包括
純
setup
和teardown
函數和方法:這可能會讓使用者感到驚訝,因為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
的替代方案。
錯誤修正¶
#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
的文件。
瑣碎/內部變更¶
pytest 7.1.3 (2022-08-31)¶
錯誤修正¶
改進的文件¶
瑣碎/內部變更¶
#10114:在 Windows 上,使用
os.replace
替換 atomicwrites 依賴項。
pytest 7.1.2 (2022-04-23)¶
錯誤修正¶
#9726:移除了
pytest.approx()
內部不必要的numpy
匯入。#9820:修復了
dataclasses
與InitVar
的比較。#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)¶
重大變更¶
改進¶
#5192:修復了某些資料類型的測試輸出,其中
-v
會顯示較少資訊。此外,當顯示序列的差異時,
-q
會產生完整差異,而不是預期的差異。#9362:當偵測到預設的
__eq__
在attrs
或dataclasses
中被覆寫時,pytest 現在會避免使用專門的斷言格式。#9536:當在命令列中給定
-vv
時,完整顯示跳過和 xfail 原因,而不是將它們截斷以符合終端機寬度。#9644:現在可以透過啟用
tracemalloc
,取得更多關於導致 Python 引發ResourceWarning
的資源位置的資訊。請參閱 資源警告 以取得更多資訊。
#9678:
@pytest.mark.parametrize
的ids
參數現在接受更多類型。先前僅接受str
、float
、int
和bool
;現在也接受bytes
、complex
、re.Pattern
、Enum
和任何具有__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=importlib
與PYTHONPATH
或pythonpath
一起使用時,會在測試套件中造成匯入錯誤的回歸問題。#9708:
pytester
現在請求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 中回歸。#9636:
pythonpath
外掛程式已重新命名為python_path
。這避免了與pytest-pythonpath
外掛程式發生衝突。#9642:修復了使用參數化部分中的
::
按 ID 執行測試的問題。#9643:延遲發出關於涉及
Item
和Collector
的菱形繼承的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.inifile
(7.0.0rc1
期間的回歸問題)。
改進的文件¶
瑣碎/內部變更¶
#9521:為斷言重寫路徑新增測試覆蓋率。
pytest 7.0.0rc1 (2021-12-06)¶
重大變更¶
#7259:Node.reportinfo() 函數的第一個回傳值類型已從
py.path.local | str
擴展到os.PathLike[str] | str
。大多數引用
reportinfo()
的外掛程式僅將其定義為自訂pytest.Item
實作的一部分。由於py.path.local
是os.PathLike[str]
,因此這些外掛程式不受影響。調用
reportinfo()
、使用第一個回傳值並將其作為py.path.local
互動的外掛程式和使用者,將需要透過調用py.path.local(fspath)
進行調整。雖然最好避免使用舊版的py.path.local
,並使用pathlib.Path
,或改用item.location
或item.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)
新的錯誤訊息有助於捕捉這些錯誤。
#9277:
pytest.Instance
收集器類型已被移除。匯入pytest.Instance
或_pytest.python.Instance
會回傳虛擬類型並發出棄用警告。有關詳細資訊,請參閱 pytest.Instance 收集器。#9308:PytestRemovedIn7Warning 棄用警告現在預設為錯誤。
根據我們盡可能減少中斷來移除棄用功能的計畫,所有
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 建構子已被棄用。有關完整詳細資訊,請參閱 棄用說明。#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 中還原。
#8315:
Parser.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
)現在會發出警告。它從未被合理地支援,並且會觸發難以偵錯的錯誤。請參閱 棄用說明 以取得完整詳細資訊。
#8592:
pytest_cmdline_preparse
已正式棄用。它將在未來的版本中移除。請改用pytest_load_initial_conftests
。請參閱 棄用說明 以取得完整詳細資訊。
#8645:
pytest.warns(None)
現在已被棄用,因為許多人使用它來表示「此程式碼不會發出警告」,但它實際上具有檢查程式碼是否發出至少一個任何類型警告的效果 - 就像pytest.warns()
或pytest.warns(Warning)
一樣。#8948:
pytest.skip(msg=...)
、pytest.fail(msg=...)
和pytest.exit(msg=...)
簽名現在接受reason
參數,而不是msg
。msg
仍然可以使用,但已被棄用,並將在未來的版本中移除。此變更旨在與
pytest.mark.skip
和pytest.mark.xfail
保持一致,它們都接受reason
作為參數。#8174:已對可透過
pytest.ExceptionInfo.traceback
存取的類型進行以下變更_pytest.code.Code
的path
屬性傳回Path
而不是py.path.local
。_pytest.code.TracebackEntry
的path
屬性傳回Path
而不是py.path.local
。
此變更沒有棄用期(抱歉!)。
功能¶
#5196:現在在更多情況下,測試會依定義順序排序。
在類別階層中,來自基底類別的測試現在會一致地排序在子類別上定義的測試之前(反向 MRO 順序)。
#7132:新增了兩個環境變數
PYTEST_THEME
和PYTEST_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.Config
,適用於Config
。pytest.Mark
,適用於marks
。pytest.MarkDecorator
,適用於mark decorators
。pytest.MarkGenerator
,適用於pytest.mark
單例。pytest.Metafunc
,適用於metafunc
引數,用於pytest_generate_tests
hook。pytest.CallInfo
,適用於傳遞給各種 hook 的CallInfo
類型。pytest.PytestPluginManager
,適用於PytestPluginManager
。pytest.ExceptionInfo
,適用於從pytest.raises()
傳回並傳遞給各種 hook 的ExceptionInfo
類型。pytest.Parser
,適用於傳遞給pytest_addoption
hook 的Parser
類型。pytest.OptionGroup
,適用於從parser.addgroup
方法傳回的OptionGroup
類型。pytest.HookRecorder
,適用於從Pytester
傳回的HookRecorder
類型。pytest.RecordedHookCall
,適用於從HookRecorder
傳回的RecordedHookCall
類型。pytest.LineMatcher
,適用於在RunResult
和其他類型中使用的LineMatcher
類型。pytest.TestReport
,適用於各種 hook 中使用的TestReport
類型。pytest.CollectReport
,適用於各種 hook 中使用的CollectReport
類型。
不支援直接建構它們中的大多數;它們僅適用於類型註解。這樣做會發出棄用警告,並可能在 pytest 8.0 中變成硬錯誤。
也不支援對它們進行子類別化。目前在執行階段不會強制執行此操作,但類型檢查器(例如 mypy)會偵測到。
#7856:--import-mode=importlib 現在適用於依賴模組位於
sys.modules
上的功能,例如pickle
和dataclasses
。#8144:以下 hook 現在接收額外的
pathlib.Path
參數,相當於現有的py.path.local
參數pytest_ignore_collect
-collection_path
參數(相當於現有的path
參數)。pytest_collect_file
-file_path
參數(相當於現有的path
參數)。pytest_pycollect_makemodule
-module_path
參數(相當於現有的path
參數)。pytest_report_header
-start_path
參數(相當於現有的startdir
參數)。pytest_report_collectionfinish
-start_path
參數(相當於現有的startdir
參數)。
#8251:將
Node.path
實作為pathlib.Path
。無論path
或fspath
(已棄用)是否傳遞給建構函式,都會設定舊的fspath
和這個新的屬性。它是fspath
屬性的替代品(它表示與py.path.local
相同的路徑)。雖然由於像reportinfo()
等方法的持續遷移,fspath
尚未棄用,但我們預計在未來的版本中將其棄用。#8421:
pytest.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
,這是一種讓外掛程式以類型安全且無衝突的方式將其資料儲存在Config
和Node
上的機制。請參閱 在跨 hook 函數的項目上儲存資料 以取得詳細資訊。#8953:
RunResult
方法assert_outcomes()
現在接受warnings
參數,以判斷所擷取的警告總數。#8954:
--debug
旗標現在接受str
檔案來將偵錯記錄路由到其中,預設仍為pytestdebug.log
。#9023:當在環境中找到
CI
或BUILD_NUMBER
時,即使未使用-v
,現在也始終顯示可迭代物件等式判斷提示的完整差異。#9113:
RunResult
方法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
,並且可以單獨使用。#9205:
pytest.Cache.set()
現在在儲存字典時會保留鍵順序。
錯誤修正¶
#7124:修正了在提供
--doctest-modules
時,__main__.py
會引發ImportError
的問題。#8061:修正了如果從父測試類別繼承
staticmethod
測試案例則會失敗的問題。#8192:
testdir.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 -k
和pytest -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 -k
和pytest -m
現在支援比對包含反斜線 (\
) 字元的名稱。 反斜線被視為字面意義,而不是跳脫字元(要比對的值已經被跳脫)。#8990: 修復了
pytest -vv
在某些情況下因內部異常AttributeError: 'str' object has no attribute 'relative_to'
而崩潰的問題。#9077: 修復了從 session 作用域的 fixture 存取
request.fspath
/request.path
時,令人困惑的錯誤訊息。#9163: 現在為重寫的 assert 語句正確設定了結束行號和結束欄位偏移量。
#9169: 支援重寫檔案中來自
importlib.resources
的files
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)¶
瑣碎/內部變更¶
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)¶
錯誤修正¶
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 的類型現在已匯出,因此可以在測試函式的類型註釋中使用它們。 新匯出的類型為
request
fixture 的pytest.FixtureRequest
。cache
fixture 的pytest.Cache
。capfdbinary
和capsysbinary
fixture 的pytest.CaptureFixture[bytes]
。caplog
fixture 的pytest.LogCaptureFixture
。pytester
fixture 的pytest.Pytester
。testdir
fixture 的pytest.Testdir
。tmpdir_factory
fixture 的pytest.TempdirFactory
。tmp_path_factory
fixture 的pytest.TempPathFactory
。monkeypatch
fixture 的pytest.MonkeyPatch
。recwarn
fixture 的pytest.WarningsRecorder
。
不支援建構它們(
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_path
和tmpdir
建立的目錄在 3 天未修改後(先前值為 3 小時)現在被視為過時,以避免刪除仍在長時間執行的測試套件中使用的目錄。#7913: 修復了當涉及
readline
模組時,pytester.spawn
中的崩潰或掛起問題。#7951: 修復了收集測試時遞迴符號連結的處理。
#7981: 修復了在收集期間未追蹤符號連結目錄的問題。 在 pytest 6.1.0 中回歸。
#8016: 修復了在使用
pytest --doctest-modules path/to/an/__init__.py
時僅收集一個 doctest 的問題。
改進的文件¶
瑣碎/內部變更¶
pytest 6.1.2 (2020-10-28)¶
錯誤修正¶
改進文件¶
#7815: 改善針對
pytest._fillfuncargs()
的棄用警告訊息。
pytest 6.1.1 (2020-10-03)¶
錯誤修正¶
pytest 6.1.0 (2020-09-26)¶
重大變更¶
#5585: 根據我們的政策,以下在 5.X 系列中已棄用的功能現在已移除
FixtureRequest
、Metafunc
和Function
類別的唯讀屬性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:
FSCollector
和Package
的gethookproxy()
和isinitpath()
方法已棄用;請改用self.session.gethookproxy()
和self.session.isinitpath()
。這應適用於所有 pytest 版本。
功能¶
#7667: 新增
--durations-min
命令列標誌,用於控制包含在--durations
顯示的最慢測試列表中的最小持續時間。先前此值硬編碼為0.005s
。
改進¶
#6681: 在初始化早期階段發出的內部 pytest 警告現在可以正確處理,並且可以通過
filterwarnings
或--pythonwarnings/-W
進行篩選。#7572: 當
required_plugins
中列出的外掛程式遺失,或--strict-config
使用了未知的設定鍵時,現在會顯示簡單的錯誤訊息,而不是堆疊追蹤。#7685: 為
Config
新增了兩個新屬性rootpath
和inipath
。這些屬性是現有rootdir
和inifile
屬性的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
內部錯誤崩潰。#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_classes
和python_functions
設定選項,也不會使用pytest_pycollect_makeitem
hook 將它們傳遞給外掛程式。
pytest 6.0.2 (2020-09-04)¶
錯誤修正¶
pytest 6.0.1 (2020-07-30)¶
錯誤修正¶
#7394: 現在接受將空的
help
值傳遞給Parser.add_option
,而不會在運行pytest --help
時崩潰。傳遞None
會引發更具資訊性的TypeError
。#7558: 修正 pylint
not-callable
lint 在pytest.mark.parametrize()
和其他內建標記上的問題:skip
、skipif
、xfail
、usefixtures
、filterwarnings
。#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.Frame
的exec_()
和is_true()
方法。
功能¶
#7464: 新增對
NO_COLOR
和FORCE_COLOR
環境變數的支援,以控制彩色輸出。
改進¶
#7467:
--log-file
CLI 選項和log_file
ini 標記現在會在需要時建立子目錄。#7489: 當
match
等於取得的字串但不是正則表達式匹配時,pytest.raises()
函式具有更清晰的錯誤訊息。在這種情況下,建議跳脫正則表達式。
錯誤修正¶
改進文件¶
瑣碎/內部變更¶
#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 warning
或1 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()
進行評估。該格式支援or
、and
、not
、括號和用於匹配的通用識別符。Python 常數、關鍵字或其他運算符不再以不同的方式評估。#7135: Pytest 現在使用自己的
TerminalWriter
類別,而不是使用py
庫中的類別。外掛程式通常通過TerminalReporter.writer
、TerminalReporter.write()
(和類似方法) 或_pytest.config.create_terminal_writer()
存取此類別。進行了以下重大變更
輸出 (
write()
方法和其他方法) 不再隱式刷新;尊重底層檔案的刷新行為。要顯式刷新(例如,如果您希望在列印行尾符號之前顯示輸出),請使用write(flush=True)
或terminal_writer.flush()
。已移除顯式的 Windows 控制台支援,委託給 colorama 庫。
已移除對寫入
bytes
的支援。已移除
reline
方法和chars_on_current_line
屬性。已移除
stringio
和encoding
引數。已移除對傳遞可呼叫物件而不是檔案的支援。
#7224: 日誌記錄外掛程式設定的
item.catch_log_handler
和item.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()
的零個或多個引數的支援。已移除對將
Source
與str
進行比較的支援。已移除
Source.isparseable()
和Source.putaround()
方法。已移除
Source.compile()
方法和_pytest._code.compile()
函式;請改用普通的compile()
。已移除
_pytest._code.source.getsource()
函式;請改為直接使用Source()
。
棄用¶
功能¶
#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.path
或sys.modules
,從而消除了先前模式的大部分缺點。我們打算在未來版本中將
--import-mode=importlib
作為預設值,因此鼓勵使用者嘗試新模式並在 issue #7245 中提供回饋(正面或負面)。您可以在 文件中 閱讀有關此選項的更多資訊。
#7305: 新增
required_plugins
配置選項,允許使用者指定一個外掛程式列表,包含版本資訊,這些外掛程式是 pytest 執行時所必需的。如果執行 pytest 時未找到任何必需的外掛程式,則會引發錯誤。
改進項目¶
#4375:
pytest
命令現在會抑制BrokenPipeError
錯誤訊息,該訊息會在pytest
的輸出被管道傳輸且管道被管道傳輸到的程式關閉時列印到 stderr (常見範例為less
和head
)。#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=fd
或capfd
和capfdbinary
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 "ValueError: Some error during setup"">
錯誤修正¶
#4677: SKIPPED 測試的摘要報告中顯示的路徑現在始終是相對路徑。先前有時是絕對路徑。
#5456: 修正嘗試移除用於控制對
tmp_path
和tmpdir
建立的資料夾的存取的鎖定檔案時,可能發生的競爭條件。#6240: 修正了在收集步驟期間記錄導致日誌訊息重複輸出到 stderr 的問題。
#6428: 在工作目錄自會話開始以來已變更的情況下,錯誤訊息中顯示的路徑現在是正確的。
#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)
,如果也傳遞了autouse
或params
引數,則不再忽略該函式,而是標記為 fixture。#7360: 修正可能不正確評估傳遞給
pytest.mark.skipif
和pytest.mark.xfail
的字串表達式,在極少數情況下,使用的字串完全相同但指向不同的全域值。#7383: 修正了整個程式碼庫中的例外原因,即在包裝例外時使用
raise new_exception from old_exception
。
改進文件¶
瑣碎/內部變更¶
pytest 5.4.3 (2020-06-02)¶
錯誤修正¶
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)¶
錯誤修正¶
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: 當結果不可用時,
FixtureDef
的cached_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
中新增,並允許指定在測試失敗時如何顯示捕獲的輸出:no
、stdout
、stderr
、log
或all
(預設值)。#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 的一部分。#6469: 已將新選項新增到
junit_logging
選項:log
、out-err
和all
。#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: 新增支援使用
LineMatcher
的fnmatch_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/F
和s/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 中運作。
文件改善¶
細微/內部變更¶
#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 修正¶
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 修正¶
pytest 5.3.1 (2019-11-25)¶
功能改進¶
#6231: 改善對 pytest.mark.parametrize 拼字錯誤的檢查。
#6257: 處理透過
pytest_internalerror
使用的pytest.exit()
,例如從 post mortem 退出 pdb 時。
Bug 修正¶
#5914: pytester:修正在正面匹配後使用時的
no_fnmatch_line()
。#6082: 修正
property
docstring 內 doctest 範例的行偵測,作為 python/cpython#61648 的解決方案。#6254: 修正與 pytest-parallel 的相容性問題(pytest 5.3.0 中的回歸)。
#6255: 透過刪除
sys.last_traceback
、sys.last_type
和sys.last_value
屬性來清除它們,而不是將它們設定為None
。這更符合 Python 標準函式庫的行為。
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
現在會正確失效。這在使用
pytester
的runpytest_inprocess
時很重要。#6047:
saferepr
現在處理BaseException
,其中包括pytest.fail.Exception
等。#6074: pytester:修正在清理暫存目錄時
rm_rf
警告中的引數順序,並且不要針對os.open
錯誤發出警告。#6189: 修正
getmodpath
方法的結果。
細微/內部變更¶
#4901: 來自
pytester
的RunResult
現在會在其為有效的pytest.ExitCode
值時顯示ret
屬性的助記符號。
pytest 5.2.4 (2019-11-15)¶
Bug 修正¶
pytest 5.2.3 (2019-11-14)¶
Bug 修正¶
pytest 5.2.2 (2019-10-24)¶
Bug 修正¶
pytest 5.2.1 (2019-10-06)¶
Bug 修正¶
#5902: 修正
attrs>=19.2
中關於已棄用cmp
屬性的警告。
pytest 5.2.0 (2019-09-28)¶
棄用¶
#1682: 將引數作為位置引數傳遞給 pytest.fixture() 已被棄用 - 請改為將其作為關鍵字引數傳遞。
新功能¶
Bug 修正¶
細微/內部變更¶
#5056: HelpFormatter 使用
py.io.get_terminal_width
以獲得更好的寬度偵測。
pytest 5.1.3 (2019-09-18)¶
Bug 修正¶
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.raises
和pytest.warns
不再支援將字串作為第二個引數。pytest.raises
的message
參數。pytest.raises
、pytest.warns
和ParameterSet.param
現在使用原生僅限關鍵字語法。這可能會更改先前版本的例外訊息,但它們仍然會像以前一樣針對未知的關鍵字引數引發TypeError
。pytest.config
全域變數。tmpdir_factory.ensuretemp
方法。pytest_logwarning
hook。RemovedInPytest4Warning
警告類型。request
現在是 fixtures 的保留名稱。
如需更多資訊,請參閱文件中的 棄用和移除。
#5565:移除對 unittest2 未使用的支援程式碼。
由於 Python 3.3+ 以後已不再需要
unittest2
回溯移植模組,且 pytest 中支援它的少量程式碼似乎也未使用:移除後,所有測試仍然通過且未更改。雖然我們的政策是在移除任何功能或第三方函式庫的支援之前,先引入棄用期,但由於此程式碼顯然完全未使用(即使
unittest2
被 pytest 執行的測試套件使用),因此決定在此版本中將其移除。如果您因此而遇到回歸問題,請提交 issue。
#5615:
pytest.fail
、pytest.xfail
和pytest.skip
不再支援訊息引數使用 bytes。Python 2 支援此功能,因為在 Python 2 中很容易使用
"message"
而不是u"message"
。Python 3 程式碼不太可能將
bytes
傳遞給這些函式。如果您這樣做,請事先將其解碼為str
。
功能¶
改進¶
錯誤修正¶
#4344:修正嘗試收集僅包含「__init__.py」的套件時發生的 RuntimeError/StopIteration 錯誤。
#5115:在
pytest_configure
期間發出的警告明確地不被視為錯誤,即使已配置為錯誤,因為否則會完全破壞 pytest。#5477:
--junitxml
產生的 XML 檔案現在正確地包含<testsuites>
根元素。#5524:修正
tmp_path
和tmpdir
無法移除包含標記為唯讀檔案的目錄的問題,這可能導致使用--basetemp
選項第二次執行 pytest 時崩潰。#5537:將
importlib_metadata
回溯移植替換為 Python 3.8+ 標準函式庫中的importlib.metadata
。#5578:改進某些引發例外函式(
pytest.xfail
、pytest.skip
等)的類型檢查,以便在使用者打算使用標記時提供更好的錯誤訊息(例如@pytest.xfail
而不是@pytest.mark.xfail
)。#5606:修正當測試函式使用無法與其他物件進行真值比較的物件(例如
numpy
陣列)進行修補時發生的內部錯誤。#5634:
pytest.exit
現在在unittest
案例中得到正確處理。這使得unittest
案例可以正確處理來自 pytest pdb 的quit
。#5650:改進剖析 ini 設定檔失敗時的輸出。
#5701:修正使用
functools.partial
定義的staticmethod
物件的收集。#5734:略過非同步產生器測試函式,並更新警告訊息以參考
async def
函式。
改進的文件¶
#5669:為
Testdir.copy_example
新增 docstring。
瑣碎/內部變更¶
#5095:
xunit2
系列的 XML 檔案現在已透過 pytest 自身的測試套件針對 schema 進行驗證,以避免未來發生回歸。#5516:快取節點分割函式,可以提高非常大型測試套件中的收集效能。
#5603:簡化內部
SafeRepr
類別並移除一些無效程式碼。#5664:當使用
PYTHONDONTWRITEBYTECODE=1
呼叫 pytest 自身的測試套件時,test_xfail_handling
測試不再失敗。#5684:將程式碼庫中
OSError.errno
的手動處理替換為新的OSError
子類別(PermissionError
、FileNotFoundError
等)。
pytest 5.0.1 (2019-07-04)¶
錯誤修正¶
改進的文件¶
#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。#5402:PytestDeprecationWarning 現在預設為錯誤。
為了實現我們盡可能減少中斷地移除已棄用功能的計畫,所有
PytestDeprecationWarning
類型的警告現在都會產生錯誤,而不是警告訊息。受影響的功能將在 pytest 5.1 中有效移除,因此請查閱文件中的 棄用與移除 章節,以取得有關如何更新現有程式碼的指示。
在 pytest
5.0.X
系列中,可以透過將以下內容新增至您的pytest.ini
檔案,將錯誤改回警告,作為權宜之計[pytest] filterwarnings = ignore::pytest.PytestDeprecationWarning
但是當 pytest
5.1
發佈時,這將停止運作。如果您對特定功能的移除有疑慮,請在 #5402 中新增評論。
#5412:
ExceptionInfo
物件(由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)
棄用¶
功能¶
#3457:新的
pytest_assertion_pass
hook,在 assertion *通過* 時使用上下文資訊呼叫。此 hook 仍然是實驗性的,因此請謹慎使用。
#5440:現在預設啟用
faulthandler
標準函式庫模組,以協助使用者診斷 C 模組中的崩潰問題。此功能是透過將外部 pytest-faulthandler 外掛程式整合到核心中來提供的,因此使用者如果使用該外掛程式,應從其需求中移除它。
如需更多資訊,請參閱文件:Fault Handler。
#5452:當警告配置為錯誤時,pytest 警告現在顯示為源自
pytest.
而不是內部_pytest.warning_types.
模組。#5125:
Session.exitcode
值現在在pytest.ExitCode
(一個IntEnum
)中編碼。這使得消費者程式碼可以使用退出代碼,並且比僅僅是文件更明確。使用者定義的退出代碼仍然有效,但應謹慎使用。團隊不希望此變更會破壞一般的測試套件或外掛程式,除非在深奧/特定的情況下。
pytest-xdist 使用者應升級到
1.29.0
或更高版本,因為pytest-xdist
由於此變更而需要相容性修正。
錯誤修正¶
#1403:從
imp
切換到importlib
。#1671:assertion writer 快取的
.pyc
檔案名稱現在包含 pytest 版本,以避免過時的快取。#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。#5432:防止在多次於程序內調用 pytest 時,assertion rewriter 出現「已經匯入」警告。
#5433:修正在套件(
__init__.py
)中的 assertion rewriting。#5444:修正在命令列上傳遞的第一個檔案收集失敗時的
--stepwise
模式。#5482:修復 4.6.0 中引入的錯誤,該錯誤導致在將超過 2 個位置引數傳遞給
pytest.mark.parametrize
時發生收集錯誤。#5505:修正在使用
-p no:terminal
時,當探索失敗時發生的崩潰。
改進的文件¶
pytest 4.6.11 (2020-06-04)¶
錯誤修正¶
#6334: 修正當在
-r
命令列選項中同時使用f/F
和s/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)¶
功能¶
瑣碎/內部變更¶
#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)¶
錯誤修正¶
pytest 4.6.6 (2019-10-11)¶
錯誤修正¶
瑣碎/內部變更¶
#5801:修正 Python 版本檢查(由
flake8-2020
偵測到),以防 python4 成為現實。
pytest 4.6.5 (2019-08-05)¶
錯誤修正¶
pytest 4.6.4 (2019-06-28)¶
錯誤修正¶
pytest 4.6.3 (2019-06-11)¶
錯誤修正¶
pytest 4.6.2 (2019-06-03)¶
錯誤修正¶
pytest 4.6.1 (2019-06-02)¶
錯誤修正¶
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 選項的輸出已得到改進。#5269:
pytest.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
使用setenv
和delenv
的文件。
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_property
和record_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 範圍。
錯誤修正¶
文件改進¶
#4935: 擴充關於註冊標記和
--strict
效果的文件。
細微/內部變更¶
#4942:
logging.raiseExceptions
不再設定為False
。#5013: pytest 現在依賴 wcwidth 以正確追蹤 Unicode 字元大小,從而實現更精確的終端機輸出。
#5059: pytester 的
Testdir.popen()
現在通過帶有預設值的關鍵字引數(subprocess.PIPE
)使用stdout
和stderr
。#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)¶
錯誤修正¶
文件改進¶
細微/內部變更¶
#5182: 移除內部和未使用的
_pytest.deprecated.MARK_INFO_ATTRIBUTE
。
pytest 4.4.1 (2019-04-15)¶
錯誤修正¶
pytest 4.4.0 (2019-03-29)¶
功能¶
#2224: 當未安裝合適的 async 外掛程式(例如
pytest-asyncio
或pytest-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
選項現在通過模組屬性處理類別(例如,帶有 pdbpp 的pdb:pdb.Pdb
),並且其驗證已得到改進。#4875: 如果
testpaths
設定選項生效,即目錄或檔案名稱未在命令列中明確傳遞,則該選項現在顯示在 pytest 標頭中的rootdir
和inifile
行旁邊。此外,只有在存在設定檔時才會顯示
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_prepend
和testdir.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 可用。#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_serializable
和pytest_report_from_serializable
**實驗性** hooks。這些 hooks 將被
pytest-xdist
、pytest-subtests
和 resultlog 的替代品用於序列化和自訂報告。它們是實驗性的,這意味著它們的詳細資訊可能會在未來的修補程式版本中更改甚至完全移除,恕不另行通知。
歡迎來自外掛程式作者和使用者的回饋。
#4987:
Collector.repr_failure
尊重--tb
選項,但現在僅預設為short
(帶有auto
)。
pytest 4.3.1 (2019-03-11)¶
錯誤修正¶
細微/內部變更¶
#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
路徑。
錯誤修正¶
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」例外。
文件改進¶
細微/內部變更¶
#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: 確保
tmpdir
和tmp_path
夾具是相同的資料夾。#4681: 確保
tmp_path
始終是真實路徑。
瑣碎/內部變更¶
pytest 4.1.1 (2019-01-12)¶
錯誤修正¶
改進文件¶
#3375: 記錄使用
setup.cfg
可能會導致其他工具崩潰或難以追蹤問題,因為它使用的剖析器與pytest.ini
或tox.ini
檔案不同。
瑣碎/內部變更¶
#4602: 在 regen tox 環境中解除安裝
hypothesis
。
pytest 4.1.0 (2019-01-05)¶
移除¶
#2169:
pytest.mark.parametrize
: 在先前的版本中,id 函數引發的錯誤會被抑制並變更為警告。現在例外情況會被傳播,並帶有一個 pytest 訊息,告知例外情況發生的節點、參數值和索引。#3078: 移除舊版內部警告系統:
config.warn
、Node.warn
。pytest_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.ini 和 tox.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.raises
的message
參數現在會發出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: 對於使用 attrs 或
dataclasses
(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
參數,當無法匯入請求的模組時,將會顯示該參數。
錯誤修正¶
改進文件¶
瑣碎/內部變更¶
#4447: 將
--result-log
的棄用類型變更為PytestDeprecationWarning
。已決定在下一個主要修訂版本中移除此功能。
pytest 4.0.2 (2018-12-13)¶
錯誤修正¶
改進文件¶
#1495: 記錄常見的 doctest 夾具目錄樹狀結構陷阱
pytest 4.0.1 (2018-11-23)¶
錯誤修正¶
瑣碎/內部變更¶
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 跳脫的事實。
瑣碎/內部變更¶
pytest 3.9.3 (2018-10-27)¶
錯誤修正¶
改進文件¶
#3851: 在
@pytest.mark.parametrize
的文件中,加入對於empty_parameter_set_mark
ini 選項的參考
瑣碎/內部變更¶
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 patchingwarnings.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
,File
和Item
。現在使用者會看到這個警告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
的問題,其中tests
是project/app/tests
的符號連結:先前project/app/conftest.py
會因此被 fixture 忽略。#4132: 修正使用
--pdb
時重複列印內部錯誤的問題。#4135: 基於 pathlib 的 tmpdir 清理現在可以正確處理資料夾中的符號連結。
#4152: 當遇到
SyntaxWarning
時,顯示檔案名稱。
改進的文件¶
瑣碎/內部變更¶
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 上不是
str
,MonkeyPatch.setenv
和MonkeyPatch.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
。
改進的文件¶
瑣碎/內部變更¶
pytest 3.8.0 (2018-09-05)¶
棄用與移除¶
#2452:
Config.warn
和Node.warn
已被棄用,請參閱 Config.warn 和 Node.warn 以了解理由和範例。#3936:
@pytest.mark.filterwarnings
的第二個參數不再進行 regex 轉義,使其可以實際使用正規表示式來檢查警告訊息。注意: regex 轉義 match 字串是一個實作上的疏忽,可能會破壞依賴舊行為的測試套件。
新功能¶
#2452: 內部 pytest 警告現在使用標準
warnings
模組發出,使其可以使用標準警告篩選器來管理這些警告。這引入了PytestWarning
、PytestDeprecationWarning
和RemovedInPytest4Warning
警告類型作為公共 API 的一部分。請參閱 文件 以獲取更多資訊。
#2908: 如果未設定其他警告篩選器,
DeprecationWarning
和PendingDeprecationWarning
現在預設會顯示。這使得 pytest 更符合 PEP 506#test 執行器的建議篩選器設定。請參閱 文件 以獲取更多資訊。#3251: 警告現在會在測試收集期間被捕捉和顯示。
#3784: 設定
PYTEST_DISABLE_PLUGIN_AUTOLOAD
環境變數會停用外掛程式自動載入。#3829: 在
console_output_style
中加入了count
選項,以啟用將進度顯示為計數而不是百分比。#3837: 在
pytester.RunResult.assert_outcomes
簽名中加入了對 ‘xfailed’ 和 ‘xpassed’ 結果的支援。
錯誤修正¶
改進的文件¶
瑣碎/內部變更¶
#3853: 移除當沒有失敗的測試時,使用
--failed-first
和--last-failed
列印的"run all (no recorded failures)"
訊息。
pytest 3.7.4 (2018-08-29)¶
錯誤修正¶
改進的文件¶
#3902: 修正 pytest.org 連結
pytest 3.7.3 (2018-08-26)¶
錯誤修正¶
#3033: 在 teardown 期間,fixture 可以再次使用
capsys
和capfd
來檢查測試期間捕捉到的輸出。#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: 修正當檔案名稱以大寫字母開頭時,套件內測試被重複收集的問題。
改進的文件¶
瑣碎/內部變更¶
pytest 3.7.2 (2018-08-16)¶
錯誤修正¶
#3671: 修正
filterwarnings
未註冊為內建標記的問題。#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.approx
在numpy<1.13
中使用陣列時的無限遞迴問題。#3757: 將 pathlib2 固定到
>=2.2.0
,因為我們需要__fspath__
支援。#3763: 修正在 python 3 中斷言訊息為
bytes
時的TypeError
。
pytest 3.7.0 (2018-07-30)¶
棄用與移除¶
#3661: 直接調用 fixture 函數,而不是在測試函數中請求它們,現在會發出
RemovedInPytest4Warning
。 請參閱 文件以了解原因和範例。
新功能¶
#2283: 新的
package
fixture 作用域:fixture 在 *package* 的最後一個測試完成時終結。 此功能被認為是實驗性的,因此請謹慎使用。#3576:
Node.add_marker
現在支援append=True/False
參數,以決定標記是放在最後(預設)還是最前面。#3579: Fixture
caplog
現在具有messages
屬性,可方便地存取格式化的日誌訊息,而無需 formatter/handler 提供的額外資料。#3610: 新的
--trace
選項,可在測試開始時進入偵錯器。#3623: 引入
pytester.copy_example
作為輔助工具,以針對專案中的範例執行驗收測試。
錯誤修正¶
改進文件¶
#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)
瑣碎/內部變更¶
pytest 3.6.3 (2018-07-04)¶
錯誤修正¶
改進文件¶
@pytest.mark.skipif
範例上方的描述現在更符合程式碼。 (#3611)
瑣碎/內部變更¶
pytest 3.6.2 (2018-06-20)¶
錯誤修正¶
改進文件¶
新增
--strict
標誌的文件。 (#3549)
瑣碎/內部變更¶
pytest 3.6.1 (2018-06-05)¶
錯誤修正¶
改進文件¶
在 fixture 文件中新增了關於如何將 fixture 用作 factory 的章節。 (#3461)
瑣碎/內部變更¶
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)
錯誤修正¶
改進文件¶
將文件版權年份變更為每次發布時自動更新自身的範圍。 (#3303)
瑣碎/內部變更¶
pytest
現在依賴 python-atomicwrites 程式庫。 (#3008)將所有 pypi.python.org URL 更新為 pypi.org。 (#3431)
偵測使用內部外掛程式管理器的
pytest_
前綴 hook,因為pluggy
正在棄用PluginManager
的implprefix
引數。 (#3487)從
_pytest.compat
而不是直接從collections
導入Mapping
和Sequence
在python_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)¶
錯誤修正¶
改進文件¶
修復
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)¶
棄用與移除¶
新功能¶
新的
--show-capture
命令列選項,允許指定在測試失敗時如何顯示捕獲的輸出:no
、stdout
、stderr
、log
或all
(預設值)。 (#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
功能在上次執行中沒有測試失敗時(或未找到快取時)的行為:none
或all
(預設值)。 (#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_logstart
和pytest_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)
錯誤修正¶
改進文件¶
瑣碎/內部變更¶
將
attrs
的最低要求變更為17.4.0
。 (#3228)重新命名範例目錄,以便從基本目錄執行時所有測試都通過。 (#3245)
內部
mark.py
模組已轉換為套件。 (#3250)pytest
現在依賴 more-itertools 套件。 (#3265)當
[pytest]
區段用於透過-c
傳遞的.cfg
檔案中時,新增警告 (#3268)nodeids
現在可以顯式傳遞給FSCollector
和Node
建構函式。 (#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¶
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
新增match
和message
參數的 Sphinx 參數文件。 (#3202)
Trivial/Internal Changes¶
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)當停用捕捉 (
-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¶
pytest 3.3.2 (2017-12-25)¶
Bug Fixes¶
Improved Documentation¶
新增關於多個參數化引數行為的釐清註記 (#3001)
Trivial/Internal Changes¶
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.6 和 3.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.fixture
的params
列表現在對於所有效果都視為不可變的,並且在呼叫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
傳回,因此可以透過屬性存取out
和err
。 (#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_setup
和pytest_fixture_post_finalizer
鉤子。 (#2124)如果在外掛程式載入時發生例外,pytest 不再隱藏原始追溯。在 Python 2 中,它將顯示原始追溯,並帶有一條新訊息,說明在哪個外掛程式中。在 Python 3 中,它將顯示 2 個標準化的例外,即載入外掛程式時的原始例外,以及 pytest 拋出的關於載入外掛程式的例外。 (#2491)
capsys
和capfd
現在可以被其他 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¶
重構內部 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¶
改進文件¶
pytest 3.2.3 (2017-10-03)¶
錯誤修正¶
改進文件¶
瑣碎/內部變更¶
pytest 3.2.2 (2017-09-06)¶
錯誤修正¶
改進文件¶
瑣碎/內部變更¶
pytest 3.2.1 (2017-08-08)¶
錯誤修正¶
改進文件¶
明確說明哪些 pytest 功能可與
unittest
搭配使用。( #2626)
pytest 3.2.0 (2017-07-30)¶
棄用與移除¶
新功能¶
新增對 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
和階段 (setup
、call
和teardown
)。請參閱 文件 以取得更多資訊。( #2583)引入
@pytest.mark.filterwarnings
標記,允許覆寫每個測試、類別或模組層級的警告篩選器。請參閱 文件 以取得更多資訊。( #2598)--last-failed
現在會永久記住測試失敗的時間,只有在再次通過時才會忘記。這使得透過選擇性地執行檔案和逐步修正測試來修正測試套件變得容易。( #2621)新的
pytest_report_collectionfinish
hook,允許外掛程式在收集成功完成後,將訊息新增至終端機報告。( #2622)新增對 PEP 415 的
Exception.__suppress_context__
的支援。現在,如果 pytest 捕獲到raise exception from None
,pytest 將不再在測試報告中鏈接上下文。現在的行為與 Python 的追溯行為一致。( #2631)由
pytest.fail
、pytest.skip
和pytest.xfail
引發的例外現在是 BaseException 的子類別,使其更難被一般程式碼意外捕獲。( #580)
錯誤修正¶
在
pytester.py.Testdir.popen()
中將stdin
設定為已關閉的PIPE
,以避免不必要的互動式pdb
。( #2023)在使用
capsys
捕獲模式時,將遺失的encoding
屬性新增至sys.std*
串流。( #2375)修正在 Windows 上,如果
colorama
在conftest.py
檔案中匯入,則終端機顏色會變更為黑色的問題。( #2510)修正在報告跳過測試摘要時的行號。( #2548)
capture:確保 EncodedFile.name 是字串。( #2555)
選項
--fixtures
和--fixtures-per-test
現在將保留 docstring 中的縮排。( #2574)doctest 行號現在已正確報告,修正了 pytest-sugar#122。( #2610)
修正在 fixture 收集順序中的非決定性行為。為 Python 2.6 新增了新的依賴項 (ordereddict)。( #920)
改進文件¶
瑣碎/內部變更¶
更新
--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)
瑣碎/內部變更¶
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 警告捕獲不再覆寫現有的警告篩選器。先前的行為會覆寫所有篩選器,並導致在設定警告篩選器以符合其需求的測試套件中發生迴歸。請注意,作為此操作的副作用,
DeprecationWarning
和PendingDeprecationWarning
不再預設顯示。(#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.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。將文件中的 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。無條件的
xfail
標記不再依賴於底層測試項目是PyobjMixin
的實例,因此可以應用於非內建 python 測試收集器收集的測試。感謝 @barneygale 的 PR。
3.0.6 (2017-01-22)¶
pytest 不再從自身操作產生
PendingDeprecationWarning
,這是在3.0.5
版本中錯誤引入的 (#2118)。感謝 @nicoddemus 的報告和 @RonnyPfannschmidt 的 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.Function
、item.Module
等現在會發出棄用警告,請改用pytest.Function
、pytest.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。
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。修復了生成的 xUnit XML 中的 teardown 錯誤訊息。感謝 @gdyuldin 的 PR。
正確處理
multiprocessing
任務中的例外 (#1984)。感謝 @adborden 的報告和 @nicoddemus 的 PR。
3.0.3 (2016-09-28)¶
parametrize
的ids
參數再次接受 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)。當使用啟用
--pdb
的unittest.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。capsys
和capfd
現在有一個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 的結果快取。
對於測試為 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)。標記為
@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_method
、setup_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.ini
或tox.ini
檔案中的[pytest]
區段受到支援且未變更。感謝 @nicoddemus 的 PR。使用
pytest_funcarg__
前綴宣告 fixture 被視為已棄用,並將在 pytest-4.0 中移除 (#1684)。感謝 @nicoddemus 的 PR。將命令列字串傳遞給
pytest.main()
被視為已棄用,並計劃在 pytest-4.0 中移除。建議改為傳遞引數清單 (#1723)。將
getfuncargvalue
重新命名為getfixturevalue
。getfuncargvalue
仍然存在,但現在被視為已棄用。感謝 @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。
修正了
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.code
在pytest
之外的用途非常少,而且它位於不同的儲存庫中,使得及時修正其程式碼中的錯誤變得困難。團隊希望透過此舉能夠更好地重構並改進該程式碼。此變更不應影響使用者,但讓使用者知道他們是否遇到任何奇怪的行為會很有用。請記住,
pytest._code
的程式碼是私有的和實驗性的,因此您絕對不應明確匯入它!請注意,原始的
py.code
仍然在 pylib 中提供。pytest_enter_pdb
現在可以選擇性地接收 pytest config 物件。感謝 @nicoddemus 的 PR。移除了 Python 2.5 或更低版本的程式碼和文件,包括移除已過時的
_pytest.assertion.oldinterpret
模組。感謝 @nicoddemus 的 PR (#1226)。當在環境中找到
CI
或BUILD_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。修正 追蹤記錄樣式文件 以描述所有可用的選項 (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.hookimpl
和pytest.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
檔案。將
file
和line
屬性新增到 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
等)之後的路徑現在會正確地用於探索rootdir
和ini
檔案。感謝 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_value
、sys.last_type
和sys.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.test
和py.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]