更新日志¶
版本遵循 语义化版本控制 (<major>.<minor>.<patch>
)。
不向后兼容(破坏性)的更改只会在主要版本中引入,并在发布版本的 弃用 部分提前通知。
pytest 8.4.0 (2025-06-02)¶
移除和向后不兼容的破坏性更改¶
弃用(在下个主要版本中移除)¶
#10839: 如果没有
pytest_fixture_setup
钩子来解析异步 fixture,现在请求异步 fixture 将发出DeprecationWarning
。这最常发生在同步测试请求异步 fixture 时。这应该不会影响大多数使用异步测试或 fixture 的异步 pytest 插件用户,但可能会影响非标准钩子设置或autouse=True
。有关如何解决此警告的指导,请参见同步测试依赖异步 fixture。
新功能¶
#11538: 添加了
pytest.RaisesGroup
,作为pytest.raises()
的等价物,用于预期ExceptionGroup
。还添加了pytest.RaisesExc
,它现在是pytest.raises()
背后的逻辑,并作为参数传递给pytest.RaisesGroup
。RaisesGroup
包括指定多个不同预期异常的能力、嵌套异常组的结构以及用于模拟 except* 的标志。更多信息请参见关于预期异常组的断言和 docstrings。#12504:
pytest.mark.xfail()
现在接受pytest.RaisesGroup
作为raises
参数,当你预期一个异常组时。你也可以传递一个pytest.RaisesExc
,例如你想使用check
参数时。#12713: 新增
--force-short-summary
选项,强制无论详细程度如何,都显示精简的摘要输出。这允许用户仍然在作业输出的日志文件中看到失败的精简摘要输出,以便快速参考,这在非精简输出非常冗长时特别有用。
#12749: pytest 传统上会收集测试模块命名空间中的类/函数,即使它们是从另一个文件导入的。
例如
# contents of src/domain.py class Testament: ... # contents of tests/test_testament.py from domain import Testament def test_testament(): ...
在这种默认选项下,pytest 会从
tests/test_testament.py
收集类Testament
,因为它以Test
开头,即使在这种情况下,它是一个被导入到测试模块命名空间中的生产类。现在可以通过将新的
collect_imported_tests
配置选项设置为false
来阻止这种行为,这将使 pytest 仅当 类/函数在测试文件中定义时才收集它们。—— 作者:@FreerGit
#12765: 现在可以使用
truncation_limit_lines
和truncation_limit_chars
设置触发代码片段截断的阈值。更多信息请参见修改截断限制。
#13125:
console_output_style
现在支持times
以显示每个测试的执行时间。#13192:
pytest.raises()
现在在传递空字符串给match
时会发出警告,因为这将匹配任何值。如果你想检查异常是否没有消息,请使用match="^$"
。#13192:
pytest.raises()
现在在匹配失败且match
参数包含^
和$
且其他部分已被转义时,会打印有用的字符串差异。#13192: 你现在可以传递
with pytest.raises(check=fn):
,其中fn
是一个接受引发的异常并返回布尔值的函数。raises
在没有引发异常时失败(像往常一样),在引发异常且fn
返回True
时通过(以及如果指定,在之前检查match
和类型匹配),如果fn
返回False
则传播异常(这很可能也会导致测试失败)。#13228: pytest.HIDDEN_PARAM 现在可以在
pytest.param()
的id
中或Metafunc.parametrize
的ids
中使用。它会将参数集从测试名称中隐藏。#13253: 新标志:--disable-plugin-autoload,可作为
PYTEST_DISABLE_PLUGIN_AUTOLOAD
的替代方案,当设置环境变量不方便时;并允许在配置文件中使用addopts
进行设置。
现有功能的改进¶
#10224: pytest 的
short
和long
追溯样式(修改 Python 追溯打印)现在部分支持 PEP 657,并将在追溯中显示特定的代码段。================================= FAILURES ================================= _______________________ test_gets_correct_tracebacks _______________________ test_tracebacks.py:12: in test_gets_correct_tracebacks assert manhattan_distance(p1, p2) == 1 ^^^^^^^^^^^^^^^^^^^^^^^^^^ test_tracebacks.py:6: in manhattan_distance return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y) ^^^^^^^^^ E AttributeError: 'NoneType' object has no attribute 'x'
—— 作者:@ammaraskar
#11118: 现在
pythonpath
在初始化过程中比以前更早地配置$PYTHONPATH
,这现在也影响通过-p
命令行选项加载的插件。—— 作者:@millerdev
#11381:
parser.addini
方法的type
参数现在接受"int"
和"float"
参数,方便解析配置文件中的配置值。示例
def pytest_addoption(parser): parser.addini("int_value", type="int", default=2, help="my int value") parser.addini("float_value", type="float", default=4.2, help="my float value")
pytest.ini
文件[pytest] int_value = 3 float_value = 5.4
#11525: Fixtures 现在在输出中清晰地表示为“fixture 对象”,而不是像以前那样作为普通函数,这使得初学者可以轻松发现错误,例如引用在同一模块中声明但未在测试函数中请求的 fixture。
—— 作者:@the-compiler 和 @glyphack
#12426: 当 pytest.mark.usefixtures 在未指定任何 fixture 的情况下使用时,现在会发出警告。以前,空的 usefixtures 标记会被默默忽略。
#12707: 在 Python 3.13+ 中进入 Pdb 时,可以导航异常链。
#12736: 为 pytest 生成的 junit-xml 的根标签
testsuites
添加了一个新的属性name
,其固定值为"pytest tests"
。此属性是许多 junit-xml 规范的一部分,甚至也是 pytest 实现所基于的
junit-10.xsd
规范的一部分。#12943: 如果测试因包含单个异常的异常组而失败,则该异常现在将显示在简短的测试摘要信息中。
#12958: 对 unraisable 进行了多项增强
尽早设置 unraisable 钩子,尽晚取消设置,以收集尽可能多的 unraisable 异常。
在取消设置 unraisable 钩子之前调用垃圾收集器,以收集任何零散的异常。
每个测试阶段收集多个 unraisable 异常。
报告
tracemalloc
分配追溯(如果可用)。避免使用基于生成器的钩子,以允许在测试失败时处理
StopIteration
。如果引发,将 unraisable 异常作为
pytest.PytestUnraisableExceptionWarning
异常的原因进行报告。在 unraisable 钩子中计算 unraisable 对象的
repr
,以便在可用时获取最新信息,并有助于对象的复活。
#13010:
pytest.approx()
现在可以比较包含数字和非数字混合的集合。#13016: 对 threadexception 进行了多项增强
尽早设置 excepthook,尽晚取消设置,以收集线程中尽可能多的未处理异常。
每个测试阶段收集多个线程异常。
报告
tracemalloc
分配追溯(如果可用)。避免使用基于生成器的钩子,以允许在测试失败时处理
StopIteration
。如果引发,将线程异常作为
pytest.PytestUnhandledThreadExceptionWarning
异常的原因进行报告。在 excepthook 中提取线程对象的
name
,这将有助于线程的复活。
#13031: 像
pytest.mark.parametrize([], ids=idfunc)
这样的空参数集将不再触发对idfunc
的内部对象调用。#13115: 允许向
pytest.raises
提供ExceptionGroup[Exception]
和BaseExceptionGroup[BaseException]
,以在ExceptionInfo
上保持完整的类型提示with pytest.raises(ExceptionGroup[Exception]) as exc_info: some_function()
使用其他异常类型进行参数化仍然是一个错误——我们不检查子异常的类型,因此不允许可能看起来像我们这样做的代码。
#13122:
--stepwise
模式收到了一些改进如果 pytest 稍后在没有该标志的情况下执行,它不再忘记上次失败的测试。
这使得以下工作流程成为可能
执行带有
--stepwise
的 pytest,然后 pytest 会在第一个失败的测试处停止;迭代更新代码并在隔离模式下运行测试,不带
--stepwise
标志(例如在 IDE 中),直到它被修复。再次执行带有
--stepwise
的 pytest,pytest 将从之前失败的测试处继续,如果它通过,则继续到下一个测试。
以前,在第 3 步,pytest 会从头开始,忘记之前失败的测试。
然而,此更改可能会导致在
--stepwise
模式长时间不使用时出现问题,因为状态可能会过时,因此如果测试套件发生更改,内部状态将自动重置(目前仅考虑测试数量,我们将来可能会更改/改进这一点)。新标志:
--stepwise-reset
/--sw-reset
,允许用户显式重置分步状态并从头开始重新启动工作流程。
#13308: 添加了对 Python 3.14 的官方支持。
#13380: 修复
ExceptionGroup
追溯过滤,以排除 pytest 内部。#13415: BibTex 示例的作者元数据现在以姓氏在前,名字在后的格式正确格式化。已添加 BibLaTex 示例。BibTex 和 BibLaTex 示例现在明确指出引用的是软件。
—— 作者:@willynilly
#13420: 通过优化
FSCollector
中使用的路径解析,提高了测试收集性能。#13457: 关于重复参数化的错误消息不再显示内部堆栈跟踪。
#4112: 在
pytest.param()
上使用 pytest.mark.usefixtures 现在会产生错误,而不是默默地不执行任何操作。#5473: 将断言重写警告消息中的
:
替换为;
,以便在调用pytest.main()
之前可以使用标准 Python 警告过滤器进行过滤。- #6985: 改进了
pytest.approx()
,以增强 0.001 到 1000 之间值范围和容差的可读性。 现在,
repr
方法为这些范围内的值提供了更清晰的输出,使其更容易解释结果。以前,这些值范围和容差的输出以科学记数法显示(例如,
42 ± 1.0e+00
)。更新后的方法现在以小数形式显示容差,以提高可读性(例如,42 ± 1
)。示例
旧输出
>>> pytest.approx(42, abs=1) 42 ± 1.0e+00
当前输出
>>> pytest.approx(42, abs=1) 42 ± 1
—— 作者:@fazeelghafoor
- #6985: 改进了
#7683: 以前可选的
pygments
依赖项现在是必需的,导致输出总是进行源高亮显示(除非通过--code-highlight=no
CLI 选项禁用)。
错误修复¶
#10404: 尽快应用来自 config/cli 的 filterwarnings,并尽可能晚地恢复它们,以便在 pytest 运行期间以及移除 unraisable 和 threadexcept 钩子之前收集警告作为错误。
这允许非常晚的警告和 unraisable/threadexcept 异常导致测试套件失败。
这还将 lsof 插件发出的警告从 PytestWarning 更改为新的警告 PytestFDWarning,以便更容易过滤。
#11067: 测试报告现在保持一致,无论测试是通过 pytest.mark.xfail 还是
pytest.fail()
进行 xfail 的。此前,通过标记进行 *xfail* 的测试会在消息前添加字符串
"reason: "
,而通过函数进行 *xfail* 的测试则没有。前缀已被移除。#12008: 在 #11220 中,通过更改直接参数的索引分配方式引入了无意的重新排序更改。更具体地说,在该更改之前,直接参数到 metafunc 的 callspecs 的索引是在所有参数化发生之后才分配的。现在,该更改已恢复。
#12863: 修复在
@staticmethod
或@classmethod
之上放置标记(包括 pytest.mark.parametrize)时的问题。#12929: 正确处理来自测试用例、setup 和 teardown 的 StopIteration。
#12938: 修复了在使用
-vv
时--durations-min
参数未被遵守的问题。#12946: 修复了 pytest 包装的
pdb
命令缺少帮助的问题——作者:@adamchainz。#12981: 防止
pytest.Config.add_cleanup()
回调中的异常阻止进一步的清理。#13047: 恢复
pytest.approx()
对bool
和numpy.bool_
类型之间相等性检查的处理。在
8.3.4
和8.3.5
版本中,使用pytest.approx()
比较bool
和numpy.bool_
意外地不再匹配>>> import numpy as np >>> from pytest import approx >>> [np.True_, np.True_] == pytest.approx([True, True]) False
此问题现已修复
>>> [np.True_, np.True_] == pytest.approx([True, True]) True
#13119: 改进了对过滤警告中无效正则表达式模式的处理,提供了清晰的错误消息。
#13175: 比较两个字符串时,差异现在也正确高亮显示。
#13248: 修复了在
Metafunc.parametrize
中传递scope
并设置indirect=True
时,可能导致其他 fixture 无法依赖于参数化 fixture 的问题。#13291: 修复了在使用
attrs>=25.2
时,断言失败消息中attrs
对象的repr
问题。#13312: 修复了 PyPy 在收集涉及更高作用域参数的测试时可能发生的
KeyError
崩溃。#13345: 修复
pytest.TestReport.when
和pytest.TestReport.location
的类型提示。#13377: 修复了带纯位置参数语法的测试方法的处理问题。
现在,支持正式将
self
定义为纯位置参数和/或将 fixture 参数定义为纯关键字参数的方法,例如:class TestClass: def test_method(self, /, *, fixture): ...
此前,这会在 pytest 内部导致错误。
#13384: 修复了 pytest 可能报告负持续时间的问题。
#13420: 为
nodes._check_initialpaths_for_relpath
添加了lru_cache
。#9037: 在参数化测试中转义 id 时,遵守
disable_test_id_escaping_and_forfeit_all_rights_to_community_support
。
改进的文档¶
#12535:
这个示例`<https://pytest.cn/en/stable/example/simple.html#making-test-result-information-available-in-fixtures> 显示了 ``print`
语句,但它们并未完全反映不同分支的实际作用。该修复使示例更精确。#13218: 在
pytest.approx()
文档中指出它将布尔值视为不等于数字零或一。#13221: 改进了
--help
输出中 CLI 选项的分组。#6649: 将
TerminalReporter
添加到 API 参考 文档页面。#8612: 在文档中添加了处理抽象测试类的配方。
文档中添加了一个新示例,演示如何使用 mixin 类处理抽象测试类,而无需为子类手动设置
__test__
属性。这确保了抽象测试类的子类会自动被 pytest 收集。
打包更新和下游注意事项¶
#13317: 指定了
colorama
、iniconfig
和packaging
的最低允许版本;并将python_version<'3.11'
的exceptiongroup
的最低允许版本从发布候选版本提升到完整发布版本。
面向贡献者的更改¶
#12017: 混合内部改进
在某些测试中将格式化迁移到 f-string。
在 JUnitXML 测试中使用类型安全构造。
将
MockTiming
移动到_pytest.timing
中。
—— 作者:@RonnyPfannschmidt
#12647: 修复了使用
hypothesis
pytest 插件运行测试套件的问题。
杂项内部更改¶
#6649: 将
TerminalReporter
添加到公共 pytest API,因为它属于pytest_terminal_summary
钩子的签名。
pytest 8.3.5 (2025-03-02)¶
错误修复¶
#11777: 修复了即使使用
-vv
详细级别,序列仍被缩短的问题。#12888: 修复了在 Python 3.13+ 和
libedit
构建的 Python(例如在 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
崩溃的问题。#12849: 在
pytest.fail()
中使用pytrace=False
时,彩色输出的 ANSI 转义码现在可以正确处理。#9353:
pytest.approx()
现在在给定布尔值时使用严格相等性。
改进的文档¶
#10558: 修复
pytest.Config.getoption()
的模糊 docstring。#12966: 澄清了 @pytest.mark.filterwarnings 文档中关于使用多个 @pytest.mark.filterwarnings 标记时的过滤优先级/顺序。
面向贡献者的更改¶
#12497: 修复了 Python 3.13 上两个与 pdb 相关的测试失败问题。
pytest 8.3.3 (2024-09-09)¶
错误修复¶
#12446: 避免在 fixture 发现期间调用
@property
(和其他实例描述符)——作者:@asottile#12659: 修复了在使用 pytest>=8.1 的参数
--import-mode=importlib
时不显示断言失败差异的问题。#12667: 修复了
ExceptionInfo.errisinstance
中类型更改导致mypy
失败的回归问题。#12744: 修复了与 Python 3.9 或更低版本的类型兼容性问题——将
typing.Self
替换为typing_extensions.Self
——作者:@Avasam#12745: 修复了 Windows 上 nodeid 路径中反斜杠转换不正确的问题,确保了跨环境的路径处理一致性。
#6682: 修复了在打印失败断言的“msg”部分(例如
assert condition, msg
)时未遵守详细级别的问题。#9422: 修复了通过
-p no:terminal
禁用终端插件时,会导致与缺少verbose
选项相关的崩溃的问题。—— 作者:@GTowers1
改进的文档¶
杂项内部更改¶
#12769: 修复了 codespell 发现的拼写错误,并将 codespell 添加到 pre-commit 钩子中。
pytest 8.3.2 (2024-07-24)¶
错误修复¶
#12652: 解决回归问题,
conda
环境不再自动检测。—— 作者:@RonnyPfannschmidt
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
行为与 8.0 之前在 xfail 追溯方面是相同的。虽然这是一个行为更改,但它将默认行为恢复到 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 中收集器在 setup 期间引发异常的类似回归问题。
此修复程序需要进行内部更改,这可能会影响某些插件
FixtureDef.cached_result[2]
现在是一个元组(exc, tb)
而不是exc
。SetupState.stack
失败现在是一个元组(exc, tb)
而不是exc
。
#12328: 修复了 pytest 8.0.0 中的回归问题,即在某些情况下,包作用域的参数化项目未正确重新排序以最小化设置/拆卸。
#12424: 修复了在使用 pytest-rerunfailures 等插件重新运行 unittest 测试时,
assert testcase is not None
断言失败导致的崩溃问题。该问题在 8.2.2 中回归。#12472: 修复了从
pytest_report_teststatus
钩子返回类别"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 入口点,因为这个概念现在更加通用。取而代之的是,使用了“外部”、“已安装”或“第三方”插件(或包)的术语。
—— 作者:@webknjaz
#12577:
CI
和BUILD_NUMBER
环境变量的作用在参考文档中进行了描述。它们现在也出现在执行pytest -h
时——作者:@MarcBresson。
面向贡献者的更改¶
#12467: 通过使用
annotations
未来导入,将所有内部类型注解迁移到 python3.10+ 样式。—— 作者:@RonnyPfannschmidt
#11771, #12557: PyPy 运行时版本已从 3.8 更新到 3.9,3.8 版本在垃圾收集器中引入了一个不稳定的 bug,预计不会在那里修复,因为 3.8 已 EoL。
—— 作者:@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 自动化创建拉取请求以更新插件列表的用户体验。以前,维护者必须关闭自动创建的拉取请求并重新打开它们以触发 CI 运行。从现在开始,他们只需要点击
Ready for review
按钮即可。—— 作者:@webknjaz
#12522:
:pull:
RST 角色已被更短的:pr:
取代,因为开始使用第三方 sphinx-issues Sphinx 扩展的实现——作者:@webknjaz。#12531: 覆盖率报告配置已更新,以将 pytest 自己的被标记为预期失败的测试从覆盖率报告中排除。这会减少 flaky tests 对结果数字的影响。
—— 作者:@webknjaz
#12533:
extlinks
Sphinx 扩展不再启用。它曾经声明的:bpo:
角色已随之删除。BPO 本身已于多年前迁移到 GitHub,现在可以使用其 GitHub 问题编号和sphinx-issues
扩展实现的:issue:
角色来链接相关问题。—— 作者:@webknjaz
#12562: 现在通过 pre-commit 工具集成对使用
:user:
RST 角色中可能出现的拼写错误进行 linting——作者:@webknjaz。
pytest 8.2.2 (2024-06-04)¶
错误修复¶
改进的文档¶
pytest 8.2.1 (2024-05-19)¶
改进¶
#12334: 支持 Python 3.13(撰写本文时为 beta1 版本)。
Bug 修复¶
琐碎/内部更改¶
#12333: pytest 发布现在通过 GitHub 最近的 Artifact Attestation 支持进行认证,允许用户验证 pytest 的 sdist 和 wheel 制品的来源。
pytest 8.2.0 (2024-04-27)¶
重大变更¶
#12089: pytest 现在要求
unittest.TestCase
子类可以使用MyTestCase('runTest')
自由实例化。如果类不允许这样做,你可能会在收集过程中看到类似
AttributeError: 'MyTestCase' object has no attribute 'runTest'
的错误。不重写
__init__
或不在__init__
中使用getattr
或类似方法访问测试方法的类不受影响。重写
__init__
的类应注意在给定"runTest"
时不要崩溃,如 unittest.TestCase 的实现所示。或者,考虑使用setUp
代替__init__
。如果在使用
tornado.AsyncTestCase
时遇到此问题,请参阅 issue 12263。如果在使用抽象
TestCase
子类时遇到此问题,请参阅 issue 12275。历史说明:此更改对自定义 TestCase 实现的影响最初未得到充分考虑,因此在次要版本中进行了此更改。对于由此带来的不便,我们深表歉意。
弃用¶
#12069: 当以下任一钩子实现请求已弃用的
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 中移除。
有关更多详细信息,请参阅将钩子的 py.path.local 参数替换为 pathlib.Path。
功能¶
改进¶
#11523:
pytest.importorskip()
现在会发出警告,如果模块可以找到,但抛出ImportError
而不是ModuleNotFoundError
。可以通过向
pytest.importorskip()
传递exc_type=ImportError
来抑制此警告。有关详细信息,请参阅pytest.importorskip 关于 ImportError 的默认行为。
#11728: 对于基于
unittest
的测试,现在会报告类清理期间的异常(由使用TestCase.addClassCleanup
注册的函数引发),而不是静默失败。#11777: 当给定
-vv
时,短测试摘要信息部分中的文本不再被截断。#12112: 改进了在启用
consider_namespace_packages
时命名空间包的检测,涵盖了更多情况(如可编辑安装)。#9502: 添加了
PYTEST_VERSION
环境变量,该变量在 pytest 会话开始时定义,之后未定义。它包含pytest.__version__
的值,除其他外,可以轻松检查代码是否在 pytest 运行中。
Bug 修复¶
#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 多次将其终结器添加到其请求的 fixture 时,在某些情况下会导致不可靠且不直观的拆卸顺序的问题。
#12194: 修复了
--importmode=importlib
和--doctest-modules
的一个错误,即子模块未在父模块中显示为属性。#1489: 修复了在某些情况下,高作用域 fixture 的拆卸未按其初始化时的相反顺序发生的问题。
琐碎/内部更改¶
pytest 8.1.2 (2024-04-26)¶
Bug 修复¶
#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()
现在验证warnings.warn()
是否使用str
或Warning
调用。目前在 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 的多个终结器引发异常时,现在所有异常都报告为异常组。以前只报告第一个异常。
Bug 修复¶
#11475: 修复了
--importmode=importlib
会多次导入非测试模块的回归问题。#11904: 修复了 pytest 8.0.0 中的一个回归问题,即在使用
--pyargs
时,测试收集会因权限错误而失败。此更改改进了使用
--pyargs
指定的测试的收集树,有关与 pytest 8.0 和 <8 的比较,请参阅 #12043。#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)¶
Bug 修复¶
pytest 8.0.1 (2024-02-16)¶
Bug 修复¶
#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 会被模块中的 doctests 忽略。#11937: 修复了 pytest 8.0.0 中的一个回归问题,即在某些情况下,项目会以相反的顺序收集。
pytest 8.0.0 (2024-01-27)¶
Bug 修复¶
pytest 8.0.0rc2 (2024-01-17)¶
改进¶
#11233: 改进了
-r
对 xfailures 和 xpasses 的处理当设置
-rx
时,报告 xfailures 的回溯信息。当设置
-rX
时,报告 xpasses 的捕获输出。对于 xpasses,在摘要中的测试名称和原因之间添加
-
,以匹配 xfail 的显示方式。
#11825:
pytest_plugin_registered
钩子新增了一个plugin_name
参数,其中包含插件注册的名称。
Bug 修复¶
#11706: 修复了在使用
--maxfail
或--stepwise
时,高作用域 fixture 的拆卸错误报告问题。注意:此更改在 pytest 8.0.2 中被撤销,以修复它在 pytest-xdist 中导致的回归问题。
#11758: 修复了在
if highlighted[-1] == "\n" and source[-1] != "\n"
中发生的IndexError: string index out of range
崩溃。这个错误是在 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
并且测试会话中未定义该选项,则将返回None
,无论类型如何。如果既没有提供
default
也没有提供type
,则假定type=str
并返回""
作为默认值(这与以前的行为一致)。
团队决定不为此更改引入弃用期,因为这样做在与社区沟通和实施方面都会很复杂,而且团队认为此更改除了极少数情况外不应破坏现有插件。
#11667: pytest 的
setup.py
文件已移除。如果您依赖此文件(例如使用setup.py install
安装 pytest),请参阅为何不应直接调用setup.py
以获取替代方案。#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.pythonlang.cn/pep-0678/>
的__notes__
进行匹配。
自定义目录收集器¶
#7777: 添加了一个新的钩子
pytest_collect_directory
,它由遍历文件系统的收集器节点调用,例如pytest.Session
、pytest.Dir
和pytest.Package
,用于为子目录创建收集器节点。预计它将返回pytest.Directory
的子类。此钩子允许插件自定义目录的收集。
“新样式”钩子包装器¶
#11122: pytest 内部现在使用“新样式”钩子包装器,自 pluggy 1.2.0 起可用。有关详细信息,请参阅pluggy 的 1.2.0 更改日志和更新的文档。
需要
pytest>=8
的插件可以使用新样式包装器。
其他改进¶
#11216: 如果测试从 xunit setup fixture 内部被跳过,测试摘要现在显示测试位置而不是 fixture 位置。
#11314: 如果未分别提供
--log-file-level
、--log-file-format
和--log-file-date-format
,则使用--log-file
选项将日志记录到文件时,将回退使用--log-level
、--log-format
和--log-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
添加了类型提示。
Bug 修复¶
#10701:
pytest.WarningsRecorder.pop()
将返回列表中最接近匹配的警告,而不是请求类型的第一个警告实例。#11255: 修复了在没有包的情况下
parametrize(..., scope="package")
崩溃的问题。#11277: 修复了一个错误,即当间接参数有多个 fixture 时,参数集会选择最高作用域的 fixture 的作用域,而不是选择作用域最窄的那个。
#11456: 参数化测试现在确实确保了每个输入给定的 ID 是唯一的——例如,
a, a, a0
现在产生a1, a2, a0
而不是以前(有缺陷的)a0, a1, a0
。这必然意味着更改先前冲突的nodeid
,并且为了可读性,当非唯一 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 来管理当前工作目录。如果你将pytester
与monkeypatch.undo()
结合使用,CWD(当前工作目录)可能会被恢复。请改用monkeypatch.context()
。#11333: 修正了
Config.ArgsSource.INVOCATION_DIR
的拼写错误。之前的拼写INCOVATION_DIR
仍保留为别名。#11638: 修复了自测试,使其在调用环境中设置了
FORCE_COLOR
、NO_COLOR
或PY_COLORS
时能够正确通过。
pytest 7.4.4 (2023-12-31)¶
错误修复¶
#11140: 修复了 Python >= 3.8 版本中,文件顶部非字符串常量被检测为文档字符串的问题。
#11572: 处理了一个边界情况,即当故障处理器(Fault Handler)正在拆解时,
sys.stderr
和sys.__stderr__
可能已经关闭。#11710: 修复了集合(collection)错误的回溯信息未被修剪的问题。
#7966: 移除了当
__iter__
方法中抛出异常时,断言重写机制中无用的错误信息。现在它们被视为不可迭代。
改进文档¶
#11091: 更新了文档,以引用带连字符的选项:将
--junitxml
替换为--junit-xml
,将--collectonly
替换为--collect-only
。
pytest 7.4.3 (2023-10-24)¶
错误修复¶
#10447: 标记现在以反向 MRO 顺序考虑,以确保基类标记首先被考虑——这解决了回归问题。
#11239: 修复了断言中使用
:=
影响不相关测试用例的问题。#11439: 处理了一个边界情况,即当故障处理器(Fault Handler)正在拆解时,
sys.stderr
可能已经关闭。
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: 如果
level
通过logging.disable(LEVEL)
全局禁用,caplog.set_level()
和caplog.at_level()
将暂时启用请求的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
对包内文件(带有__init__.py
文件的目录)的“(跳过 N 个文件)”功能。
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: 如果在拆解过程中引发多个错误,我们现在会重新引发一个
ExceptionGroup
,而不是丢弃除最后一个之外的所有错误。#10658: 允许
-p
参数包含空格(例如:-p no:logging
而不是-pno:logging
)。主要在配置文件的addopts
部分有用。#10710: 为
TestReport
对象添加了start
和stop
时间戳。#10727: 将
rootdir
、config file
和testpaths
的报告头分开,使每个都有自己的一行。#10840: pytest 在处理具有病态位置属性的 AST 时,例如测试
Hylang <https://github.com/hylang/hy>__
生成的 AST 时,不应再崩溃。#6267: 如果截断消息比隐藏文本长,测试的完整输出将不再被截断。显示的行号也已修复。
错误修复¶
改进文档¶
#10782: 修复了“良好集成实践”中的最小示例:
pip install -e .
需要在pyproject.toml
中包含version
条目才能成功运行。
微小/内部变更¶
pytest 7.2.2 (2023-03-03)¶
错误修复¶
#10533: 修复了
pytest.approx()
处理包含一个或多个0.0
值的字典的问题。#10592: 修复了同时传递
--cache-show
和--help
时崩溃的问题。#10597: 修复了一个错误,即名为
teardown
的 fixture 方法会被作为nose
拆解阶段的一部分调用。#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
模块的 vendored 副本,但如果安装了py
库,则将使用py
库。如果您需要其他py.*
模块,请继续单独安装已弃用的py
库,否则通常可以将其作为依赖项移除。#4562: 弃用使用属性/标记配置 hook 规范/实现的方式。
请改用
pytest.hookimpl()
和pytest.hookspec()
。有关更多详细信息,请参阅文档。#9886: 为
nose
编写的测试运行功能已正式弃用。这包括
普通的
setup
和teardown
函数和方法:这可能会让用户感到惊讶,因为setup()
和teardown()
不是 pytest 的惯用法,而是nose
支持的一部分。使用 @with_setup 装饰器进行 setup/teardown。
有关更多详细信息,请查阅弃用文档。
#7337: 如果测试函数返回
None
以外的值,现在会发出弃用警告。这可以防止初学者常见的错误,他们可能期望返回布尔值(例如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 环境中运行时,在“短测试摘要信息”中显示完整的崩溃消息。
#9987: 通过允许
.pytest.ini
作为pytest.ini
的替代方案,增加了对隐藏配置文件的支持。
错误修复¶
#10382: 当
raise unittest.SkipTest()
出现在文件顶层时,不要进入 pdb。#7792: 测试类中的标记现在按照完整的 MRO 顺序继承。以前,如果一个测试类继承自两个或更多类,则只有来自第一个超类的标记会生效。
从超类继承标记时,子类的标记现在在 MRO 顺序中排在超类标记之前。以前是相反的。
从超类继承标记时,子类的
pytestmark
属性现在只包含直接应用于它的标记。以前,它也包含来自其超类的标记。请注意,此属性通常不应直接访问;请改用Node.iter_markers
。#9159: 即使在使用
--tb=native
以外的显示选项时,也通过强制在ExceptionGroups
中进行原生显示来显示内部异常。这是在完全实现ExceptionGroups
中内部异常的 pytest 原生显示之前的临时步骤。#9877: 确保在调用
caplog.clear()
后,caplog.get_records(when)
返回当前/正确的数据。
改进文档¶
#10344: 更新了有关编写插件的信息,建议使用
pyproject.toml
而不是setup.py
。#9248: 文档现在使用 Sphinx 5.x 构建(以前是 3.x)。
#9291: 更新了关于
pytest.warns()
如何影响DeprecationWarning
的文档。
微小/内部变更¶
#10313: 使
_pytest.doctest.DoctestItem
导出pytest.DoctestItem
以用于类型检查和运行时目的。使_pytest.doctest
使用内部 API 以避免循环导入。#9906: 使
_pytest.compat
在类型检查器看来重新导出importlib_metadata
。#9910: 修复
cacheprovider
中的默认编码警告(EncodingWarning
)#9984: 改进了尝试访问已拆解的 fixture 时的错误消息。在 docstring 中添加了一个额外的句子,解释何时不宜调用
getfixturevalue
。
pytest 7.1.3 (2022-08-31)¶
错误修复¶
#10060: 在使用
--pdb
运行时,当通过unittest.skip
或pytest.mark.skip
跳过测试类时,TestCase.tearDown
不再为这些测试调用。#10190: setup 或 teardown 错误消息中的无效 XML 字符现在已为 JUnit XML 报告正确转义。
#10230: 忽略 pip 21.3 中引入的基于
pyproject.toml
的可编辑构建创建的.py
文件。#3396: doctest 现在遵循
--import-mode
标志。#9514: 将
FixtureRequest.param
类型注解为Any
,作为在 #8073 修复之前的临时措施。#9791: 修复了
rewrite.py
中看起来工作正常但实际上不正确并在某些系统上失败的路径处理代码。#9917: 修复了
pytest.approx()
在比较元组时的字符串表示问题。
改进文档¶
微小/内部变更¶
#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 中的一个回归问题,即源树之外的一些
conftest.py
文件(例如在site-packages
目录中)未被识别。
pytest 7.1.0 (2022-03-13)¶
破坏性更改¶
改进¶
#5192: 修复了某些数据类型的测试输出,其中
-v
会显示较少信息。此外,在显示序列的差异时,
-q
会生成完整差异而不是预期差异。#9362: 当检测到
attrs
或dataclasses
中覆盖了默认的__eq__
时,pytest 现在会避免专门的断言格式化。#9536: 当命令行中给出
-vv
时,完整显示跳过和 xfail 的原因,而不是截断以适应终端宽度。#9644: 现在可以通过启用
tracemalloc
获取导致 Python 抛出ResourceWarning
的资源位置的更多信息。有关更多信息,请参阅资源警告。
#9678:
@pytest.mark.parametrize
的ids
参数现在接受更多类型。以前只接受str
、float
、int
和bool
;现在bytes
、complex
、re.Pattern
、Enum
以及任何具有__name__
的类型也都被接受。#9692:
pytest.approx()
现在在给定无序序列(如set
)时会引发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
返回非绑定方法而不是绑定方法。修复了unittest
测试用例在拆解失败时(使用非默认__init__
)的崩溃问题。在 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
。详情请参阅自定义节点子类的构造函数应接受 **kwargs。请注意,只有当 pytest 期望传递的参数存在冲突时,才会发出弃用警告。此弃用已是 pytest 7.0.0rc1 的一部分,但未记录。
错误修复¶
#9355: 修复了 Python 3.8 及更高版本中,使用 `assert` 时错误消息打印函数装饰器的问题。
#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: hook 的
py.path.local
参数已被弃用。有关完整详情,请参阅弃用说明。Node 构造函数的
py.path.local
参数已被弃用。有关完整详情,请参阅弃用说明。#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
钩子。pytest.CallInfo
对应CallInfo
类型,传递给各种钩子。pytest.PytestPluginManager
对应PytestPluginManager
。pytest.ExceptionInfo
对应ExceptionInfo
类型,从pytest.raises()
返回并传递给各种钩子。pytest.Parser
对应Parser
类型,传递给pytest_addoption
钩子。pytest.OptionGroup
对应OptionGroup
类型,从parser.addgroup
方法返回。pytest.HookRecorder
对应HookRecorder
类型,从Pytester
返回。pytest.RecordedHookCall
对应RecordedHookCall
类型,从HookRecorder
返回。pytest.LineMatcher
对应LineMatcher
类型,用于RunResult
及其他。pytest.TestReport
对应TestReport
类型,用于各种钩子。pytest.CollectReport
对应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
相同的路径)的替代品。虽然fspath
由于reportinfo()
等方法的持续迁移尚未弃用,但我们预计将在未来的版本中弃用它。#8421:
pytest.approx()
现在适用于映射/字典和序列/列表中的Decimal
。#8606: 使用
--fixtures-per-test
和--fixtures
调用 pytest 已得到增强:夹具位置路径与夹具名称一起打印。
夹具 docstring 的第一部分在夹具名称下方打印。
使用
--verbose
选项时,夹具的整个 docstring 在夹具名称下方打印。
#8761: 新增 pytest.version_tuple 属性,这使得用户可以更简单地根据 pytest 版本执行操作(例如声明在较新版本中引入的 hook)。
#8789: 将 TOML 解析器从
toml
切换到tomli
,以支持pyproject.toml
中的 TOML v1.0.0。#8920: 添加了
pytest.Stash
,这是一个允许插件以类型安全和无冲突的方式将数据存储在Config
和Node
上的工具。有关详细信息,请参阅跨钩子函数在项上存储数据。#8953:
RunResult
方法assert_outcomes()
现在接受warnings
参数来断言捕获到的警告总数。#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
钩子中使用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
中显示夹具路径时,来自 pytest 本身的夹具现在显示省略的路径,而不是site-packages
目录中文件的完整路径。#8898: 复杂数现在在生成参数化 ID 时被视为浮点数和整数。
#9062:
--stepwise-skip
现在隐式启用--stepwise
,并且可以单独使用。#9205:
pytest.Cache.set()
现在在保存字典时保留键的顺序。
错误修复¶
#7124: 修复了当提供了
--doctest-modules
时,__main__.py
会引发ImportError
的问题。#8061: 修复了继承自父测试类的
staticmethod
测试用例失败的问题。#8192:
testdir.makefile
现在默默地接受不以.
开头的值,以保持与旧版 pytest 的向后兼容性。如果
ext
参数中缺少.
,pytester.makefile
现在会发出更清晰的错误。#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 的内部夹具使用私有名称,以便它们在默认的
--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: 修复了从会话范围的 fixture 访问
request.fspath
/request.path
时出现混淆错误消息的问题。#9163: 断言重写语句的结束行号和结束列偏移量现在已正确设置。
#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 artifact 的命令:使用 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 上的断言重写问题。
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: 为
LineMatcher
类添加了__str__
实现,该类从pytester.run_pytest().stdout
等返回。它返回整个输出,就像现有的str()
方法一样。#2044: 详细模式现在会在测试的终端行中“SKIPPED”、“XFAIL”或“XPASS”之后显示测试被跳过的原因。
#7469 内置 pytest fixture 的类型现已导出,以便可在测试函数的类型注解中使用。新导出的类型包括
pytest.FixtureRequest
对应request
fixture。pytest.Cache
对应cache
fixture。pytest.CaptureFixture[bytes]
对应capfdbinary
和capsysbinary
fixture。pytest.LogCaptureFixture
对应caplog
fixture。pytest.Pytester
对应pytester
fixture。pytest.Testdir
对应testdir
fixture。pytest.TempdirFactory
对应tmpdir_factory
fixture。pytest.TempPathFactory
对应tmp_path_factory
fixture。pytest.MonkeyPatch
对应monkeypatch
fixture。pytest.WarningsRecorder
对应recwarn
fixture。
构造它们不受支持(
MonkeyPatch
除外);它们仅用于类型注解。这样做会发出弃用警告,并且在 pytest 8.0 中可能会成为硬性错误。子类化它们也不受支持。目前在运行时不强制执行,但会被 mypy 等类型检查器检测到。
#7527: 当相同类型的
namedtuple
实例之间比较失败时,pytest 现在显示不同的字段名称(可能嵌套),而不是它们的索引。#7615:
Node.warn
现在允许任何Warning
的子类,而不仅仅是PytestWarning
。#7701: 改进了使用
--collected-only
时的报告。现在它将在摘要统计中显示收集到的测试数量。#7710: 在
pytest.approx()
中对非数值类型使用严格相等比较,而不是引发TypeError
。这是 3.7 之前未文档化的行为,但现在是正式支持的功能。
#7938: 新增
--sw-skip
参数,它是--stepwise-skip
的简写。#8023: 将
'node_modules'
添加到norecursedirs
的默认值中。#8032:
doClassCleanups
(在 Python 3.8 的unittest
中引入)现在被适当地调用。
错误修复¶
#4824: 修复了使用自动夹具和 xunit 夹具收集项目时的二次行为并提高了性能。
#7758: 修复了 pytest 5.4.0 中引入的一个问题,即包中的某些文件在
--lf
中丢失,即使它们包含失败的测试。#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
钩子已弃用,取而代之的是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 参考中,但希望将来会出现。
Bug 修复¶
#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 上触发操作系统级语法错误的命令行选项的问题,例如
pytest-xdist
内部使用的选项。#7742: 修复了在使用错误的
exec
访问 locals / globals 时出现的 INTERNALERROR。
改进的文档¶
#1477: 移除了 faq.rst 及其在 contents.rst 中的引用。
琐碎/内部更改¶
#7536: 内部
junitxml
插件已重写为使用xml.etree.ElementTree
。XML 元素中属性的顺序可能会有所不同。一些不必要的转义不再执行。#7587: 对
more-itertools
包的依赖已被移除。#7631:
capfd.readouterr()
(及类似)的结果类型不再是命名元组,但其所有行为都应与命名元组相同。这是出于技术原因。#7671: 在收集测试时,pytest 通过检查 Python 对象(模块、类和实例)的属性来查找测试类和函数。为了加快此过程,pytest 现在会忽略内置属性(如
__class__
、__delattr__
和__new__
),而无需查阅python_classes
和python_functions
配置选项,也无需通过pytest_pycollect_makeitem
钩子将它们传递给插件。
pytest 6.0.2 (2020-09-04)¶
Bug 修复¶
pytest 6.0.1 (2020-07-30)¶
Bug 修复¶
#7394: 现在允许向
Parser.add_option
传递空的help
值,而不是在运行pytest --help
时崩溃。传递None
会引发更具信息性的TypeError
。#7558: 修复 pylint 对
pytest.mark.parametrize()
和其他内置标记(skip
、skipif
、xfail
、usefixtures
、filterwarnings
)的not-callable
错误。#7559: 修复了当
TestReport.longrepr
不是字符串时,使用TestReport.longreprtext
的插件(例如pytest-html
)中的回归问题。#7569: 修复了在调用
caplog.set_level()
后,日志捕获处理程序的级别在 teardown 时未重置的问题。
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()
函数现在会显示更清晰的错误消息。在这种情况下,建议转义正则表达式。
Bug 修复¶
改进的文档¶
琐碎/内部更改¶
#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 版中,为当前目录和在收集期间解析符号链接作为 bug 修复引入,但它实际上是一个新功能,在 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
钩子规范。这个钩子至少十年未被 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
的新钩子,用于传达有关内部pytest
警告插件捕获的警告信息。此钩子旨在取代已弃用并将在未来版本中移除的
pytest_warning_captured
。#6471: 新命令行标志:
--no-header
: 禁用初始头部,包括平台、版本和插件信息。--no-summary
: 禁用最终测试摘要,包括警告。
#6856: 现在当从配置 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
的输出被管道传输且管道被接收程序关闭时(常见示例是less
和head
),pytest
命令现在会抑制打印到 stderr 的BrokenPipeError
错误消息。#4391: 提高了测试持续时间测量的精度。
CallInfo
项现在有一个新的<CallInfo>.duration
属性,使用time.perf_counter()
创建。此属性用于填充<TestReport>.duration
属性,它比以前的<CallInfo>.stop - <CallInfo>.start
更准确(因为这些基于time.time()
)。#4675: dataclasses 和
attrs
类的富比较现在是递归的。#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: 收集到的文件在任何钩子报告之后显示,例如
--lf
的状态。#7091: 当使用
fd
捕获时,通过--capture=fd
或capfd
和capfdbinary
fixtures,并且文件描述符(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()
不再影响在“捕获日志报告”部分中显示的日志级别。#7348: 改进了 dataclasses / attrs 上比较断言的递归 diff 报告。
#7385:
--junitxml
现在在 setup 和 teardown 期间的失败中,将异常原因包含在message
XML 属性中。以前:
<error message="test setup failure">
现在:
<error message="failed on setup with "ValueError: Some error during setup"">
Bug 修复¶
#4677: SKIPPED 测试的摘要报告中显示的路径现在始终是相对路径。以前有时是绝对路径。
#5456: 修复了尝试删除用于控制对
tmp_path
和tmpdir
创建的文件夹的访问的锁文件时可能出现的竞争条件。#6240: 修复了收集步骤中的日志记录导致日志消息重复输出到 stderr 的问题。
#6428: 如果自会话开始以来当前工作目录已更改,错误消息中显示的路径现在是正确的。
#6871: 修复了使用
capsysbinary
时捕获输出导致的崩溃。#6909: 恢复了 #6330 引入的更改,该更改要求
@pytest.mark.parametrize
的所有参数都必须在函数签名中或通过indirect
显式定义。原始更改的意图是消除预期中的意外/令人惊讶的行为,但事实证明许多人依赖它,因此该限制已被恢复。
#6910: 修复了当插件在使用
--reportlog
选项时返回未知统计信息导致的崩溃。#6924: 确保
unittest.IsolatedAsyncioTestCase
确实被等待。#6925: 修复了
TerminalRepr
实例可再次哈希的问题。#6947: 修复了当测试失败时,注册到
unittest.TestCase.addCleanup()
的函数未被调用的回归问题。#6951: 允许用户仍然设置已弃用的
TerminalReporter.writer
属性。#6956: 阻止 pytest 将
ConftestImportFailure
堆栈跟踪打印到 stdout。#6991: 修复了自 pytest 5.4 以来
--lf
过滤过多导致的回归。#6992: 恢复 “tmpdir: clean up indirection via config for factories” #6767,因为它会破坏 pytest-xdist。
#7061: 当一个 yielding fixture 无法 yield 值时,报告一个测试 setup 错误而不是崩溃。
#7076:
@pytest.mark.skip
跳过的文件在 SKIPPED 报告中的路径现在相对于调用目录。以前它相对于根目录。#7110: 修复了回归问题:
asyncbase.TestCase
测试现在再次正确执行。#7126: 当 Python 使用
-bb
标志调用时,--setup-show
不再在字节值用作parametrize
参数时引发错误。#7143: 修复
pytest.File.from_parent
,使其将额外的关键字参数转发给构造函数。#7145: 具有损坏的
__getattribute__
方法的类在失败时会正确显示。#7150: 防止在引发
ConfTestImportFailure
时隐藏底层异常。#7180: 修复
_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)¶
Bug 修复¶
pytest 5.4.2 (2020-05-08)¶
Bug 修复¶
#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: 修复
_is_setup_py
对于与区域设置编码不同的文件的问题。
pytest 5.4.1 (2020-03-13)¶
Bug 修复¶
pytest 5.4.0 (2020-03-12)¶
破坏性更改¶
#6316:
-k EXPRESSION
与测试名称的匹配现在不区分大小写。#6443: 用
-p
指定的插件现在在内部插件之后加载,这导致它们的钩子在内部插件之前被调用。这使得
-p
的行为与PYTEST_PLUGINS
保持一致。#6637: 移除了长期弃用的
pytest_itemstart
钩子。此钩子已被标记为弃用,并且十多年来甚至没有被 pytest 调用过。
#6673: 反转/修正了错误 diff 中“+/-”的含义。“-”表示结果中缺少预期内容,“+”表示结果中存在意外额外内容。
#6737: 当结果不可用时,
FixtureDef
的cached_result
属性现在设置为None
,而不是被删除。如果您的插件执行像
hasattr(fixturedef, 'cached_result')
这样的检查,例如在pytest_fixture_post_finalizer
钩子实现中,请将其替换为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
钩子。自 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
钩子现在接收一个location
参数,其中包含生成警告的代码位置。#6213: pytester:
testdir
fixture 尊重内部运行的monkeypatch
fixture 中的环境设置。#6247:
--fulltrace
在收集错误时也会生效。#6384: 使
--showlocals
也适用于--tb=short
。#6653: 添加了对使用
LineMatcher
的fnmatch_lines()
和re_match_lines()
连续匹配行的支持。#6658: 当安装
pygments
时,代码现在在堆栈跟踪中高亮显示。鼓励用户在其环境中安装
pygments
并提供反馈,因为未来的计划是使pygments
成为一个常规依赖。#6795: 使用无效的
-o
选项导入用法错误消息。#759:
pytest.mark.parametrize
支持迭代器和生成器作为ids
。
Bug 修复¶
#310: 添加了对 doctests 中调用
pytest.xfail()
和pytest.importorskip()
的支持。#3823:
--trace
现在与 unittests 兼容。#4445: 修复了 pytest 产生的一些警告报告,使其指向用户代码中警告的正确位置。
#5301: 修复了
--last-failed
无法从已知失败的文件中收集新测试的问题。#5928: 在用户代码级别报告
PytestUnknownMarkWarning
,而不是在pytest
级别。#5991: 修复了
--pdb
与 unittests 的交互:不再使用 unittest 的TestCase.debug()
。#6334: 修复了当
-r
命令行选项中同时使用f/F
和s/S
报告字符(例如-rFf
)时,摘要条目出现两次的问题。大写形式从未被文档化,首选形式应为小写。
#6409: 对于没有先前通过的非最后一个项目,带有彩色终端进度指示器时,回退到绿色(而不是黄色)。
#6454:
--disable-warnings
在-ra
和-rA
时也生效。#6497: 修复了 fixture 中请求键与缓存键比较时的 bug。
构造
if key == cached_key:
可能会失败,原因要么是明确禁止使用==
,要么是因为(例如 NumPy 数组)a == b
的结果通常无法转换为bool
。已实现的修复将==
替换为is
。#6557: 使捕获输出流的
.write()
方法返回与原始流相同的值。#6566: 修复了
EncodedFile.writelines
,使其调用底层缓冲区的writelines
方法。#6575: 修复了当
faulthandler
已初始化(例如设置了PYTHONFAULTHANDLER=1
环境变量)并且在配置文件中定义了faulthandler_timeout
时发生的内部崩溃。#6597: 修复了包含参数化空字符串变量的节点 ID。
#6646: 断言重写钩子已为当前项目(重新)存储,这修复了它们在例如 pytester 的
testdir.runpytest
等之后仍被使用的问题。#6660:
pytest.exit()
在从pytest_sessionfinish
钩子发出时得到处理。这包括从调试器退出。#6752: 当
pytest.raises()
作为函数(而不是上下文管理器)使用时,match
关键字参数现在会传递给被测试的函数。以前它会被吞噬并忽略(pytest 5.1.0 中的回归)。#6801: 对于 doctests 中意外异常的堆栈跟踪,不要在中间显示空行。
#6802:
testdir fixture
现在可以在 doctests 中使用。
改进的文档¶
琐碎/内部更改¶
#6404: 移除了对
parser
模块的使用,该模块在 Python 3.9 中已弃用。
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: 拆卸期间捕获的输出显示为
-rP
。#5971: 修复了处理
multiprocessing
模块创建的子进程中引发的异常时pytest-xdist
崩溃的问题。#6436:
FixtureDef
对象现在可以正确地将其终结器注册到在夹具堆栈中其之前执行的 autouse 和参数化夹具,以便它们在正确的时间以正确的顺序拆卸。#6532: 修复了
testdir
结果中包含多个错误的结果解析问题(5.3.0 版本中的回归)。
琐碎/内部更改¶
#6350: 优化了测试参数 ID 的自动重命名功能。
pytest 5.3.2 (2019-12-13)¶
改进¶
#4639: 恢复“现在对
None
进行断言时会发出警告”。事实证明,该警告不如最初预期有用,并且存在相当多的误报情况。
错误修复¶
pytest 5.3.1 (2019-11-25)¶
改进¶
#6231: 改进了 pytest.mark.parametrize 拼写错误的检查。
#6257: 处理通过
pytest_internalerror
使用pytest.exit()
的情况,例如从事后调试器 (pdb) 退出时。
错误修复¶
#5914: pytester: 修复在正向匹配后使用
no_fnmatch_line()
的问题。#6082: 修复了
property
文档字符串中 doctest 示例的行检测问题,作为对 python/cpython#61648 的 workaround。#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
的参数,以便在设置命令行选项时可以调用钩子。这对于一个插件向另一个插件通信非常有用,例如传递默认值或要添加的命令行选项集。
改进¶
#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:
repr
的ExceptionInfo
对象已得到改进,以尊重底层异常的__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
不再无条件跳过/xfail FreeBSD 上的测试。#6097: 测试摘要中的“[...%]”指示器现在根据最终(新)多色行的主要颜色进行着色。
#6116: 添加
--co
作为--collect-only
的同义词。#6148:
atomicwrites
现在仅在 Windows 上使用,修复了 Unix 上断言重写的性能回归问题。#6152: 现在参数化将使用任何对象的
__name__
属性作为 ID,如果存在的话。以前它只对函数和类使用__name__
。#6176: 改进了 pytester 的
Hookrecorder.assertoutcome
的失败报告。#6181: 会话停止的原因,例如由于
--maxfail
/-x
,现在会在测试摘要中报告。#6206: 提高了
cache.set
的健壮性和性能。
错误修复¶
#2049: 修复了
--setup-plan
显示关于夹具生命周期的不准确信息的问题。#2548: 修复了终端摘要中跳过测试的行偏移不匹配问题。
#6039: 当取消配置 doctest 插件时,
PytestDoctestRunner
现在会正确失效。这在使用
pytester
的runpytest_inprocess
时很重要。#6047:
saferepr
现在处理BaseExceptions
,其中包括pytest.fail.Exception
等。#6074: pytester: 修复了清理临时目录时
rm_rf
警告中参数的顺序,并且不针对os.open
错误发出警告。#6189: 修复了
getmodpath
方法的结果。
琐碎/内部更改¶
#4901:
pytester
中的RunResult
现在在ret
属性是有效的pytest.ExitCode
值时显示其助记符。
pytest 5.2.4 (2019-11-15)¶
错误修复¶
pytest 5.2.3 (2019-11-14)¶
错误修复¶
pytest 5.2.2 (2019-10-24)¶
错误修复¶
pytest 5.2.1 (2019-10-06)¶
错误修复¶
#5902: 修复了
attrs>=19.2
中关于已废弃cmp
属性的警告。
pytest 5.2.0 (2019-09-28)¶
废弃¶
#1682: 将参数作为位置参数传递给
pytest.fixture()
已废弃 - 请改为将其作为关键字参数传递。
功能¶
错误修复¶
琐碎/内部更改¶
#5056: HelpFormatter 使用
py.io.get_terminal_width
来更好地检测宽度。
pytest 5.1.3 (2019-09-18)¶
错误修复¶
pytest 5.1.2 (2019-08-30)¶
错误修复¶
#2270: 修复了函数作用域夹具中定义的插件类的
self
引用问题:以前self
是对*测试*类的引用,而不是*插件*类的引用。#570: 修复了长期存在的问题,即在参数化期间使用间接夹具时,夹具作用域未被尊重。
#5782: 修复了打印来自
--pastebin
的错误响应时的解码错误。#5786: 测试和收集报告中的链式异常现在已正确序列化,允许像
pytest-xdist
这样的插件正确显示它们。#5792: Windows: 修复了在某些情况下从工作目录加载
conftest.py
时出现的问题,该工作目录的大小写与文件系统中存储的大小写不同(例如,c:\test
而不是C:\test
)。
pytest 5.1.1 (2019-08-20)¶
错误修复¶
#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
钩子。RemovedInPytest4Warning
警告类型。request
现在是夹具的保留名称。
有关更多信息,请参阅文档中的弃用和移除。
#5565: 移除了 unittest2 的未使用支持代码。
自 Python 3.3+ 以来,
unittest2
后向移植模块不再需要,pytest 中支持它的少量代码似乎也未使用:移除后,所有测试仍然不变地通过。尽管我们的政策是在移除任何功能或对第三方库的支持之前引入废弃期,但由于此代码显然根本未使用(即使
unittest2
被 pytest 执行的测试套件使用),因此决定在此版本中将其移除。如果您因此遇到回归问题,请提交一个 issue。
#5615:
pytest.fail
、pytest.xfail
和pytest.skip
不再支持将字节作为消息参数。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: 在 Python 3.8+ 上,用标准库中的
importlib.metadata
替换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
添加文档字符串。
琐碎/内部更改¶
#5095:
xunit2
系列的 XML 文件现在由 pytest 自己的测试套件根据 schema 进行验证,以避免未来的回归。#5516: 缓存节点拆分功能,这可以提高非常大型测试套件的收集性能。
#5603: 简化了内部
SafeRepr
类并删除了一些死代码。#5664: 当使用
PYTHONDONTWRITEBYTECODE=1
调用 pytest 自己的测试套件时,test_xfail_handling
测试不再失败。#5684: 在代码库中,用新的
OSError
子类(PermissionError
、FileNotFoundError
等)替换手动处理OSError.errno
的方式。
pytest 5.0.1 (2019-07-04)¶
错误修复¶
改进的文档¶
#5517: 改进“编写插件”章节中的“声明新钩子”部分。
pytest 5.0.0 (2019-06-28)¶
重要¶
此版本仅支持 Python 3.5+。
更多详情,请参阅我们的 Python 2.7 和 3.4 支持计划。
移除¶
#1149: Pytest 不再接受命令行参数的前缀,例如输入
pytest --doctest-mod
代替--doctest-modules
。以前,ArgumentParser
认为这是明确的,因此允许这样做,但由于插件选项的延迟解析,这可能是不正确的。例如,请参阅 issues #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
钩子,当断言*通过*时,会随上下文信息一起调用。此钩子仍处于**实验性**阶段,请谨慎使用。
#5440:
faulthandler
标准库模块现在默认启用,以帮助用户诊断 C 模块中的崩溃。此功能通过将外部 pytest-faulthandler 插件集成到核心中提供,因此如果用户曾使用该插件,则应将其从依赖项中移除。
更多信息请参阅文档:故障处理程序。
#5452: 当警告被配置为错误时,pytest 警告现在显示为源自
pytest.
,而不是内部的_pytest.warning_types.
模块。#5125:
Session.exitcode
值现在编码在pytest.ExitCode
(一个IntEnum
)中。这使得退出代码可供消费者代码使用,并且比仅仅文档化更明确。用户定义的退出代码仍然有效,但应谨慎使用。团队预计此更改通常不会破坏测试套件或插件,但在一些深奥/特定的场景中除外。
pytest-xdist 用户应升级到
1.29.0
或更高版本,因为此更改导致pytest-xdist
需要兼容性修复。
错误修复¶
#1403:从
imp
切换到importlib
。#1671:断言写入器缓存的
.pyc
文件名现在包含 pytest 版本,以避免陈旧缓存。#2761:在不区分大小写的文件系统上遵循**PEP 235**。
#5078:使用
--pyargs
时,测试模块不再被重复导入。#5260:改进了字节字符串的比较。
比较字节时,断言消息过去在显示差异时显示字节的数值
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()
时断言不正确的问题。#5383:当使用
--log-cli-level
时,-q
再次对收集到的项目(--collect-only
)的样式产生影响。#5389:修复 #5063 导致的
importlib_metadata.PathDistribution
回归,其files
属性为None
。#5390:修复
TestCase
项目的obj
属性不再绑定到方法的问题。#5432:当多次在进程内调用 pytest 时,阻止断言重写器发出“已导入”警告。
#5433:修复包(
__init__.py
)中的断言重写问题。#5444:修复当命令行中传递的第一个文件收集失败时
--stepwise
模式的问题。#5482:修复 4.6.0 中引入的错误,该错误导致在向
pytest.mark.parametrize
传递超过 2 个位置参数时出现收集错误。#5505:修复在使用
-p no:terminal
时发现失败导致的崩溃问题。
改进的文档¶
pytest 4.6.11 (2020-06-04)¶
错误修复¶
#6334: 修复了当
-r
命令行选项中同时使用f/F
和s/S
报告字符(例如-rFf
)时,摘要条目出现两次的问题。大写形式从未被文档化,首选形式应为小写。
#7310:修复当插件以非传统状态返回报告对象时,
_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: 移除了对
parser
模块的使用,该模块在 Python 3.9 中已弃用。
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
仅固定到0.4.1
版本,用于 Python 3.4,以便更新的 Python 版本仍能接收 colorama 更新。
pytest 4.6.7 (2019-12-05)¶
错误修复¶
pytest 4.6.6 (2019-10-11)¶
错误修复¶
琐碎/内部更改¶
#5801:修复了 Python 版本检查(由
flake8-2020
检测到),以防 Python 4 出现。
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
的调用展开为完整的 for 循环并进行断言重写,以提供更好的失败消息,尤其是在使用生成器表达式时。#5063:从
pkg_resources
切换到importlib-metadata
进行入口点检测,以提高性能和导入时间。#5091:改进了
--help
中 ini 选项的输出。#5269:
pytest.importorskip
现在在默认的reason
中包含ImportError
。#5311:为每个失败测试输出的捕获日志现在使用 ColoredLevelFormatter 进行格式化。
#5312:改进了 Python 3 中多行日志消息的格式。
错误修复¶
#2064:调试插件现在按需导入包装的
Pdb
类(--pdbcls
)。#4908:
pytest_enter_pdb
钩子现在在事后(--pdb
)被调用。#5036:修复了依赖于其他参数化 fixture 的 fixture 会被错误地参数化的问题。
#5256:处理由于 Jython 中无法表示孤立的代理 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
不会重新运行所有已知失败(来自未选择的测试)的回归问题。
改进的文档¶
#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
(运行上次失败)的报告。#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>
标签。生成的 XML 与最新的 xunit 标准兼容,与
record_property
和record_xml_attribute
记录的属性不同。#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
。#5059:pytester 的
Testdir.popen()
现在通过带有默认值(subprocess.PIPE
)的关键字参数使用stdout
和stderr
。#5069:终端中简短测试摘要的代码已移至终端插件。
#5082:改进了 pytester 插件中各种方法的 kwargs 验证。
#5202:当与
junit_family=xunit2
一起使用时,record_property
现在会发出PytestWarning
:该 fixture 将property
标签生成为testcase
的子元素,根据最新的schema,这是不允许的。#5239:将
pluggy
固定到< 1.0
版本,以避免在其发布时自动更新到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:当未安装合适的异步插件(例如
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:Doctest 现在可以使用
pytest.skip()
动态跳过。#4920:已进行内部重构,以便实现 pytest-subtests 插件,该插件增加了 unittest 子测试支持和一个新的
subtests
fixture,如 #1367 中讨论。有关内部重构的详细信息,请参阅相关 PR 的详细说明。
#4931:pytester 的
LineMatcher
断言传递的行是一个序列。#4936:处理在
-p no:plug
之后的-p plug
。这可以用于从命令行等覆盖被阻止的插件(例如在“addopts”中)。
#4951:当仅通过 fixtures (capsys, capfs) 并使用
pdb.set_trace()
进行捕获时,输出捕获得到正确处理。#4956:
pytester
在测试运行期间将$HOME
和$USERPROFILE
设置为临时目录。这确保不会从实际用户的主目录加载配置文件。
#4980:使用
monkeypatch.syspath_prepend
和testdir.syspathinsert
(通过pkg_resources.fixup_namespace_packages
)更好地处理命名空间包。#4993:分步插件现在报告状态信息。
#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:修复标记收集错误中的行偏移(偏差为 1)。
改进的文档¶
#4974:更新
pytest_cmdline_parse
钩子的文档,以说明可用性限制。
琐碎/内部更改¶
#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
**实验性** 钩子。这些钩子将用于
pytest-xdist
、pytest-subtests
以及 resultlog 的替代方案,以序列化和自定义报告。它们是实验性的,这意味着其细节可能会在未来的补丁版本中更改甚至完全移除,恕不另行通知。
欢迎插件作者和用户提供反馈。
#4987:
Collector.repr_failure
现在遵守--tb
选项,但现在(使用auto
时)仅默认为short
。
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()
方法,现在可以通过钩子设置log_file
路径。
错误修复¶
pytest 4.2.1 (2019-02-12)¶
错误修复¶
#2895:
pytest_report_collectionfinish
钩子现在也通过--collect-only
调用。#3899:当导入的包包含
pytest_plugins.py
子模块时,不再引发UsageError
。#4347:修复在使用 pdb++ 进行递归调试时输出捕获的问题。
#4592:修复通过父级
conftest.py
处理collect_ignore
的问题。#4700:修复回归问题:即使子类中应用了
unittest.skip()
装饰器导致所有测试被跳过,setUpClass
仍然会在子类中被调用。#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 fixture 的范围。
这修复了许多令人惊讶的问题,例如
setup_method
在会话范围的 autouse fixture 之前被调用(参见 #517 获取示例)。#4627:当在 Python 2.7 和 3.4 下运行时,测试会话结束时会显示一条消息,表明 pytest 5.0 将不再支持这些 Python 版本。
#4660:当使用
-k
或-m
标志时,现在也会显示 已选择 测试的数量。#4688:
pytest_report_teststatus
钩子现在也可以接收config
参数。#4691:
pytest_terminal_summary
钩子现在也可以接收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
fixture 及其他相关 fixture 现在提供解析后的路径(即真实路径)。#4667:
pytest_terminal_summary
现在使用pytest_report_teststatus
钩子的结果,而不是硬编码的字符串。#4669:正确处理 Python 2 中包含非 ASCII 字符的
unittest.SkipTest
异常。#4680:确保
tmpdir
和tmp_path
fixture 指向同一个文件夹。#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 测试的支持——它们从根本上是损坏的,因为它们在收集和测试执行分离后不能正确支持 fixture。
请参阅我们关于如何更新代码的文档。
#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
的部分一直以来都是冲突和 bug 的来源。请注意,对于 **pytest.ini** 和 **tox.ini** 文件,该部分仍然是
[pytest]
。#3616: 移除了
node.Class/Function/Module
的弃用兼容属性 - 现在请使用pytest.Class/Function/Module
。请参阅我们关于如何更新代码的文档。
#4421: 移除了
pytest_namespace
钩子的实现。请参阅我们关于如何更新代码的文档。
#4489: 移除了
request.cached_setup
。这是现代 fixture 的前身机制。请参阅我们关于如何更新代码的文档。
#4535: 移除了弃用的
PyCollector.makeitem
方法。此方法很久以前因错误而公开。#4543: 移除了对使用
pytest_funcarg__
前缀定义 fixture 的支持。请改用@pytest.fixture
装饰器。请参阅我们关于如何更新代码的文档。
#4545: 现在直接调用 fixture 总是会引发错误,而不是警告。
请参阅我们关于如何更新代码的文档。
#4546: 移除了
Node.get_marker(name)
,其返回值除了进行存在性检查外无法用于更多用途。请使用
Node.get_closest_marker(name)
作为替代。#4547: 弃用的
record_xml_property
fixture 已被移除,请改用更通用的record_property
。有关更多信息,请参阅我们的文档。
#4548: 如果
pytest_plugins
变量定义在非顶级conftest.py
文件中(即,不在rootdir
中),现在会引发错误。有关更多信息,请参阅我们的文档。
#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 with a string as the second argument。
新功能¶
#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 时间。您可以将此添加到
pytest.ini
文件中,以仅包含调用持续时间(不包括 setup 和 teardown)。[pytest] junit_duration_report = call
#4532:
-ra
现在会将错误和失败显示在最后,而不是作为摘要中的首项。这使得选择性运行测试时更容易获取错误和失败列表。
#4599:
pytest.importorskip
现在支持reason
参数,当请求的模块无法导入时,将显示此原因。
错误修复¶
改进的文档¶
琐碎/内部更改¶
#4447: 将
--result-log
的弃用类型更改为PytestDeprecationWarning
。已决定在下一个主要版本中移除此功能。
pytest 4.0.2 (2018-12-13)¶
错误修复¶
改进的文档¶
#1495: 文档化常见 doctest fixture 目录树结构陷阱
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: 修复 report_collect 中与 _collect_report_last_write 相关的 TypeError。
琐碎/内部更改¶
#4305: 将 test_capture 中的 byte/unicode 助手替换为 Python 级别语法。
pytest 3.10.0 (2018-11-03)¶
新功能¶
#2619: 使用
__import__("pdb").set_trace()
在continue
后恢复输出捕获。这还添加了一个新的
pytest_leave_pdb
钩子,并将pdb
传递给现有的pytest_enter_pdb
钩子。#4147: 添加
--sw
,--stepwise
作为--lf -x
的替代,用于在第一次失败时停止,但在该测试之后开始下一次测试调用。更多信息请参阅文档。#4188: 在非详细模式下运行时,使
--color
发出彩色点。在此之前,只有在同时传递--verbose
时,才会对逐个测试的输出进行着色。#4225: 在非静默模式下使用终端时,提高收集报告的性能。
“collecting …” 消息每 0.5 秒打印/更新一次。
错误修复¶
#2701: 修复虚假的
RemovedInPytest4Warning: usage of Session... is deprecated, please use pytest
警告。#4046: 修复在
__init__.py
包文件中运行测试的问题。#4260: 在源代码匿名编译期间抑制警告。
#4262: 修复删除由
tmpdir
/tmp_path
创建的过期目录时发生的访问拒绝错误。#611: 将 fixture 命名为
request
现在会引发警告:request
fixture 是内部的,不应被覆盖,因为它会导致内部错误。#4266: 处理(忽略)在收集过程中引发的异常,例如 Django 的 LazySettings 代理类。
改进的文档¶
#4255: 补充了关于传递给过滤警告的模块名称未进行正则表达式转义的缺失文档。
琐碎/内部更改¶
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: 修复
pytest_sessionstart()
和pytest_sessionfinish()
钩子中未显示日志消息的问题。#3533: 修复 JUnit 报告中跳过测试的未转义 XML 原始对象问题
#3691: Python 2: 安全地格式化关于将 unicode 字符串传递给
warnings.warn
的警告消息,这可能导致在 monkey patchingwarnings.warn
本身时出现令人意外的MemoryError
异常。#4026: 改进无法确定函数签名时的错误消息。
#4177: 将
setuptools>=40.0
固定,以支持setup.cfg
中的py_modules
。#4179: 恢复 symlinking 当前测试运行的 tmpdir 行为。
#4192: 修复 Python 2 下使用
recwarn
时warnings.warn
报告的文件名。
pytest 3.9.1 (2018-10-16)¶
新功能¶
#4159: 对于包含测试类的测试套件,只有在指定了更高的详细级别(至少“-vv”)时才输出关于子类化模块的信息。
pytest 3.9.0 (2018-10-15 - 未发布,由于发布自动化 bug)¶
弃用¶
#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 比较部分。在
Collector
子类中使用名为"Class"
的对象来自定义收集节点的类型已弃用。用户应改用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: 添加
empty_parameter_set_mark=fail_at_collect
ini 选项,以便在参数化收集到空集时引发异常。#3964: 在收集阶段生成的日志消息在启用实时日志记录和/或记录到文件时显示。
#3985: 引入
tmp_path
作为提供 Path 对象的 fixture。还引入tmp_path_factory
作为会话范围的 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,并将大部分元数据移至
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
钩子的item
参数现在已记录为弃用。我们在3.8
版本发布后才意识到此参数与pytest-xdist
不兼容。我们的策略是不在 bug 修复版本中弃用功能,但在这种情况下,我们认为它是有意义的,因为我们只是将其记录为弃用,而不会发出可能破坏测试套件的警告。这将传达一个信息:钩子实现者不应使用此参数。
在未来的版本中,
item
将始终为None
,并且当钩子实现使用它时会发出适当的警告。
错误修复¶
#3539: 修复断言重写模块上的重新加载问题。
#4034:
TestReport
对象的.user_properties
属性是 (名称, 值) 元组的列表,但有时可能被实例化为元组的元组。现在它始终是一个列表。#4039: 当使用
--pyargs
时,不再发出关于在非顶级目录中使用pytest_plugins
的警告:当前的--pyargs
机制不可靠,可能产生假阴性结果。#4040: 使用
-rP
选项时,排除通过测试的空报告。#4051: 改进向
-m
选项传递无效 Python 表达式时的错误消息。#4056: 当环境变量名称在 Python 2 中不是
str
时,MonkeyPatch.setenv
和MonkeyPatch.delenv
会发出警告。在 Python 2 中,向
os.environ
添加unicode
键会导致subprocess
(以及可能其他模块)出现问题,这使其成为一个隐秘的 bug,尤其是在与from __future__ import unicode_literals
一起使用时。
改进的文档¶
#3928: 为 fixture scope 添加可能的取值到文档中。
pytest 3.8.1 (2018-09-22)¶
错误修复¶
#3286:
.pytest_cache
目录现在由 Git 自动忽略。希望为其他 SCM 贡献解决方案的用户请查阅/评论此问题。#3749: 修复在包内收集测试时出现的以下错误
TypeError: object of type 'Package' has no len()
#3941: 修复间接参数化会考虑测试函数使用的所有 fixture 的作用域来确定参数化作用域的 bug,而不仅仅是参数化 fixture 的作用域。
#3973: 修复断言重写器在测试更改当前工作目录而未还原时崩溃的问题。
#3998: 修复阻止某些 caplog 属性(例如
record_tuples
)在启用--pdb
进入调试器时可用的问题。#3999: 修复 python2.x 中当类在断言中返回非 ASCII 二进制
__repr__
且断言也包含非 ASCII 文本时出现的UnicodeDecodeError
。
改进的文档¶
琐碎/内部更改¶
pytest 3.8.0 (2018-09-05)¶
弃用和移除¶
#2452:
Config.warn
和Node.warn
已弃用,有关理由和示例,请参阅 Config.warn 和 Node.warn。#3936:
@pytest.mark.filterwarnings
的第二个参数不再进行正则表达式转义,从而使其能够实际使用正则表达式来检查警告消息。**注意**:对匹配字符串进行正则表达式转义是一个实现疏忽,可能会破坏依赖旧行为的测试套件。
新功能¶
#2452: 内部 pytest 警告现在使用标准
warnings
模块发出,从而可以使用标准警告过滤器来管理这些警告。这引入了PytestWarning
,PytestDeprecationWarning
和RemovedInPytest4Warning
警告类型作为公共 API 的一部分。有关更多信息,请查阅文档。
#2908: 如果未配置其他警告过滤器,
DeprecationWarning
和PendingDeprecationWarning
现在默认显示。这使得 pytest 更符合**PEP 506#recommended-filter-settings-for-test-runners**。更多信息请参阅文档。#3251: 警告现在在测试收集期间被捕获并显示。
#3784: 设置
PYTEST_DISABLE_PLUGIN_AUTOLOAD
环境变量会禁用插件自动加载。#3829: 添加了
count
选项到console_output_style
,以启用将进度显示为计数而不是百分比。#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 只在外层包结束时执行一次的 bug。
#3816: 修复
--show-capture=no
选项仍会显示 fixture teardown 期间打印的日志的 bug。#3819: 修复实时 CLI 日志记录激活时
stdout/stderr
未被捕获的问题。#3843: 修复当在命令行中直接使用
test.py::test
语法并结合--doctest-modules
指定测试函数时出现的收集错误。#3848: 修复 Python 2 上无法将 Unicode 参数传递给
testdir.runpytest
的 bug。#3854: 修复当文件名以大写字母开头时,包内测试重复收集的问题。
改进的文档¶
琐碎/内部更改¶
pytest 3.7.2 (2018-08-16)¶
错误修复¶
#3671: 修复
filterwarnings
未注册为内置标记的问题。#3771: 修复如果
pytest_ignore_collect
钩子返回False
而不是None
时,收集期间的无限递归问题。#3774: 修复装饰器 fixture 会失去功能(例如
@mock.patch
)的 bug。#3775: 修复导入带有
pytest_
前缀的模块或其他对象时会引发PluginValidationError
的 bug。#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)¶
弃用和移除¶
新特性¶
#2283: 新增
package
fixture 作用域:当一个 包 的最后一个测试完成时,fixture 会被终结。此功能被认为是 实验性的,请谨慎使用。#3576:
Node.add_marker
现在支持 `append=True/False` 参数,用于确定标记是位于最后(默认)还是最前。#3579: Fixture
caplog
现在拥有messages
属性,方便访问经过格式化插值的日志消息,而无需格式化程序/处理程序提供的额外数据。#3610: 新增
--trace
选项,可在测试开始时进入调试器。#3623: 引入
pytester.copy_example
作为辅助函数,用于对项目中的示例进行验收测试。
Bug 修复¶
文档改进¶
#3295: 修正了
--last-failed-no-failures
的使用文档,在示例中添加了缺失的--last-failed
参数,因为之前的示例具有误导性,会让人误以为不需要该缺失参数。
小改动/内部变更¶
#3519: 现在在
.pytest_cache
目录中创建了一个README.md
文件,以明确该目录存在的原因。
pytest 3.6.4 (2018-07-28)¶
Bug 修复¶
使用
-mpytest
调用 pytest,这样sys.path
不会因site-packages
中安装的包而污染。 (#742)
文档改进¶
在 fixture 文档中使用
smtp_connection
而不是smtp
,以避免可能的混淆。 (#3592)
小改动/内部变更¶
pytest 3.6.3 (2018-07-04)¶
Bug 修复¶
文档改进¶
@pytest.mark.skipif
示例上方的描述现在与代码更好地匹配。 (#3611)
小改动/内部变更¶
pytest 3.6.2 (2018-06-20)¶
Bug 修复¶
文档改进¶
添加
--strict
标志的文档。 (#3549)
小改动/内部变更¶
pytest 3.6.1 (2018-06-05)¶
Bug 修复¶
文档改进¶
在 fixture 文档中添加了关于如何将 fixture 用作工厂的章节。 (#3461)
小改动/内部变更¶
pytest 3.6.0 (2018-05-23)¶
新特性¶
改造了
pytest.mark
实现的内部结构,采用了正确的按节点处理方式,修复了旧设计导致的一些长期存在的 bug。这引入了新的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)
Bug 修复¶
文档改进¶
将文档版权年份更改为每次发布时自动更新的范围。 (#3303)
小改动/内部变更¶
pytest
现在依赖于 python-atomicwrites 库。 (#3008)将所有 pypi.python.org URL 更新为 pypi.org。 (#3431)
由于
pluggy
正在弃用PluginManager
的implprefix
参数,现在使用内部插件管理器来检测pytest_
前缀的钩子。 (#3487)在
python_api.py::approx
中,从_pytest.compat
导入Mapping
和Sequence
,而不是直接从collections
导入。将Mapping
添加到_pytest.compat
,在 Python 2 中从collections
导入,但在 Python 3 中从collections.abc
导入,以避免在 Python 3.7 或更高版本中出现DeprecationWarning
。 (#3497)
pytest 3.5.1 (2018-04-23)¶
Bug 修复¶
文档改进¶
修复
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
命令行选项,用于覆盖发现根目录的规则。有关详细信息,请参阅文档中的自定义部分。 (#1642)Fixture 现在根据其作用域进行实例化,更高作用域的 fixture(如
session
)会比更低作用域的 fixture(如function
)优先实例化。相同作用域的 fixture 的相对顺序保持不变,基于它们的声明顺序和依赖关系。 (#2405)record_xml_property
已更名为record_property
,现在与 xdist、标记和任何报告器兼容。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
钩子。 (#3189)在命令行中传递
--log-cli-level
现在会自动激活实时日志记录。 (#3190)添加命令行选项
--deselect
,允许在收集时取消选择单个测试。 (#3198)在进入 pdb 之前打印捕获的日志。 (#3204)
现在在运行测试之前显示取消选择的项计数,例如
collected X items / Y deselected
。 (#3213)内置模块
platform
现在可以在pytest.mark
的表达式中使用。 (#3236)“短测试摘要信息”部分现在在终端中的回溯和警告之后显示。 (#3255)
新增
--verbosity
标志以明确设置详细级别。 (#3296)pytest.approx
现在支持将 numpy 数组与标量进行比较。 (#3312)
Bug 修复¶
文档改进¶
小改动/内部变更¶
将
attrs
的最低要求更改为17.4.0
。 (#3228)重命名了示例目录,以便从基本目录运行时所有测试都能通过。 (#3245)
内部的
mark.py
模块已转换为一个包。 (#3250)pytest
现在依赖于 more-itertools 包。 (#3265)当通过
-c
传递的.cfg
文件中使用[pytest]
部分时,添加了警告。 (#3268)nodeids
现在可以显式传递给FSCollector
和Node
构造函数。 (#3291)内部重构
FormattedExcinfo
以使用attrs
功能并移除旧版 Python 的旧支持代码。 (#3292)重构以统一内部详细程度的处理方式。 (#3296)
内部重构以更好地与 argparse 集成。 (#3304)
修复 doc/en/usage.rst 中调用 fixture 的 Python 示例。 (#3308)
pytest 3.4.2 (2018-03-04)¶
Bug 修复¶
文档改进¶
将日志插件添加到插件列表。 (#3209)
小改动/内部变更¶
修复 fixture.rst 中的小拼写错误 (#3259)
pytest 3.4.1 (2018-02-20)¶
Bug 修复¶
将
doctest.UnexpectedException
的导入移至顶层,以避免在使用--pdb
时可能出现的错误。 (#1810)在进入 pdb 之前增加了捕获的标准输出/标准错误的打印,并改进了一个在输出捕获方面给出假阴性的测试。 (#3052)
修复了使用参数化 fixture 的测试排序问题,该问题可能导致 fixture 被不必要地创建多次。 (#3161)
修复了在“测试运行”钩子之外的钩子中发生日志记录会导致内部错误的问题。 (#3184)
当安装并导入 pypi
mock.patch
时,正确检测由unittest.mock.patch
装饰器注入的参数。 (#3206)现在,当带有
match=
的pytest.raises()
失败时,显示的错误信息更清晰地说明了发生的情况:如果未引发异常,则删除了“匹配‘…’”部分,因为它错误地暗示已引发异常但未匹配到。如果引发了错误的异常,现在会直接抛出(就像不带match=
的pytest.raises()
那样),而不是抱怨不匹配的文本。 (#3222)修复了 macOS 上 doctest 中的输出捕获处理问题。 (#985)
文档改进¶
为
pytest.raises
的match
和message
参数添加 Sphinx 参数文档。 (#3202)
小改动/内部变更¶
pytest 3.4.0 (2018-01-30)¶
弃用和移除¶
所有 pytest 类现在都继承自
object
,以获得更好的 Python 2/3 兼容性。这不应影响用户代码,除非在非常罕见的极端情况下。 (#2147)
新特性¶
引入
empty_parameter_set_mark
ini 选项,用于选择当@pytest.mark.parametrize
接收到空参数集时要应用的标记。有效选项为skip
(默认)和xfail
。请注意,未来的版本中计划将默认值更改为xfail
,因为这被认为不易出错。 (#2527)当禁用捕获(
-s
)时,控制台输出会回退到“经典”模式,否则输出会变得混乱,以至于毫无用处。 (#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 修复¶
通过使用
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)
文档改进¶
记录不能与
hookwrapper=True
一起使用的钩子(定义为historic=True
)。 (#2423)澄清警告捕获默认不改变警告过滤器。 (#2457)
澄清了将 pytest_fixture_setup 与返回 None 的 fixture 函数一起使用时可能存在的混淆。 (#2698)
修正了关于 pytest 中使用的 doctest 标志的句子措辞。 (#3076)
文档中的链接更倾向于使用
https://*.readthedocs.io
而不是http://*.rtfd.org
。 (#3092)提高入门指南的可读性(措辞、语法) (#3131)
增加了注意事项,指出由于导入缓存,不建议在同一个进程中多次调用
pytest.main
。 (#3143)
小改动/内部变更¶
pytest 3.3.2 (2017-12-25)¶
Bug 修复¶
文档改进¶
添加了关于多个参数化参数行为的澄清说明 (#3001)
小改动/内部变更¶
pytest 3.3.1 (2017-12-05)¶
Bug 修复¶
修复了
-p no:<plugin>
不生效的问题。 (#2920)修复了 Python 2 中包含非字符串参数的警告的回归问题。 (#2956)
设置
PYTEST_CURRENT_TEST
时,始终转义空字节。 (#2957)修复了在使用
testmon
插件但实际上没有收集到任何测试时引发ZeroDivisionError
的问题。 (#2971)恢复
TerminalReporter.writer
作为TerminalReporter._tw
的别名。此别名在3.3.0
版本中被意外移除。 (#2984)pytest-capturelog
插件现在也被列入黑名单,避免在仍然安装该插件的情况下运行 pytest 时出现错误。 (#3004)
文档改进¶
修复了指向插件
pytest-localserver
的损坏链接。 (#2963)
小改动/内部变更¶
更新
CONTRIBUTING.rst
中 GitHub“bug”链接 (#2949)
pytest 3.3.0 (2017-11-23)¶
弃用和移除¶
pytest 不再支持 Python 2.6 和 3.3。这些 Python 版本已终止生命周期一段时间,并给 pytest 核心团队带来了维护和兼容性成本,因此在与社区其他成员协商后,我们决定从该版本开始不再支持它们。仍然需要这些版本的用户应将 pytest 版本锁定为
<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。
新特性¶
pytest_fixture_post_finalizer
钩子现在可以接收request
参数。 (#2124)将 compat.py 中用于确定 fixture 可用参数的旧内省代码替换为 Python 3 上的
inspect.signature
和 Python 2 上的funcsigs.signature
。这应该尊重函数上的__signature__
声明。 (#2267)只报告一次带有全局
pytestmark
变量的测试。 (#2549)现在 pytest 在运行测试时显示总进度百分比。可以通过将
console_output_style
设置配置为classic
来设置以前的输出样式。 (#2657)通过添加
match
关键字,使warns
的签名与raises
匹配。 (#2708)pytest 现在可以捕获并显示来自标准
logging
模块的输出。用户可以通过在pytest.ini
中、命令行中以及在单个测试中使用标记来控制要捕获的日志级别。此外,还提供了一个caplog
fixture,使用户能够在特定测试期间测试捕获的日志(例如类似于capsys
)。有关更多信息,请参阅日志文档。此功能通过合并流行的 pytest-catchlog 插件引入,感谢 @thisch。请注意,在合并过程中,已弃用了与已停止维护的pytest-capturelog
的向后兼容接口。 (#2794)为
pytest.skip()
添加allow_module_level
关键字参数,使其能够跳过整个模块。 (#2808)允许在 PYTEST_ADDOPTS 中设置
file_or_dir
、-c
和-o
。 (#2824)将标准输出/标准错误捕获结果作为
namedtuple
返回,这样可以通过属性访问out
和err
。 (#2879)添加
capfdbinary
,它是capfd
的一个版本,从readouterr()
返回字节。 (#2923)添加
capsysbinary
,它是capsys
的一个版本,从readouterr()
返回字节。 (#2934)实现了在
--doctest-modules
运行时跳过setup.py
文件的功能。 (#502)
Bug 修复¶
在
capsys/capfd.disabled()
上下文管理器之后恢复输出捕获。 (#1993)pytest_fixture_setup
和pytest_fixture_post_finalizer
钩子现在会为所有conftest.py
文件调用。 (#2124)如果在加载插件时发生异常,pytest 不再隐藏原始回溯。在 Python 2 中,它将显示原始回溯以及一条新消息,解释是在哪个插件中发生的。在 Python 3 中,它将显示两个规范化的异常:加载插件时的原始异常,以及 pytest 抛出的关于加载插件的异常。 (#2491)
capsys
和capfd
现在可以被其他 fixture 使用。 (#2709)内部
pytester
插件现在能将bytes
参数正确编码为utf-8
。 (#2738)testdir
现在使用与tmpdir
相同的方法来创建其临时目录。这会稍微改变testdir
目录的最终结构,但通常不会影响使用,并避免了一些潜在问题。 (#2751)pytest 不再抱怨带有 unicode 消息的警告不兼容 ASCII,即使是 ASCII 兼容的消息。因此,带有 unicode 消息的警告首先会被转换为 ASCII 表示以确保安全。 (#2809)
当达到
--maxfail
时,pytest 命令的返回值从2
(中断)更改为1
(失败)。 (#2845)修复了断言重写中的问题,该问题可能导致其重写不应被重写的模块。 (#2939)
处理
pytest.ini
中没有描述的标记。 (#2942)
小改动/内部变更¶
重构了内部 Python 2/3 兼容性代码,以使用
six
。 (#2642)停止捆绑
pluggy
—— 我们没有从中获得多少益处,却错过了它最新的更改 (#2719)内部重构:在较新的 Python 3 版本中,通过使用 backslashreplace 错误处理程序来简化 ASCII 字符串转义。 (#2734)
移除 unittest 插件中不必要的标记评估器 (#2767)
现在调用
Metafunc.addcall
会发出弃用警告。此函数计划在pytest-4.0
中移除。 (#2876)将参数集提取内部移动到更易于维护的位置。 (#2877)
内部重构以简化作用域节点查找。 (#2910)
配置
pytest
以防止 pip 在不支持的 Python 版本中安装 pytest。 (#2922)
pytest 3.2.5 (2017-11-15)¶
Bug 修复¶
移除
pytest
中py<1.5
的限制,因为这可能导致某些安装中出现版本冲突。 (#2926)
pytest 3.2.4 (2017-11-13)¶
Bug 修复¶
文档改进¶
pytest 3.2.3 (2017-10-03)¶
Bug 修复¶
文档改进¶
琐碎/内部更改¶
pytest 3.2.2 (2017-09-06)¶
Bug 修复¶
文档改进¶
琐碎/内部更改¶
pytest 3.2.1 (2017-08-08)¶
Bug 修复¶
文档改进¶
明确记录哪些 pytest 功能适用于
unittest
。 (#2626)
pytest 3.2.0 (2017-07-30)¶
弃用和移除¶
功能¶
为 approx 添加了对 numpy 数组(和字典)的支持。 (#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
钩子,允许插件在收集成功完成后向终端报告添加消息。 (#2622)增加了对 PEP 415 的
Exception.__suppress_context__
的支持。现在,如果 pytest 捕获到raise exception from None
,pytest 将不再在测试报告中链接上下文。现在其行为与 Python 的回溯行为匹配。 (#2631)由
pytest.fail
、pytest.skip
和pytest.xfail
引发的异常现在继承自 BaseException,使其更难被普通代码意外捕获。 (#580)
Bug 修复¶
在
pytester.py.Testdir.popen()
中将stdin
设置为已关闭的PIPE
,以避免不必要的交互式pdb
(#2023)使用
capsys
捕获模式时,为sys.std*
流添加缺失的encoding
属性。 (#2375)修复了如果
colorama
在conftest.py
文件中导入时,Windows 终端颜色变为黑色的问题。 (#2510)修复报告跳过测试摘要时的行号问题。 (#2548)
捕获:确保 EncodedFile.name 是一个字符串。 (#2555)
选项
--fixtures
和--fixtures-per-test
现在将保留文档字符串中的缩进。 (#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 条目中显示多个问题链接。 (#2620)
pytest 3.1.3 (2017-07-03)¶
Bug 修复¶
修复 Python 2 中文档字符串中 doctests 的解码错误。 (#2434)
现在,在清理器中由终结器引发的异常会被抑制,直到所有终结器都被调用,然后重新引发初始异常。 (#2440)
修复在命令行指定测试时“collected items”报告不正确的问题。 (#2464)
deprecated_call
在上下文管理器形式下现在可以捕获弃用警告,即使相同的警告已经引发。此外,deprecated_call
将始终生成相同的错误消息(以前在上下文管理器与函数调用模式下会生成不同的消息)。 (#2469)修复了 pytest 收集的路径可能具有三重前导
/
字符的问题。 (#2475)修复尝试检测递归回溯开始时发生的内部错误。 (#2486)
文档改进¶
明确指出哪些钩子在第一个非 None 结果后停止调用。 (#2493)
琐碎/内部更改¶
pytest 3.1.2 (2017-06-08)¶
Bug 修复¶
通过
pytest_addoption
添加的必选选项将不再阻止在不传递它们的情况下使用 --help。(#1999)在断言重写中尊重
python_files
。(#2121)修复当回溯中的帧包含无法比较的对象(如
numpy
数组)时,递归错误检测的问题。(#2459)仅当消息包含非 ASCII unicode 时,内部 pytest 警告插件才发出
UnicodeWarning
(仅限 Python 2)。(#2463)添加了针对 Python 3.6
WindowsConsoleIO
因 Pytest 的FDCapture
而中断的解决方法。其他使用控制台句柄的代码可能仍受相同问题影响,可能需要进一步的解决方法/修复,例如colorama
。(#2467)
文档改进¶
修复到
pluggy
对象的内部 API 链接。(#2331)明确指出
pytest.xfail
在调用点停止测试执行,并改进了skipping
文档的整体流程。(#810)
pytest 3.1.1 (2017-05-30)¶
Bug 修复¶
pytest 警告捕获不再覆盖现有警告过滤器。以前的行为会覆盖所有过滤器,并在配置警告过滤器以满足其需求的测试套件中导致回归。请注意,此副作用是默认不再显示
DeprecationWarning
和PendingDeprecationWarning
。(#2430)修复 doctest 文本文件中非 ASCII 内容的问题。(#2434)
修复 Python 2 中 unicode 警告的编码错误。(#2436)
pytest.deprecated_call
现在在上下文管理器形式下捕获PendingDeprecationWarning
。(#2441)
文档改进¶
引入 towncrier 进行更新日志管理。(#2390)
3.1.0 (2017-05-22)¶
新功能¶
pytest-warnings
插件已集成到核心中,现在pytest
会在测试会话结束时自动捕获并显示警告。感谢 @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 钩子的地方,这是为了准备在 pytest 4.0 中移除 preloadconfig。感谢 @RonnyPfannschmidt 的 PR。
当可调用 ID 在参数化测试中引发时,pytest 现在会发出警告。感谢 @fogo 的 PR。
现在可以通过将
__test__
属性设置为False
来跳过测试类的收集 (#2007)。感谢 @syre 的报告和 @lwm 的 PR。更改 junitxml.py 以生成符合 Junitxml 架构的报告。如果相同的测试在调用中失败,然后又在拆卸中出错,我们将测试用例元素拆分为两个,一个包含错误,另一个包含失败。 (#2228) 感谢 @kkoukiou 的 PR。
当 verbosity=1 时,从字典比较输出中移除常见项。同时更新截断消息,使其更清楚地表明当 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。钩子现在在收集完成后进行验证,而不是在加载已安装插件后立即验证。这使得编写插件钩子变得容易,这些钩子将在收集期间加载,例如使用
pytest_plugins
特殊变量 (#1821)。感谢 @nicoddemus 的 PR。修改
pytest_make_parametrize_id()
钩子以接受argname
作为附加参数。感谢 @unsignedint 的 PR。将
venv
添加到默认的norecursedirs
设置中。感谢 @The-Compiler 的 PR。PluginManager.import_plugin
现在在 Python 2 中接受 unicode 插件名称。感谢 @reutsharabani 的 PR。将文档中的次/补丁版本号替换为占位符。这显著减少了因不同贡献者在不同平台上重新生成文档而导致的更改噪声。感谢 @RonnyPfannschmidt 的 PR。
修复 #2391:考虑所有插件模块上的 pytest_plugins。感谢 @RonnyPfannschmidt 的 PR。
Bug 修复¶
修复在 python 3 中使用
capsys
fixture 时sys.stdout.buffer
/sys.stderr.buffer
上的AttributeError
问题。 (#1407)。感谢 @asottile。将 capture.py 的
DontReadFromInput
类更改为在fileno
方法中抛出io.UnsupportedOperation
错误而不是 ValueError (#2276)。感谢 @metasyn 和 @vlad-dragos 的 PR。修复在导入模块时异常消息包含非 ASCII 字符时的异常格式问题 (#2336)。感谢 @fabioz 的报告和 @nicoddemus 的 PR。
添加了与问题 (#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。
修复回归,pytest 现在在运行
--pdb
时能正确跳过 unittest (#2137)。感谢 @gst 的报告和 @mbyt 的 PR。--override-ini
现在能正确覆盖一些基本选项,如python_files
(#2238)。感谢 @sirex 的报告和 @nicoddemus 的 PR。根据 PEP 479,将代码中
raise StopIteration
的用法替换为简单的returns
来结束生成器 (#2160)。感谢 @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。如果 pytest 终端输出缺失,则明确使
testdir.runpytest().assert_outcomes()
失败。感谢 @eli-b 的 PR。
3.0.5 (2016-12-05)¶
当
-o/--override-ini
未正确传递option=value
时,添加警告 (#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
机制多次导入模块而产生的误报警告。感谢 @nicoddemus 的 PR。移除了一个内部缓存,该缓存可能导致子目录中
conftest.py
文件的钩子在其他目录中被错误调用 (#2016)。感谢 @d-b-w 的报告和 @nicoddemus 的 PR。移除了旨在支持早期 Python 3 版本的内部代码,该代码会产生在
sys.modules
中留下None
的副作用,当 pytest 评估表达式时(例如将条件作为字符串传递给pytest.mark.skipif
)(#2103)。感谢 @jaraco 的报告和 @nicoddemus 的 PR。
3.0.4 (2016-11-09)¶
现在收集测试模块时发生的导入错误会显示完整的追溯信息 (#1976)。感谢 @cwitty 的报告和 @nicoddemus 的 PR。
修复了自定义选项带有两个或更多
metavar
属性时,命令行帮助消息混乱的问题 (#2004)。感谢 @okulynyak 和 @davehunt 的报告以及 @nicoddemus 的 PR。加载插件时,如果导入错误包含非 ASCII 消息,现在在 Python 2 中也能正确处理 (#1998)。感谢 @nicoddemus 的 PR。
修复了当
pytest.raises
以上下文管理器形式使用时出现的循环引用问题 (#1965)。作为此修复的结果,在上下文管理器和函数调用用法中,sys.exc_info()
都留空。此前,sys.exc_info
即使在预期异常发生时也包含上下文管理器捕获到的异常。感谢 @MSeifert04 的报告和 PR。修复了断言重写钩子对已重写但后来被
pytest.register_assert_rewrite
显式标记或隐式作为插件标记的模块产生的误报警告 (#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()
调用的错误作用域值。此版本包含
pluggy-0.4.0
,它正确处理插件中的VersionConflict
错误 (#704)。感谢 @nicoddemus 的 PR。
3.0.2 (2016-09-01)¶
改进了向
pytest.mark.parametrize
传递非字符串 id 时的错误消息 (#1857)。感谢 @okken 的报告和 @nicoddemus 的 PR。向 stdin 存根类
pytest.capture.DontReadFromInput
添加buffer
属性。感谢 @joguSD 的 PR。修复当字符串与 unicode 比较失败时发生的
UnicodeEncodeError
。 (#1864) 感谢 @AiOO 的 PR。如果
pytest_plugins
被定义为字符串(而不是字符串序列),当模块被考虑用于断言重写时,现在会正确处理。由于这个 bug,如果测试套件使用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。修复当会话 fixture 与同一调用中的普通参数结合使用时参数化范围的问题 (#1832)。感谢 @The-Compiler 的报告,以及 @Kingdread 和 @nicoddemus 的 PR。
修复当使用空
ids
参数参数化测试或 fixture 时发生的内部错误 (#1849)。感谢 @OPpuolitaival 的报告和 @nicoddemus 的 PR。修复将
pytest
嵌入 zipfile 中运行时加载器错误。感谢 @mbachry 的 PR。
3.0.0 (2016-08-18)¶
不兼容的更改
此版本中进行了许多不兼容的更改,旨在移除长期弃用的功能或更改现有行为以使其不那么令人惊讶/更有用。
重解释模式现已移除。仅提供 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)。
插件中的 ImportError 现在是致命错误,而不是发出 pytest 警告 (#1479)。感谢 @The-Compiler 的 PR。
移除了对 Python 3 版本 < 3.3 的支持代码 (#1627)。
移除了所有
py.test-X*
入口点。带版本号的带后缀入口点从未被文档化,是虚拟环境时代之前的遗留物。这些入口点还在 wheels 中创建了损坏的入口点,因此移除它们也消除了用户混淆的来源 (#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 的 bug 报告,以及 @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)
钩子,插件可以使用它为自定义类型提供友好的字符串。感谢 @palaviv 完成此 PR。capsys
和capfd
现在有一个disabled()
上下文管理器方法,可用于在测试中暂时禁用捕获。感谢 @nicoddemus 完成此 PR。新增 CLI 标志
--fixtures-per-test
:显示每个选定测试项正在使用的 fixture。默认显示 fixture 的 doc string。如果与-v
结合使用,还可以显示 fixture 的定义位置。感谢 @hackebrot 完成此 PR。引入
pytest
命令作为推荐的入口点。请注意,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。新增钩子
pytest_fixture_setup(fixturedef, request)
:执行 fixture setup;pytest_fixture_post_finalizer(fixturedef)
:在 fixture 的 finalizer 之后调用,并可以访问 fixture 的结果缓存。
对测试为元组字面量的 assert 发出警告。此类 assert 永远不会失败,因为元组总是真值,通常是错误(参见 #1562)。感谢 @kvas-it 完成此 PR。
允许传递自定义调试器类(例如
--pdbcls=IPython.core.debugger:Pdb
)。感谢 @anntzer 完成此 PR。
更改
插件现在受益于断言重写。感谢 @sober7、@nicoddemus 和 @flub 完成此 PR。
在非严格模式下,将
xpassed
测试的report.outcome
更改为"passed"
,在严格模式下更改为"failed"
。感谢 @hackebrot 完成此 PR (#1795),以及 @gprasad84 报告此问题 (#1546)。标记为
xfail(strict=False)
(默认)的测试现在在 JUnitXML 报告中显示为通过测试而不是跳过。感谢 @hackebrot 完成此 PR (#1795)。用
@pytest.fixture
标记的 fixture 现在可以像用@pytest.yield_fixture
装饰器标记的 fixture 一样使用yield
语句。此更改使得@pytest.yield_fixture
弃用,并使带有yield
语句的@pytest.fixture
成为编写 teardown 代码的首选方式(#1461)。感谢 @csaftoiu 提出此问题,以及 @nicoddemus 完成此 PR。现在,当测试函数中声明了未知 fixture 时,错误消息中会按字母顺序排序 fixture。感谢 @nicoddemus 完成此 PR。
pytest_terminal_summary
钩子现在接收测试会话的exitstatus
作为参数。感谢 @blueyed 完成此 PR (#1809)。参数化 ID 可以接受
None
作为特定测试 ID,在这种情况下将使用该参数的自动生成 ID。感谢 @palaviv 完成此 PR (#1468)。xunit 风格的 setup/teardown 方法(
setup_method
、setup_module
等)的参数现在是可选的,可以省略。感谢 @okken 提出此问题,以及 @nicoddemus 完成此 PR。现在 pytest 警告摘要默认显示。新增了一个标志
--disable-pytest-warnings
以显式禁用警告摘要(#1668)。通过提醒用户检查测试模块/包的名称,使收集过程中的 ImportError 更明确(#1426)。感谢 @omarkohl 完成此 PR (#1520)。
将
build/
和dist/
添加到默认的--norecursedirs
列表。感谢 @mikofski 报告此问题,以及 @tomviner 完成此 PR (#1544)。pytest.raises
在上下文管理器形式下接受自定义的message
,以便在没有发生异常时抛出。感谢 @palaviv 完成此 PR (#1616)。conftest.py
文件现在受益于断言重写;以前它只对测试模块可用。感谢 @flub、@sober7 和 @nicoddemus 完成此 PR (#1619)。不包含任何 doctest 的文本文档不再显示为“跳过”。感谢 @graingert 报告并提供了完整的 PR (#1580)。
确保当模块与
--pyargs
选项一起在命令行中指定时,命名空间包中的模块可以被找到。感谢 @taschini 完成此 PR (#1597)。在断言重写期间始终包含完整的断言解释。以前的行为会隐藏恰好为
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
类型的使用现在会触发 DeprecationWarnings(#1740)。optparse
向后兼容性支持浮点/复数类型(#457)。细化了确定
rootdir
的逻辑,只考虑有效路径,从而修复了许多问题:#1594、#1435 和 #1471。根据当前行为更新了文档。感谢 @blueyed、@davehunt 和 @matthiasha 完成此 PR。始终包含完整的断言解释。以前的行为会隐藏恰好为 False 的子表达式,认为这是冗余信息。感谢 @bagerard 报告此问题 (#1503)。感谢 @davehunt 和 @tomviner 完成 PR。
在未使用参数化变量的情况下,消息更佳(参见 #1539)。感谢 @tramwaj29 完成此 PR。
更新了 docstring,使其风格更统一。
在启动期间为
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 期间的指导。
Bug 修复
Parametrize 现在正确处理重复的测试 ID。
修复
teardown_method()
缺少method
参数时的内部错误问题(#1605)。修复测试期间当前工作目录(CWD)被删除时的异常可视化问题(#1235)。感谢 @bukzor 报告。PR 由 @marscher 完成。
改进带有括号的逻辑表达式的测试输出(#925)。感谢 @DRMacIver 报告,以及 @RedBeardCode 完成此 PR。
为以换行符结尾的字符串创建正确的 diff(#1553)。感谢 @Vogtinator 报告,以及 @RedBeardCode 和 @tomviner 完成此 PR。
ConftestImportFailure
现在显示回溯,使得识别conftest.py
文件中的 bug 变得更容易(#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)¶
Bug 修复
修复 #510:跳过其中一个参数化维度为空的测试。感谢 Alex Stapleton 的报告和 @RonnyPfannschmidt 完成此 PR。
修复 Xfail 在使用条件关键字参数时不工作的问题。感谢 @astraw38 报告此问题(#1496),以及 @tomviner 完成 PR(#1524)。
修复 win32 路径问题,当在
pytest.main("-c your_absolute_path")
中放置带有绝对路径的自定义配置文件时。修复检测最大递归深度时,抛出的错误类不识别 unicode/编码字节的问题。感谢 @prusse-martin 完成此 PR (#1506)。
修复
pytest.mark.skip
标记在严格模式下使用时的问题。感谢 @pquentin 完成此 PR,以及 @RonnyPfannschmidt 展示如何修复此 bug。文档的一些小改进和修复。感谢 @omarkohl 完成此 PR。
修复
--fixtures
以显示所有 fixture 定义,而不是每个 fixture 名称只显示一个。感谢 @hackebrot 完成此 PR。
2.9.1 (2016-03-17)¶
Bug 修复
改进插件加载失败时的错误消息。感谢 @nicoddemus 完成此 PR。
修复(#1178):
pytest.fail
包含非 ascii 字符时引发内部 pytest 错误。感谢 @nicoddemus 完成此 PR。修复(#469):junit 在 params ID 包含
::
时错误解析 report.nodeid。感谢 @tomviner 完成此 PR (#1431)。修复(#578):包含非 ascii 行的 SyntaxError 在故障点生成内部 py.test 错误。感谢 @asottile 报告,以及 @nicoddemus 完成此 PR。
修复(#1437):当向参数化传递字节字符串正则表达式模式时,尝试将其解码为 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
之外很少使用,而且它位于不同的仓库中,导致难以及时修复其代码中的 bug。团队希望通过此举能够更好地重构和改进该代码。此更改不应影响用户,但如果遇到任何奇怪的行为,让用户知晓会很有用。请记住,
pytest._code
的代码是私有和实验性的,因此您绝对不应显式导入它!请注意,原始的
py.code
仍然可在 pylib 中使用。pytest_enter_pdb
现在可选地接收 pytest 配置对象。感谢 @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
失败消息中。收集仅在终端中显示进度(“收集 X 项”)。这避免了在使用
--color=yes
在 CI 集成系统中获取颜色时输出混乱(#1397)。
Bug 修复
-s
和-c
选项现在应该在xdist
下工作;Config.fromdictargs
现在更忠实地表示其输入。感谢 @bukzor 完成此 PR (#680)。修复(#1290):支持 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 中的双重 nodeid,这是一个回归,导致 pytest-pep8 + pytest-flakes 等插件组合失败。
解决 pyreadline 中使用
--pdb
并启用标准 I/O 捕获时发生的异常。感谢 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:在 setup 错误时将捕获的 stdout 添加到 jUnit XML 报告。感谢 Georgy Dyuldin 完成此 PR。
2.8.5 (2015-12-11)¶
修复 #1243:修复了在收集过程中注入的类属性可能破坏 pytest 的问题。PR 由 Alexei Kozlenok 完成,感谢 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()
现在在 deprecated 函数已被同一模块中的另一个测试调用时也能工作。感谢 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:为 TestCaseFunction 中的 testcase 添加 __name__ 属性,以支持函数和方法上的 @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 调用添加缺失的 nodeid。感谢 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:更优雅地处理插件加载期间的版本冲突。感谢 Bruno Oliveira 完成此 PR。
修复问题 #1064:与“pytest-xdist”插件一起使用“--junitxml”时的回归,导致测试报告被分配给错误的测试。感谢 Daniel Grunwald 报告,以及 Bruno Oliveira 完成此 PR。
(实验性)适应更多 SEMVER 风格的版本控制,并更改 git 仓库中 master 分支的含义:“master”分支现在保留 bug 修复,旨在用于微版本发布。“features”分支将仅随次要或主要 pytest 版本发布。
通过删除 distutils 的文档引用来修复问题 #766。感谢 Russel Winder。
修复问题 #1030:现在字节字符串被转义以生成项目节点 ID,使其始终可序列化。感谢 Andy Freeland 报告,以及 Bruno Oliveira 完成此 PR。
Python 2:如果 unicode 参数化值可转换为 ascii,则其 ascii 表示用于节点 ID。
修复问题 #411:为断言比较示例添加 __eq__ 方法。感谢 Ben Webb。
修复问题 #653:deprecated_call 可用作上下文管理器。
修复问题 877:正确处理非 ascii repr 的断言解释。感谢 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:当字符串比较失败且 diff 太大无法显示而未传递 -vv 时,仍然显示几行 diff。感谢 Florian Bruhin 报告,以及 Bruno Oliveira 完成此 PR。
修复 issue736:修复了当 fixture 参数与参数化标记结合使用时会被丢弃的 bug。感谢 Markus Unterwaditzer 完成此 PR。
修复 issue710:引入 ALLOW_UNICODE doctest 选项:启用后,
u
前缀将从预期 doctest 输出中的 unicode 字符串中剥离。这允许使用 unicode 的 doctest 在 Python 2 和 3 中不变地运行。感谢 Jason R. Coombs 报告,以及 Bruno Oliveira 完成此 PR。parametrize 现在还为 enum、regex 和 class 对象(而不是类实例)生成有意义的测试 ID。感谢 Florian Bruhin 完成此 PR。
添加“warns”以断言会抛出警告(类似于“raises”)。感谢 Eric Hunsberger 完成此 PR。
修复 issue683:不要应用已应用的标记。感谢 ojake 完成此 PR。
更好地处理捕获失败,以减少异常丢失到 /dev/null。感谢 David Szotten 完成此 PR。
修复 issue730:弃用并警告 --genscript 选项。感谢 Ronny Pfannschmidt 报告,以及 Christian Pommranz 完成此 PR。
修复 issue751:如果使用两个或更多测试方法对类进行参数化,则多个参数化与 ID 的 bug。感谢 Sergey Chipiga 报告,以及 Jan Bednarik 完成 PR。
修复 issue82:默认情况下避免从 setup.cfg/pytest.ini/tox.ini 文件及以上加载 conftest 文件(--confcutdir 仍可设置以覆盖此设置)。感谢 Bruno Oliveira 完成此 PR。
修复 issue768:在 python 模块中找到的 docstring 未设置 session fixture。感谢 Jason R. Coombs 报告,以及 Bruno Oliveira 完成此 PR。
添加了
tmpdir_factory
,这是一个 session-scoped fixture,可用于在基本临时目录中创建目录。以前此对象作为config
对象的_tmpdirhandler
属性安装,但现在它已成为官方 API 的一部分,并且使用config._tmpdirhandler
已弃用。感谢 Bruno Oliveira 完成此 PR。修复 issue808:pytest 的内部断言重写钩子现在实现了可选的 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+ 调试版本上的断言失败。
新选项
--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。内部重构插件管理器 API 和代码,以便在 pytest-agnostic 的简单插件管理器和 PytestPluginManager 之间有明确的区别,后者添加了大量行为,其中包括处理本地 conftest 文件。在文档化方法方面,这是一个向后兼容的更改,但它仍然可能破坏依赖于细节(特别是 pluginmanager.add_shutdown() API)的第三方插件。感谢 Holger Krekel。
插件管理:引入
pytest.hookimpl
和pytest.hookspec
装饰器,用于设置 impl/spec 特定参数。这取代了以前现在弃用的pytest.mark
的使用,该标记旨在仅包含测试函数的标记。编写/完善“编写插件”的文档,现在它们有自己的页面,并与“使用/安装插件”页面分开。
修复 issue732:正确取消注册任何钩子调用站点的插件,允许在测试执行期间拥有临时插件。
弃用并警告钩子实现中的
__multicall__
参数。请改用 pytest-2.7 中已引入的hookwrapper
机制。请注意,pytest-2.8 计划停止支持旧的__multicall__
,并且只支持 hookwrapper 协议。大幅加快插件钩子的调用速度。
在内置 pytest 插件中使用 hookwrapper 机制。
添加 doctest 标志的 doctest ini 选项,感谢 Holger Peters。
在文档中添加注释,如果您想标记参数并且参数是可调用的,则还需要传递一个原因以将其与“装饰器”情况区分开。感谢 Tom Viner。
“python_classes”和“python_functions”选项现在支持 glob 模式进行测试发现,如 issue600 中所讨论。感谢 Ldiary Translations。
允许用非参数化的 fixture 覆盖参数化的 fixture,反之亦然(bubenkoff)。
修复 issue463:对“parameterize”拼写错误抛出特定错误(pfctdayelise)。
允许用非参数化的 fixture 覆盖参数化的 fixture,反之亦然(bubenkoff)。
失败时,
sys.last_value
、sys.last_type
和sys.last_traceback
被设置,以便用户可以通过事后调试检查错误(almarklein)。2.6.4 (2014-10-24)¶
通过使用 ndiff 和 pprint 改进可迭代对象的断言失败报告。
从源代码树中删除了过时的日语文档。
“pytest_addhooks”钩子文档。感谢 Bruno Oliveira。
更新了插件索引文档。感谢 Bruno Oliveira。
修复 issue557:使用“-k”时,我们只允许字符串开头的旧式“-”表示否定,即使那也是弃用的。请改用“not”。这应该允许选择参数化测试,其中参数中出现了“-”。
修复 issue604:转义断言消息中的 % 字符。
修复 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 时无限递归的 bug,感谢 Uwe Schmitt。
修复 issue589:修复与 numpy 等在显示异常时发生的不良交互。检查精确的“超出最大递归深度”异常,而不是假设任何 RuntimeError 都是该异常(在 py dep 中实现)。感谢 Charles Cloud 分析此问题。
修复 conftest 相关 fixture 可见性问题:当在测试包之外的 CWD 运行 pytest 时,fixture 发现会出错。感谢 Wolfgang Schnerring 找出了可重现的示例。
引入 pytest_enter_pdb 钩子(例如 pytest_timeout 需要它来在交互式进入 pdb 时取消超时)。感谢 Wolfgang Schnerring。
修复 issue713:doctest 失败的 JUnit XML 报告。感谢 Punyashloka Biswal。
检查 xfail/skip 也适用于非 Python 函数测试项。感谢 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 doc 示例。
不要标记为通用 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”属性,以满足某些 distutils 和可能访问 sys.stdout.errors 的其他代码。
解决 issue170:允许 pytest.mark.xfail(...) 通过可选的“raises=EXC”参数指定预期异常,其中 EXC 可以是单个异常或异常类元组。感谢 David Mohr 完成此 PR。
修复 pytest 与 unittest.mock.patch 装饰器在测试中使用“new”参数时的集成问题。感谢 Nicolas Delaby 提供测试和 PR。
修复检测 conftest 文件的问题,如果参数包含“::”节点 ID 规范(从“-v”输出复制)。
修复 issue544,只在“::”分隔部分末尾且部分具有“.py”扩展名时删除“@NUM”
增加了关于 Bitbucket 和 GitHub 上新的 pytest-dev 团队的文档。请参阅 https://pytest.cn/en/stable/contributing.html 。感谢 Anatoly 的推动和初步工作。
修复 issue650:新增选项
--doctest-ignore-import-errors
,它会将 doctest 中的导入错误转换为跳过。感谢 Charles Cloud 提供了完整的 PR。修复 issue655:解决了导致 Python 2/3 将 sys.exc_info 泄露到 fixture/测试中,从而导致第三方代码失败的不同方式
修复 issue615:断言重写在格式化布尔运算时未能正确转义百分号,这导致布尔值与模运算符混合时出现问题。感谢 Tom Viner 的报告、分类和修复。
实现 issue351:增加了将参数化 ID 指定为可调用对象的能力,以生成自定义测试 ID。感谢 Brianna Laugher 的想法和实现。
引入并记录了新的 hookwrapper 机制,该机制对于希望为自身目的包装某些 hook 执行的插件非常有用。这取代了 pytest 自身和一些外部插件使用的未文档化的
__multicall__
协议。请注意,pytest-2.8 计划停止支持旧的__multicall__
,只支持 hookwrapper 协议。大幅加快了插件 hook 的调用速度
在内置 pytest 插件中使用 hookwrapper 机制。
为 doctest 标志添加了一个 doctest ini 选项,感谢 Holger Peters。
在文档中添加了一个说明,即如果要标记参数且该参数是可调用对象,则还需要传入一个原因,以便将其与“装饰器”情况区分开。感谢 Tom Viner。
“python_classes”和“python_functions”选项现在支持 glob 模式进行测试发现,如 issue600 中所讨论。感谢 Ldiary Translations。
允许使用非参数化 fixture 覆盖参数化 fixture,反之亦然 (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。
修复捕获.EncodedFile 序列化时的无限递归错误,感谢 Uwe Schmitt。
修复 issue589:修复显示异常时与 numpy 及其他库的不良交互。检查精确的“最大递归深度超出”异常,而不是假设任何 RuntimeError 都是该异常(在 py 依赖项中实现)。感谢 Charles Cloud 分析了该问题。
修复 conftest 相关的 fixture 可见性问题:当在测试包之外的当前工作目录 (CWD) 运行 pytest 时,fixture 发现会出现错误。感谢 Wolfgang Schnerring 找到了一个可重现的示例。
引入 pytest_enter_pdb hook(例如 pytest_timeout 需要此 hook,以便在交互式进入 pdb 时取消超时)。感谢 Wolfgang Schnerring。
对于非 Python 函数测试项,也检查 xfail/skip。感谢 Floris Bruynooghe。
2.6.2 (2014-09-05)¶
添加了函数 pytest.freeze_includes(),它使得使用 cx_freeze 等工具将 pytest 嵌入到可执行文件中变得容易。请参阅文档以获取示例和原理。感谢 Bruno Oliveira。
改进了断言重写缓存失效的精度。
修复 issue561:调整了 autouse fixture 示例以适应 Python 3。
修复 issue453:断言重写问题,当 __repr__ 包含“n{”、“n}”和“n~”时。
修复 issue560:如果“else:”或“finally:”后跟同一行上的语句,则正确显示代码。
修复 monkeypatch 文档中的示例,感谢 t-8ch。
修复 issue572:更正了 tmpdir 文档示例以适应 Python 3。
不标记为通用 wheel,因为 Python 2.6 由于额外的 argparse 依赖项而与其他构建不同。修复了 issue566。感谢 sontek。
实现 issue549:用户提供的断言消息不再替换 py.test 内省消息,而是作为补充显示。
2.6.1 (2014-08-07)¶
在 –verbose 输出中不再显示行号,输出现在纯粹是节点 ID。行号仍显示在失败报告中。感谢 Floris Bruynooghe。
修复 issue437,其中断言重写可能导致 pytest-xdist 工作节点收集不同的测试。感谢 Bruno Oliveira。
修复 issue555:向捕获流添加“errors”属性,以满足某些 distutils 和可能访问 sys.stdout.errors 的其他代码。
修复 issue547:当输出捕获(“-s”)被禁用时,capsys/capfd 也能工作。
解决 issue170:允许 pytest.mark.xfail(…) 通过可选的“raises=EXC”参数指定预期异常,其中 EXC 可以是单个异常或异常类元组。感谢 David Mohr 提供了完整的 PR。
修复 pytest 与 unittest.mock.patch 装饰器在使用“new”参数时的集成。感谢 Nicolas Delaby 提供了测试和 PR。
修复了当参数包含“::”节点 ID 规范时(从“-v”输出复制粘贴)检测 conftest 文件的问题
修复 issue544:只在“::”分隔部分末尾且部分具有“.py”扩展名时才删除“@NUM”
不要使用 py.std 导入助手,而是直接导入。感谢 Bruno Oliveira。
2.6¶
根据作用域缓存 fixture 中的异常(issue 467)。
修复 issue537:默认情况下避免导入旧的断言重新解释代码。
修复 issue364:默认情况下缩短并增强回溯表示。新的“--tb=auto”选项(默认)将只显示第一个和最后一个条目的长回溯。您可以使用“--tb=long”获得打印所有条目为长条目的旧行为。此外,短条目现在默认打印方式与“--tb=native”非常相似。
修复 issue514:教会断言重新解释私有类属性。
更改 -v 输出以包含测试的完整节点 ID。用户可以从测试运行中复制节点 ID,包括行号,并将其用作位置参数,以便只运行单个测试。
修复 issue 475:如果使用错误的异常类型调用 pytest.raises,则提前失败并显示可理解的错误。
修复 issue516:在入门中告知当前依赖项。
稍微清理 setup.py 并指定支持的版本。感谢 Jurko Gospodnetic 完成此 PR。
将 XPASS 颜色更改为黄色而不是红色,当测试以 -v 运行时。
修复 issue473:解决 mock 在双重打补丁时将未绑定方法放入类字典的问题。
修复 issue498:如果 fixture finalizer 失败,确保 fixture 仍然失效。
修复 issue453:pytest_assertrepr_compare 钩子的结果现在会转义其换行符,以便 format_exception 不会崩溃。
内部新警告系统:当 pytest 在您的测试收集或执行中检测到异常时,它现在会生成警告。警告最终发送到一个新的 pytest_logwarning 钩子,目前只有终端插件实现了该钩子,它在摘要行中显示警告,并在指定 -rw(报告警告)时显示更多详细信息。
将带有 __init__ 的测试类和看起来像测试但不是函数的测试模块中的可调用对象跳过转换为警告。
修复 issue436:通过使用 parse_known_args 的结果而不是以前不稳定的启发式方法,改进了从命令行参数中查找初始 conftest 文件。感谢 Marc Abramowitz 在此领域的测试和初步修复方法。
修复 issue #479:在测试模块的收集/加载过程中,正确处理 nose/unittest(2) SkipTest 异常。感谢 Marc Schlaich 完成此 PR。
修复 issue490:在文档中包含 pytest_load_initial_conftests 并改进 docstring。
修复 issue472:澄清
pytest.config.getvalue()
在命令行解析之前触发时无法工作。合并 PR123:改进了 pytest 与 mock.patch 装饰器在测试上的集成。
修复 issue412:现在可以捕获对 stdout/stderr FD 级别流的干扰而不会崩溃。
修复 issue483:trial/py33 现在可以正常工作。感谢 Daniel Grana 完成 PR。
改进了 pytest 与“python setup.py test”集成的示例,现在它有一个通用的“-a”或“--pytest-args”选项,您可以在其中将附加选项作为带引号的字符串传递。感谢 Trevor Bekolay。
简化了内部捕获机制,使其对测试或设置更改 FD1/FD2 更健壮,现在还更好地与单个测试中的 pytest.pdb() 集成。
改进了 pytest 自身测试套件的泄漏检测,得益于 Marc Abramowitz 的 PR。
修复 issue492:避免 test_writeorg 中的泄漏。感谢 Marc Abramowitz。
修复 issue493:不要在 doc 目录中运行测试(使用 tox -e doctesting 进行此操作)
修复 issue486:更好地报告和处理早期 conftest 加载失败。
内部 conftest 处理的一些清理和简化。
更努力地打破捕获异常时的引用循环。感谢 Jurko Gospodnetic。
修复 issue443:修复跳过示例以使用正确的比较。感谢 Alex Groenholm。
支持模块、类和函数上的 nose 风格
__test__
属性,包括 unittest 风格的类。如果设置为 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 属性的异常现在在 Python 2 和 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 的报告和分析。
允许参数化 fixture 通过向 pytest.fixture() 和 pytest.yield_fixture() 添加 ids 参数来指定参数的 ID。感谢 Floris Bruynooghe。
修复 issue404:在 junitxml 插件中始终使用二进制 XML 转义。感谢 Ronny Pfannschmidt。
修复 issue407:修复 addoption docstring 以指向 argparse 而不是 optparse。感谢 Daniel D. Wright。
2.5.0 (2013-12-12)¶
从 pytest 自身的自动化发布测试中移除了 Python 2.5,这意味着它可能很快就会失效(但我们相信此版本仍然可用)。
简化并修复了在涉及参数化 fixture 或函数参数时调用终结器(finalizer)的实现。终结现在在设置时惰性执行,而不是在“拆卸阶段”。虽然这听起来有些奇怪,但它有助于确保我们即使在复杂的代码中也能正确处理设置/拆卸。用户级别的代码不应受到影响,除非它正在实现 pytest_runtest_teardown hook 并期望某些 fixture 实例在此期间被拆卸(这种情况非常罕见,而且无论如何都不可靠)。
PR90:添加 –color=yes|no|auto 选项以强制终端着色模式(“auto”是默认值)。感谢 Marc Abramowitz。
修复 issue319 - 正确显示断言错误中的 Unicode 字符。非常感谢 Floris Bruynooghe 提供了完整的 PR。这也意味着我们现在依赖于 py>=1.4.19。
修复 issue396 - 正确排序和终结类范围的参数化测试,独立于类中的方法数量。
以更好的方式重新修复 issue323 —— 参数化现在绝不会导致运行时递归错误,因为用于按范围/按 fixture 重新排序测试的基础算法不再是递归的(之前是尾递归,这可能导致超过 966 个非函数范围参数的问题)。
修复 issue290 - 现在初步支持用重复的相同值进行参数化(有时用于测试第二次调用是否像第一次一样有效)。
关闭 issue240 - 精确文档 pytest 模块导入的工作方式,讨论两种常见的测试目录布局,以及它如何与 PEP 420 命名空间包交互。
修复 issue246:修复终结器顺序,使其对于依赖于函数范围之上参数化 fixture 的独立 fixture 遵循 LIFO 顺序。(付出了相当大的努力,所以请理解这句话的复杂性 :) 感谢 Ralph Schmitt 提供了精确的失败示例。
修复 issue244:通过为参数实现特殊索引,仅对参数化测试 ID 使用索引
修复 issue287:运行所有终结器,但保存第一个失败终结器的异常并重新抛出,以便拆卸仍会失败。我们重新抛出第一个失败异常,因为它可能是其他终结器失败的原因。
修复在使用 mock.patch 或其他标准装饰器包装器进行测试方法时的排序问题。这解决了 issue346,并应有助于解决随机的“xdist”收集失败。感谢 Ronny Pfannschmidt 和 Donald Stufft 帮助隔离问题。
修复 issue357 - 特殊处理“-k”表达式,允许使用简单的字符串进行过滤,这些字符串不是有效的 Python 表达式。示例:“-k 1.3”匹配所有参数化为 1.3 的测试。“-k None”过滤所有名称中包含“None”的测试,反之亦然,“-k ‘not None’”也一样。以前这些示例会引发语法错误。
修复 issue384:移除了试验支持代码,因为 unittest 兼容性增强功能允许试验自行处理。
导入插件时,如果产生 ImportError,不要隐藏它。修复了 issue375。
修复 issue275 - 允许使用 usefixtures 和 autouse fixtures 运行 doctest 文本文件。
修复 issue380:使 –resultlog 仅依赖于 longrepr,而不是有时才存在的“reprcrash”属性。
解决 issue122:允许 @pytest.fixture(params=iterator) 通过尽早展开为列表来支持。
修复 pytest 自身测试的 pexpect-3.0 兼容性。(修复了 issue386)
允许嵌套参数化值标记,感谢 James Lan 的 PR。
修复新 monkeypatch.setattr(import_path, value) API 的 Unicode 处理。感谢 Rob Dennis。修复了 issue371。
修复 junitxml 中的 Unicode 处理,修复了 issue368。
在 Python 2 的断言重写模式下,修复了编码 cookie 的检测。参见 issue #330。
使“–runxfail”将命令式 pytest.xfail 调用转换为无操作(它已经中和了 pytest.mark.xfail 标记)
完善 pytest / pkg_resources 交互:AssertionRewritingHook PEP 302 兼容加载器现在正确地向 setuptools/pkg_resources 注册自己,以便 pkg_resources.resource_stream 方法正常工作。修复了 issue366。感谢 Jason R. Coombs 的调查和完整的 PR。
pytestconfig fixture 现在是会话范围的,因为在整个测试运行期间它是同一个对象。修复了 issue370。
避免一种令人惊讶的标记故障/混淆情况
@pytest.mark.some(lambda arg: ...) def test_function():
无法正常工作,因为 pytest 假定 @pytest.mark.some 会得到一个已经装饰过的函数。我们现在至少会检测这个参数是否是 lambda,这样示例就能工作了。感谢 Alex Gaynor 提出这个问题。
对检查错误编码/ASCII 的 pypy 测试进行 xfail(pypy 不会报错)。修复了 issue385。
内部使 varnames() 处理类的 __init__,尽管 pytest 本身目前不需要它。还修复了缓存。修复了 issue376。
修复 issue221 - 正确处理没有 __init__.py 的命名空间包导入。
重构内部 FixtureRequest 处理以避免 monkeypatching。积极的用户可见效果之一是“request”对象现在可以在闭包中使用。
修复了 pytest.importskip(modname, minverstring) 中的版本比较
修复 issue377:在 nose-compat 文档中澄清 pytest 不会将 unittest-API 复制到“plain”命名空间中。
修复 @mock 修饰的测试函数的详细报告
2.4.2 (2013-10-04)¶
在 Windows 上,需要 colorama 和较新版本的 py 库,以便 py.io.TerminalWriter() 现在使用 colorama 而不是其自身的 ctypes 技巧。(修复 issue365) 感谢 Paul Moore 提出此问题。
修复“-k”匹配测试的问题,其中“repr”、“attr”和其他名称由于内部实现怪癖(别问)而导致错误的匹配,现在已正确实现。修复了 issue345。
避免 tmpdir fixture 创建过长的文件名,尤其是在使用参数化时 (issue354)
修复 pytest-pep8 和 pytest-flakes / pytest 交互(标记插件中的收集名称假设项始终具有函数,而这些插件则不适用等等)。感谢 Andi Zeidler。
引入 node.get_marker/node.add_marker API,供 pytest-pep8 和 pytest-flakes 等插件使用,以避免 node.keywords 伪字典的繁琐细节。调整了文档。
删除启动时尝试“复制”stdout 的做法,因为它很糟糕。正常的捕获应该能捕捉到测试搞乱标准文件描述符的足够多的可能性。
为插件兼容性添加 pluginmanager.do_configure(config) 作为 config.do_configure() 的链接
2.4.1 (2013-10-02)¶
使用 parser.addoption() 时,传递给“type”关键字的 Unicode 参数也应转换为相应的类型。感谢 Floris Bruynooghe, @dnozay。(修复了 issue360 和 issue362)
修复使用 argcomplete 时点分文件名补全的回归问题,感谢 Anthon van der Neuth。(修复了 issue361)
修复使用 1 元组 (“arg”,) 指定参数化时的回归(参数化的值嵌套在元组中传递)。感谢 Donald Stufft。
合并文档拼写错误修复,感谢 Andy Dirnberger
2.4¶
已知不兼容性
如果从 Python 2.7 或更高版本调用 –genscript,则只能获得一个可在 Python 2.7 或更高版本上运行的独立脚本。使用 Python 2.6 也可以获得 Python 2.5 兼容版本。
如果相应的 setup 方法失败,则所有 xunit 风格的拆卸方法(nose 风格、pytest 风格、unittest 风格)将不会被调用,请参见下面的 issue322。
pytest_plugin_unregister hook 从未被正确调用,并且没有已知的 hook 实现——因此它被移除了。
pytest.fixture 装饰的函数不能再是生成器(即使用 yield)。如果这导致了意想不到的实际问题,此更改可能会在 2.4.1 中撤销。但是,您始终可以编写并返回一个内部函数/生成器,并更改 fixture 消费者以迭代返回的生成器。此更改是根据新的
pytest.yield_fixture
装饰器进行的,请参见下文。
新功能
实验性地引入了一个新的
pytest.yield_fixture
装饰器,它接受与 pytest.fixture 完全相同的参数,但强制 fixture 函数使用yield
语句而不是return statement
。这允许与 fixture 函数中的“with 风格”上下文管理器直接集成,并且通常避免注册终结回调,而是将“yield 之后”的代码视为拆卸代码。感谢 Andreas Pelme、Vladimir Keleshev、Floris Bruynooghe、Ronny Pfannschmidt 和许多其他人参与讨论。如果也指定了“reason”,则允许直接使用 skipif/xfail 的布尔表达式。重新编写跳过文档以推荐“条件作为布尔值”,因为它在模块之间导入标记时可以防止意外。将条件指定为字符串将继续完全支持。
报告:根据失败/错误是否发生或一切通过,将最后一行染成红色或绿色。感谢 Christian Theunert。
使“import pdb ; pdb.set_trace()”在捕获方面原生工作(不再需要“-s”),使
pytest.set_trace()
仅仅是一个快捷方式。修复 issue181:–pdb 现在也适用于收集错误(以及内部错误)。这是通过轻微的内部重构和引入新的 hook
pytest_exception_interact
hook(参见下一项)来实现的。修复 issue341:引入新的实验性 hook,供 IDE/终端截获调试:
pytest_exception_interact(node, call, report)
。新的 monkeypatch.setattr() 变体,用于提供更短的调用来修补模块中的类/函数
monkeypatch.setattr("requests.get", myfunc)
将“requests”模块的“get”函数替换为
myfunc
。修复 issue322:如果 setUpClass 失败,则不运行 tearDownClass。感谢 Mathieu Agopian 的初步修复。此外,使所有 pytest/nose 终结器模仿相同的通用行为:如果 setupX 存在并失败,则不运行 teardownX。这在内部引入了一个新方法“node.addfinalizer()”辅助函数,该函数只能在节点的设置阶段调用。
简化 pytest.mark.parametrize() 签名:允许传入逗号分隔的字符串来指定参数名。例如:
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 - 允许在参数化时标记/xfail/跳过单独的参数集。感谢 Brianna Laugher。
调用新的实验性 pytest_load_initial_conftests hook,允许第三方插件在 conftest 加载之前做一些事情。
Bug 修复
修复 issue358 - 现在使用新的 parser.parse_known_args 方法更正确地解析捕获选项。
pytest 现在使用 argparse 而不是 optparse(感谢 Anthon),这意味着如果安装到 Python 2.6 或更低版本环境中,将添加“argparse”作为依赖项。
修复 issue333:修复一个 unittest/pytest hook 交互不良的案例。
PR27:在收集过程中正确处理 nose.SkipTest。感谢 Antonio Cuni, Ronny Pfannschmidt。
修复 issue355:junitxml 将 name="pytest" 属性添加到 testsuite 标签。
修复 issue336:插件中的 autouse fixture 应该再次工作。
修复 issue279:改进标准数据类型和识别 collections.abc 的断言失败对象比较。感谢 Brianna Laugher 和 Mathieu Agopian。
修复 issue317:断言重写器对 is_package 方法的支持
修复 issue335:文档化 pytest.raises() 返回的 py.code.ExceptionInfo() 对象,感谢 Mathieu Agopian。
从 setup.py 中删除隐式 distribute_setup 支持。
修复 issue305:忽略写入 pyc 文件时的任何问题。
SO-17664702:即使 fixture 函数部分失败,也会调用 fixture 终结器(以前终结器不总是被调用)
修复 issue320 - 修复 fixture 与模块级别函数混合使用时的类范围。感谢 Anatoly Bubenkoff。
您可以指定“-q”或“-qq”以获得不同程度的“更安静”报告(感谢 Katarzyna Jachim)
修复 issue300 - 修复在子目录中启动 py.test 时 conftest 加载顺序。
修复 issue323 - 许多模块范围参数化的排序
使 sessionfinish hook 在与会话启动时相同的 CWD 上下文中执行(有助于修复以相对路径写入输出文件的插件行为,例如 pytest-cov)
修复 issue316 - 正确引用文档中的收集 hook
修复 issue 306 - 清理 -k/-m 选项,使其分别仅匹配标记/测试名称/关键字。感谢 Wouter van Ackooy。
改进了 Python 模块中 doctest 的计数——不再显示没有任何 doctest 项的文件,并且 doctest 示例被计为单独的测试项。感谢 Danilo Bellini。
修复 issue245:通过依赖于已发布的 py-1.4.14 来解决,该版本修复了 py.io.dupfile,使其适用于没有模式的文件。感谢 Jason R. Coombs。
修复当测试输出包含控制字符时的 junitxml 生成问题,解决了 issue267,感谢 Jaap Broekhuizen
修复 issue338:对 setup/teardown 错误也遵守 –tb 样式。感谢 Maho。
修复 issue307 - 在示例中使用 yaml.safe_load,感谢 Mark Eichin。
更好的参数化错误消息,感谢 Brianna Laugher
pytest_terminal_summary(terminalreporter) hook 现在可以使用“.section(title)”和“.line(msg)”方法在测试运行结束时打印额外信息。
2.3.5 (2013-04-30)¶
修复 issue169:对 setup/teardown 错误也遵守 –tb=style。
从不将 fixture 函数用于测试函数收集
允许重新运行测试项 / 有助于修复 pytest-reruntests 插件,也有助于保持更少的 fixture/资源引用
即使对于通过的测试,也将捕获的 stdout/stderr 放入 junitxml 输出(感谢 Adam Goucher)
问题 265 - 将 nose 的 setup/teardown 与 setupstate 集成,使其在未 setup 时不尝试 teardown
问题 271 - 不在工作节点上写入 junitxml
问题 274 - 当 doctest 不知道示例位置时,不要尝试显示完整的 doctest 示例
问题 280 - 在有缺陷的 CPython 2.6.0 上禁用断言重写
注入“getfixture()”辅助函数以从 doctest 中检索 fixture,感谢 Andreas Zeidler
问题 259 - 在断言重写时,与 Python 2 上的默认源编码 ASCII 保持一致
问题 251 - 报告跳过,而不是忽略带有 init 的类
issue250:参数化名称和值中的 unicode/str 混合现在可以正常工作
issue257:以注释行结尾的源代码的断言触发编译不会在 python2.5 中崩溃(通过 py>=1.4.13.dev6 修复)
修复 –genscript 选项以生成也适用于 python3.3 的独立脚本(导入器排序)
issue171 - 在断言重写中,显示一些全局变量的 repr
修复“-k”的选项帮助
将分发包的长描述移至 README.rst
改进 metafunc.parametrize() 的 docstring
修复在测试函数中使用 capsys 和 pytest.set_trace() 时,查看 capsys.readouterr() 会中断的 bug
允许在自定义 `python_functions` 测试发现时,指定以“_”开头的前缀。(感谢 Graham Horler)
通过将额外数据放在新行并增加缩进,改进 PYTEST_DEBUG 跟踪输出
确保 skip/fail 等 OutcomeExceptions 已初始化异常属性
问题 260 - 不在普通的 unittest 案例中使用 nose 特殊设置
修复 issue134 - 打印阻止运行指定测试项的收集错误
修复 issue266 - 接受 MarkEvaluator 表达式中的 Unicode 字符
2.3.4 (2012-11-20)¶
yielded 测试函数现在将激活 autouse-fixture,但不能接受 fixture 作为 funcarg——无论如何,建议使用 2.0 之后的参数化功能而不是 yield,参见: https://pytest.cn/en/stable/example/how-to/parametrize.html
修复 autouse 问题:如果 autouse-fixture 定义在 a/conftest.py 文件中,而测试在 a/tests/test_some.py 中,则不会被发现
修复 issue226 - fixture teardown 的 LIFO 顺序
修复 issue224 - 参数大于 256 个字符的调用现在可以正常工作
修复 issue91 - 在示例中添加/讨论包/目录级别的设置
允许通过 item.keywords[…]=assignment 动态定义标记,与“-m”选项集成
使“-k”接受与“-m”相同的表达式,以便可以写入:-k “name1 or name2” 等。如果以前使用过“TestClass.test_method”之类的特殊语法,这会造成轻微的不兼容,现在需要将其写为 -k “TestClass and test_method”才能匹配某个测试类中的某个方法。
2.3.3 (2012-11-06)¶
修复 issue214 - 解析包含特殊对象的模块,例如 Flask 的请求对象,如果请求未激活,在 getattr 访问时会崩溃。感谢 Thomas Waldmann。
修复 issue213 - 允许使用不支持 __eq__ 运算符的值(如 numpy 数组)进行参数化
修复 issue215 - 将 test_python.org 拆分为多个文件
修复 issue148 - @unittest.skip 对类的跳过现在被识别,并避免调用 setUpClass/tearDownClass,感谢 Pavel Repin
修复 issue209 - 通过依赖于较新的 pylib 重新引入 Python 2.4 支持,该 pylib 重新引入了用于 AST 解释器之前的语句查找功能
nose 支持:如果它是可调用对象,才调用 setup,感谢 Andrew Taumoefolau
修复 issue219 - 添加 py2.4-3.3 分类器到 TROVE 列表
在回溯中,*,** 参数值现在显示在正常参数旁边(感谢 Manuel Jacob)
修复 issue217 - 支持 mock.patch 与 pytest 的 fixture - 请注意,您需要 mock-1.0.1 或 Python 3.3 内置的 unittest.mock。
修复 issue127 - 改进 pytest_addoption() 的文档,并添加
config.getoption(name)
辅助函数以保持一致性。
2.3.2 (2012-10-25)¶
修复 issue208 和 issue29:使用新的 py 版本以避免在长模块中打印回溯时长时间暂停
修复 issue205 - 子目录中的 conftest 文件自定义 pytest_pycollect_makemodule 和 pytest_pycollect_makeitem 现在可以正常工作
修复参数化 setup 的 teardown 顺序
修复 issue127 - 更好地文档化 pytest_addoption 和相关对象。
修复 unittest 行为:TestCase.runtest 仅在定义了测试方法时才调用
改进 trial 支持:不收集其空的 unittest.TestCase.runTest() 方法
“python setup.py test”现在可以与 pytest 本身一起使用
修复/改进内部/打包相关部分
test_nose.py 的异常消息检查现在在 python33 上也能通过
issue206 - 修复 test_assertrewrite.py,使其在存在全局 PYTHONDONTWRITEBYTECODE=1 时也能工作
将 tox.ini 添加到 pytest 分发包中,以便正确分发 ignore-dirs 和其他配置位,供运行 pytest 自身测试的维护者使用
2.3.1 (2012-10-20)¶
修复 issue202 - 修复回归:从 fixture 函数中使用“self”现在可以按预期工作(它是使用 fixture 的测试方法所看到的同一个“self”实例)
在 freebsd* 系统上跳过使用 pexpect 的测试(主要是 test_pdb.py),因为 pexpect 不支持它(挂起)
链接到 –markers 输出中的网页,该网页提供了 pytest.mark.* 用法的帮助。
2.3.0 (2012-10-19)¶
修复 issue202 - 更好地自动命名参数化测试函数
修复 issue139 - 引入 @pytest.fixture,它允许直接指定 funcarg 工厂的范围和参数化。
修复 issue198 - 在某些情况下,Windows 32 位系统上,嵌套目录结构会导致 conftest fixture 找不到,原因是路径操作问题
修复 issue193:跳过使用空参数集参数化的测试函数
修复 Python 3.3 兼容性,主要是之前依赖于字典排序的报告部分
引入按资源和参数化设置重新排序测试的功能,该功能优先于通常的文件排序
修复 issue185:猴子补丁 time.time 不会导致 pytest 失败
修复 issue172:pytest.fixture 装饰的 setup_module 函数重复调用
修复 junitxml=path 构造,以便如果测试更改了当前工作目录并且路径是相对路径,则它会从原始当前工作目录正确构造。
修复“python setup.py test”示例,使其返回正确的“errno”
修复 issue165 - 修复损坏的文档链接并提及 Stack Overflow 的 FAQ
捕获 Unicode 问题时,将失败表示写入终端,以防止整个会话崩溃
修复 xfail/skip 混淆:跳过标记或命令式 pytest.skip 现在将优先于 xfail 标记,因为在跳过的情况下我们无法确定 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
始终在测试运行的标题中报告已安装的第三方插件
修复 issue160:xfail 标记测试的失败设置应报告为 xfail(而不是 xpass)
修复 issue128:在使用 capsys/capfd 时显示捕获的输出
修复 issue179:正确显示工厂的依赖链
pluginmanager.register(…) 如果插件已注册或名称已被占用,现在将引发 ValueError
修复 issue159:改进 https://pytest.cn/en/6.0.1/faq.html ,特别是关于“魔法”历史的部分,也提到了 pytest-django、trial 和 unittest 集成。
使 request.keywords 和 node.keywords 可写。所有派生的收集节点都将看到关键字值。关键字是包含标记和其他信息的字典。
修复 issue 178:XML 二进制转义符现在包装在 py.xml.raw 中
修复 issue 176:即使我们在 Python 级别用子类替换了 AssertionError,也能正确捕获内置的 AssertionError
工厂发现不再因提供不健全的 __code__ 对象(例如 mock.call)的魔法全局可调用对象而失败
修复 issue 182:testdir.inprocess_run 现在会考虑传入的插件
- 修复 issue 188:确保 Python 2 上 sys.exc_info 清空
在调用测试之前
修复 issue 191:添加 unittest TestCase runTest 方法支持
修复 issue 156:monkeypatch 正确处理类级别描述符
报告优化
pytest_report_header 现在接收“startdir”参数,以便您可以使用 startdir.bestrelpath(yourpath) 显示美观的相对路径
允许插件同时实现 pytest_report_header 和 pytest_sessionstart(sessionstart 先调用)。
如果没有取消选择的原因行,则不显示
py.test -vv 将显示所有断言比较,而不是截断
2.2.4 (2012-05-22)¶
修复涉及 % 运算符的重写断言的错误消息
修复 issue 126:正确匹配 junitxml 二进制转义的所有无效 XML 字符
修复 unittest 问题:现在 @unittest.expectedFailure 标记应该被正确处理(您也可以使用 @pytest.mark 标记)
文档化与扩展的 distribute/setuptools 测试命令的集成
修复 issue 140:正确获取 setup/teardown_class 绑定类方法的实际函数
修复 issue #141:从已废弃的 paste.pocoo.org 切换到 bpaste.net
修复 issue #143:当调用 configure/sessionstart 时,始终调用 unconfigure/sessionfinish
修复 issue #144:更好地将测试 ID 转换为 junitxml 类名
升级 distribute_setup.py 至 0.6.27
2.2.3 (2012-02-05)¶
修复上传的包,使其仅包含必要文件
2.2.2 (2012-02-05)¶
修复 issue101:向 unittest.TestCase 测试函数传递错误参数现在会产生更好的输出
修复 issue102:当测试目录重命名且一些 pyc/__pycache__ 文件残留时,报告更有用的错误和提示
修复 issue106:允许参数化多次应用,例如从模块、类和函数级别。
修复 issue107:实际执行会话范围的终结
在参数化中不检查间接参数是否是 funcarg 名称
向 monkeypatch funcarg 添加 chdir 方法
修复第二次调用 monkeypatch undo 导致的崩溃
修复 issue115:使 –collectonly 能够抵御早期失败(缺少文件/目录)
“-qq –collectonly”现在只显示文件和其中的测试数量
“-q –collectonly”现在显示测试 ID
允许向测试报告添加属性,使其也适用于分布式测试(无需升级 pytest-xdist)
2.2.1 (2011-12-16)¶
修复 issue99 (在 pytest 和 py 中):resultlog 的内部错误现在产生更好的输出 - 通过标准化 pytest_internalerror 输入参数来修复。
修复 issue97 / 回溯问题 (在 pytest 和 py 中):改进与 jinja2 和 cython 结合时的回溯输出,这些工具会修改回溯。
修复 issue93 (在 pytest 和 pytest-xdist 中):避免“延迟拆卸”:测试节点中的最后一个测试现在将直接运行其拆卸,而不是等待会话结束。感谢 Dave Hunt 的良好报告和反馈。pytest_runtest_protocol 和 pytest_runtest_teardown hook 现在都有“nextitem”可用,当其为 None 时表示测试运行结束。
修复由于未知源收集项导致的收集崩溃,感谢 Ralf Schmitt(通过依赖较新版本的 pylib 修复)
2.2.0 (2011-11-18)¶
修复 issue90:引入测试项的提前拆卸,以便更早地调用拆卸函数。
添加一个功能强大的 metafunc.parametrize 函数,允许分多步参数化测试函数参数,因此可以从独立的插件和位置进行参数化。
添加一个 @pytest.mark.parametrize 辅助函数,允许轻松地用不同的参数值调用测试函数
向“参数化”示例页面添加示例,包括测试场景的快速移植以及新的参数化函数和装饰器。
引入通过 ini 文件或插件 hook 对“pytest.mark.*”辅助函数的注册。此外,引入了“–strict”选项,它将未注册的标记视为错误,从而避免拼写错误并为测试套件维护一套描述良好的标记。请参见 https://pytest.cn/en/stable/how-to/mark.html 及其链接中的示例。
issue50:引入“-m marker”选项以根据标记选择测试(这是一个比“-k”更严格、更可预测的版本,因为“-m”只匹配完整的标记,并且具有更明显的 and/or 语义规则)。
新功能,帮助优化测试速度:–durations=N 选项,用于显示 N 个最慢的测试调用和 setup/teardown 方法。
修复 issue87:–pastebin 现在可以在 Python 3 下工作
修复 issue89:–pdb 在 doctest 中出现意外异常时更合理地工作
修复并清理 pytest 自身的测试套件,使其不泄露文件描述符
修复 issue83:链接到生成的 funcarg 列表
修复 issue74:pyarg 模块名称现在根据 imp.find_module 假阳性进行检查
修复与 twisted/trial-11.1.0 用例的兼容性
简化 Node.listchain
通过依赖 py.xml 简化 junitxml 输出代码
添加对 unittest 类和函数的跳过属性支持
2.1.3 (2011-10-18)¶
修复 issue79:断言重写在某些布尔运算比较上失败
正确处理零长度参数(例如 pytest '')
修复 issue67 / junitxml 现在包含正确的测试持续时间,感谢 ronny
修复 issue75 / 在 Jython 上跳过测试失败
修复 issue77 / 允许 assertrepr_compare hook 应用于测试子集
2.1.2 (2011-09-24)¶
修复在某些 Python 版本上带有 Windows 换行符的文件进行断言重写的问题
通过包/模块名称(–pyargs)优化测试发现,感谢 Florian Mayer
修复 issue69 / 断言重写在某些布尔运算上已修复
修复 issue68 / 包现在可以使用断言重写
修复 issue66:当传递 -O 选项时,使用不同的断言重写缓存
不要在 Jython 上尝试断言重写,使用 reinterp
2.1.1¶
修复 issue64 / pytest.set_trace 现在可以在 pytest_generate_tests hook 中工作
修复 issue60 / 修复涉及创建 __pycache__ 的错误情况
修复 issue63 / 涉及包含“%”的字符串的插入的断言重写
修复带 ** 参数的调用上的断言重写
如果禁用字节码生成,则不缓存重写模块
修复只读目录中的断言重写
修复 issue59:为 junitxml 输出提供 system-out/err 标签
修复 issue61:3个或更多操作数的布尔运算的断言重写
您现在可以使用“cd doc ; make man”构建手册页
2.1.0 (2011-07-09)¶
修复 issue53:以正确的顺序调用 nose 风格的 setup 函数
修复 issue58 和 issue59:新的断言代码修复
合并 Benjamin 的 assertionrewrite 分支:现在 Python 2.6 及以上版本的测试模块的断言是通过重写 AST 并在导入测试模块之前保存 pyc 文件来完成的。有关详细信息,请参阅 doc/assert.txt。
修复 issue43:改进 doctest,在意外异常时提供更好的回溯报告
修复 issue47:junitxml 中测试用例的计时输出现在是正确的
修复 issue48:MarkInfo repr 中的拼写错误导致异常
修复 issue49:避免初始化部分失败时出现令人困惑的错误
修复 issue44:junitxml 文件路径的环境变量/用户名扩展
在 PyPy 的测试运行中显示 releaselevel 信息
重新设计了文档页面,以实现更好的导航和 PDF 生成
即使在会话启动期间中断,也会报告 KeyboardInterrupt
修复 issue 35 - 提供 PDF 文档版本和索引页的下载链接
2.0.3 (2011-05-11)¶
修复 issue38:hook 调用时(尤其是早期配置/会话启动 hook)回溯更美观
修复 junitxml 文件中缺少的跳过原因/元信息,通过 http://lists.idyll.org/pipermail/testing-in-python/2011-March/003928.html 报告
修复 issue34:避免收集失败,当“test”前缀类派生自 object 时。
如果未实际使用 –genscript,则 genscript 插件不需要 zlib(和其他库)。
加速跳过(通过内部不进行完整的回溯表示)
修复 issue37:避免 junitxml 输出中的无效字符
2.0.2 (2011-03-09)¶
解决 issue32 - 通过降低相对开销来加速非常快的测试函数的测试运行
修复 issue30 - 扩展 xfail/skipif 处理并改进报告。如果您的 skip/xfail 表达式中存在语法错误,现在会收到漂亮的错误报告。
此外,您现在可以从 xfail/skipif 表达式中访问模块全局变量,例如,以下代码现在可以工作
import pytest import mymodule @pytest.mark.skipif("mymodule.__version__[0] == "1") def test_function(): pass
如果模块的版本字符串不是以“1”开头,则不会运行此测试函数。请注意,指定字符串而不是布尔表达式允许 py.test 在总结测试运行时报告有意义的信息,说明是什么条件导致测试跳过(或 xfail)。
修复 issue28 - setup_method 和 pytest_generate_tests 协同工作:setup_method fixture 方法现在也为从 pytest_generate_tests hook 生成的测试函数调用。
修复 issue27 - collectonly 和关键字选择 (-k) 现在可以一起工作。此外,如果您执行“py.test –collectonly -q”,现在会得到一个扁平的测试 ID 列表,您可以将其粘贴到 py.test 命令行以执行特定测试。
修复 issue25:避免报告 –pdb 和 Python 3.2/编码输出相关的问题
修复 issue23 - tmpdir 参数现在可以在 Python 3.2 和 Windows XP 上工作。从 Python 3.2 开始,可能支持 os.symlink。通过要求较新版本的 py 库,py.path.local() 实现认可了这一点。
修复了文档中的拼写错误(感谢 Victor Garcia,Brianna Laugher),特别感谢 Laura Creighton 也审查了部分文档。
修复类详细进度报告的输出略微不正确的问题(感谢 Amaury)
更精确地(避免)node.Class|Function 访问的弃用警告
避免回溯中的 std unittest 断言辅助代码(感谢 Ronny)
2.0.1 (2011-02-07)¶
优化并统一了初始捕获,即使在早期加载的 conftest.py 文件或插件中使用 logging 模块也能良好工作。
允许在测试 ID 中省略“()”,以实现 Alfredo 优秀的 pytest.vim 插件生成的统一测试 ID。
修复 issue12 - 使用“–version”和“–traceconfig”显示插件版本,并文档化如何向报告测试标题添加额外信息
修复 issue17(python3 上的导入-* 报告问题),通过要求 py>1.4.0(1.4.1 将包含它)
修复 issue10(numpy 数组真值检查),通过优化 py 库中的断言解释
修复 issue15:使 nose 兼容性测试与 Python 3 兼容(现在 nose-1.0 支持 Python 3)
删除了有些令人惊讶的“same-conftest”检测功能,因为它会忽略出现在多个子目录中的 conftest.py。
改进断言(“not in”),感谢 Floris Bruynooghe
改进在“python -OO”上运行时(断言和文档字符串被关闭,可能导致假阳性)的行为/警告
引入 pytest_cmdline_processargs(args) hook,允许命令行参数的动态计算。这修复了一个回归,因为 pytest 在 2.0 之前允许从 conftest.py 文件设置命令行选项,而 pytest-2.0 至今只允许从 ini 文件设置。
修复 issue7:doctest 模块中的断言失败。doctest 中意外的失败通常会更美观地显示,即在 doctest 失败的上下文中。
修复 issue9:xfail 标记测试的 setup/teardown 函数如果失败则报告为 xfail,但如果成功则报告为正常通过(非 xpassing)。这仅适用于“直接”的 setup/teardown 调用,因为 teardown_class/teardown_module 无法与单个测试紧密相关。
修复 issue14:进程退出时没有日志错误
对非 TTY 上的“收集”输出进行优化
优化内部插件注册和 –traceconfig 输出
引入一种机制,从命令行阻止/取消注册插件,请参见 https://pytest.cn/en/stable/how-to/plugins.html#cmdunregister
默认激活 resultlog 插件
修复了由于收集前运行语义导致的 yielded 测试的回归问题,这些测试不像 pytest 1.3.4 那样进行了设置。但是,请注意,推荐的更清晰的测试参数化方法仍然是“pytest_generate_tests”机制,请参阅文档。
2.0.0 (2010-11-25)¶
pytest-2.0 现在是自己的包,并依赖于 pylib-2.0
新功能:python -m pytest / python -m pytest.main 功能
新的 Python 调用:pytest.main(args, plugins) 用于早期加载一些自定义插件。
更努力地以更兼容的方式运行 unittest 测试套件,通过将 setup/teardown 语义推迟到 unittest 包。也更努力地运行 twisted/trial 和 Django 测试,现在这些测试应该基本上默认就可以工作。
引入了一种通过 ini 风格文件设置配置选项的新方法,默认情况下会搜索 setup.cfg 和 tox.ini 文件。旧方法(某些环境变量,动态 conftest.py 读取)已被移除。
添加了一个新的“-q”选项,它降低了详细程度并打印了更像 nose/unittest 风格的“点”输出。
修复 issue135 - marks 现在也适用于 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”(意外通过)测试不会导致退出代码!=0
修复 issue131 / issue60 - 导入用作命名空间包的 __init__ 文件中的 doctest
修复 bug:在类/模块级别应用“pytestmark”现在也适用于 unittest 收集的函数
新增了对 cached_setup 辅助函数的“class”级别的支持
修复怪异之处: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 作为上下文管理器,参见示例
(感谢 Ronny Pfannschmidt)
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
Funcarg 工厂现在可以动态地将标记应用于测试调用。例如,如果工厂为测试提供预期失败的参数,这会很有用
改进了收集和导入错误的错误报告。这利用了一种更通用的机制,即对于自定义测试项/收集节点,
node.repr_failure(excinfo)
现在被统一调用,因此您可以覆盖它以返回您选择的字符串错误表示,该表示将作为(红色)字符串报告。def pytest_funcarg__arg(request): request.applymarker(py.test.mark.xfail(reason="flaky config")) ... def test_function(arg): ...
引入“–junitprefix=STR”选项,用于在 junitxml 文件中所有报告前添加前缀。
使测试和
pytest_recwarn
插件特别是完全兼容 Python 2.7(如果您使用recwarn
funcarg,则警告将启用,以便您可以以跨 Python 的方式正确检查它们的存在)。
Bug 修复
优化 –pdb:忽略 xfail 测试,统一其 TB 报告,并且不再在末尾再次显示失败。
修复使用 ** 运算符的断言解释问题(感谢 Benjamin Peterson)
修复 issue105:在失败断言的同一行进行赋值(感谢 Benjamin Peterson)
修复 issue104:junitxml 插件中测试名称的正确转义(感谢匿名用户)
修复 issue57 -f|–looponfail 以使用 xpassing 测试(感谢 Ronny)
修复 issue92:collectonly reporter 和 –pastebin(感谢 Benjamin Peterson)
修复 py.code.compile(source) 以生成唯一文件名
通过将代码编译推迟到(可覆盖的)Frame.eval 类,修复 PyPy 上的断言重新解释问题。(感谢 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 插件中执行分布式测试相关报告,而不是在通用 py.test 分发包中包含分布式相关代码
修复 Windows 上的 homedir 检测
发布 distribute_setup.py 版本 0.6.13
添加了新 capturelog 和 coverage 插件的链接
1.3.1 (2010-05-25)¶
修复 issue103:引入 py.test.raises 作为上下文管理器,参见示例
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() 返回退出状态而不是引发 SystemExit,并允许它被多次调用。这当然要求您的应用程序和测试被正确拆卸且不具有全局状态。
Bug 修复
改进的回溯显示:- 改进并统一了“–tb=short”选项的报告 - 测试模块导入期间的错误大大缩短(使用 –tb=short 样式) - raises 显示更短更相关的回溯 - –fulltrace 现在更系统地使跟踪更长/抑制截断
通过操作 Python 的 linecache.cache 而不是之前创建自定义代码对象的 hacky 方式,改进了对 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”字符组成的字符串参数。这些字符与您在点状进度打印期间看到的单个字符相关,并将在测试运行结束时为每个测试打印额外的一行。这一行指示了确切的位置或测试 ID,您可以直接将其粘贴到 py.test 命令行以重新运行特定测试。
允许外部插件通过新的 pytest_addhooks(pluginmanager) hook 注册新的 hook。新发布的用于分布式和循环失败测试的 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,用于允许自定义匹配测试模块的 Module 收集对象。
扩展和完善 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 输出的测试
修复/优化 Python 3 兼容性(感谢 Benjamin Peterson)
修复了 Jython/Win32 组合的工作问题,但请注意:Jython 2.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”,它显示给定测试路径的可用 funcarg 及其帮助字符串(各自工厂函数的 docstring)
如果 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 收集 hook。
收集/项节点特定的 runtest/collect hook 仅在匹配的 conftest.py 文件上精确调用,即那些位于项文件系统路径正下方的文件
更改:第一个返回内容的 pytest_collect_directory hook 将阻止后续 hook 的调用。
更改: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:在分布式测试期间,在工作节点上调用 pytest_sessionstart 和 pytest_sessionfinish hook,正确报告模块/会话拆卸 hook。
修复 issue65:如果远程未安装 execnet/py 库,则正确处理分布式测试。
如果 execnet 不可用,跳过某些安装测试
修复文档,修复内部 bin/ 脚本生成
1.1.0 (2009-11-05)¶
引入通过 setuptools 的 pkg_resources.iter_entry_points 实现‘pytest11’入口点的自动插件注册
修复 py.test 分布式测试,使其与 execnet >= 1.0.0b4 兼容
重新引入 `py.test.cmdline.main()` 以提供更好的向后兼容性
SVN 路径:修复 `path.check(versioned=True)` 处理 SVN 路径的错误,允许 SVN 路径中包含“%”,使 `svnwc.update()` 默认像 1.0.x 版本一样进入交互模式,并添加 `svnwc.update(interactive=False)` 来禁止交互。
优化分布式 tarball,使其包含测试文件而不包含 `.pyc` 文件
进一步努力,使 `py.compat.*` 访问的弃用警告能报告正确的位置
1.0.3¶
调整和改进文档
移除 `py.rest` 工具和内部命名空间 - 它从未真正被宣传过,如果需要,仍然可以在旧版本中使用。如果有人感兴趣,我想它可以作为一个独立的工具被复活。
修复 issue48 和 issue59:如果从导入的测试文件模块看起来不来自其文件路径,则抛出错误 - 避免了多次报告的“同名”混淆问题
合并了 Ronny 的 nose 兼容性修改:现在支持 nose 风格的 `setup_module()` 和 `setup()` 函数
引入通用化的 `py.test.mark` 函数标记
重新调整/优化命令行分组
弃用 `parser.addgroup`,推荐使用创建选项组的 `getgroup`
添加 `--report` 命令行选项,允许控制跳过/预期失败部分的显示
通用跳过:一种新的方式,可以根据平台或 `sys` 模块属性,在函数、类和模块级别使用 `skipif` 或 `xfail` 标记 Python 函数。
扩展 `py.test.mark` 装饰器以允许位置参数
引入并测试“`py.cleanup -d`”以删除空目录
修复 issue #59 - 增强 `unittest` 测试收集的健壮性
通过向 `ApiModule` 添加 `__all__` 属性使 bpython/help 交互工作,并清理 `initpkg`
`pylib` 使用 MIT 许可证,并添加了一些贡献者
移除 `py.execnet` 代码,并将所有用法替换为真正的“`execnet`”
修复 issue50 - 对于具有多个参数的测试函数,`cached_setup` 现在更符合预期地进行缓存。
合并 Jarko 的修复,包括 issue #45 和 #46
添加为 `py.lookup` 指定搜索路径的功能
修复了一个 `funcarg cached_setup` 错误,该错误可能只在分布式测试和带有 `teardown` 的“模块”作用域中发生。
为使代码库与 Python 3 兼容进行了许多修复和更改,非常感谢 Benjamin Peterson 的帮助。
整合 `builtins` 实现以兼容 >=2.3 版本,并添加辅助函数以简化维护 2.x 和 3.x 兼容代码。
弃用 `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`
为 `py.test` 的 `monkeypatch funcarg` 引入 `delattr/delitem/delenv` 方法
整合 `py.log` 实现,移除旧方法。
引入 `py.io.TextIO` 和 `py.io.BytesIO` 以区分文本/Unicode 流和字节流(如果可用,使用底层标准库 `io.*`)
提供 `py.unittest_convert` 辅助脚本,该脚本将“`unittest.py`”风格的文件转换为更简单的断言/直接测试类 `py.test/nosetests` 风格。该脚本由 Laura Creighton 编写。
简化了内部 `localpath` 实现
1.0.2 (2009-08-27)¶
修复了由 Fedora Red Hat 打包触发的打包问题,同时将 `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`”选项,用于显示所有长选项命令行选项的 `conftest.py` / 环境变量名称,以及一些特殊的 `conftest.py` 变量。相应地,将 `conftest` 设置中的“`conf_capture`”重命名为“`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)¶
清晰地处理并报告测试设置的最终 `teardown`
修复 `py.path.svnwc().versioned()` 与 SVN 1.6 的兼容性问题(感谢 Wouter Vanden Hove)
`setup/teardown` 或收集问题现在在进度行中显示为 `ERROR` 或大写“`E`”。它们被单独报告和计数。
分布式测试:正确处理本地收集但无法在远程端收集的测试项——这通常是由于平台/依赖关系原因。
简化了 `py.test.mark` API - 参见关键词插件文档
更好地与日志记录集成:现在默认情况下,捕获功能会将测试函数及其即时 `setup/teardown` 捕获到单个流中
`capsys` 和 `capfd funcargs` 现在具有 `readouterr()` 和 `close()` 方法(底层使用了 `py.io.StdCapture/FD` 对象,这些对象也新增了 `readouterr()` 方法,用于返回捕获的 `out/err` 快照)
改进了断言重新解释功能,使其更好地处理不返回布尔值的比较(maciej fijalkowski 报告了 `numpy` 相关问题,并为此表示感谢)
将每个测试的输出捕获重构到 `pytest_iocapture.py` 插件中,从而从 `config` 对象中移除了捕获代码
使用 `item.repr_failure(excinfo)` 而不是 `item.repr_failure(excinfo, outerr)`
1.0.0b8 (2009-07-22)¶
`pytest_unittest` 插件现在默认启用
引入了 `pytest_keyboardinterrupt` 钩子并完善了 `pytest_sessionfinish` 钩子,并添加了测试。
解决了日志模块的错误交互问题(“关闭已关闭的文件”)。感谢 Sridhar Ratnakumar 触发了这个问题。
如果插件使用“`py.test.importorskip`”导入依赖项,将只发出警告,而不会退出测试过程。
文档多方面改进: - 完善了 `funcargs` 文档,使用术语“`factory`”而非“`provider`” - 添加了新的演讲/教程文档页面 - 更好的下载页面 - 更好的插件文档字符串 - 添加了新的插件页面和自动文档生成脚本
修复了与部分失败的 `funcarg setup` 相关的 `teardown` 问题(感谢 MrTopf 报告),现在即使“`pytest_runtest_setup`”失败,也会始终调用“`pytest_runtest_teardown`”。
调整了 Python 模块中 `docstring` 的 `doctest` 输出,感谢 Radomir。
1.0.0b7¶
将 `py.test.xfail` 重命名回 `py.test.mark.xfail`,以避免两种 `xfail` 装饰方式
重新添加了 `py.test.mark` 装饰器,用于在函数上设置关键词(它实际上有文档说明,所以移除它是不妥的)
从 `request.addfinalizer()` 中移除 `scope` 参数,因为 `request.cached_setup` 已经有 `scope` 参数。TOOWTDI (There's Only One Way To Do It)。
在报告失败之前执行 `setup` 终结
应用 Andreas Kloeckner 的修改补丁,以允许测试函数没有 `func_code` (#22) 并使“-k”和函数关键词工作 (#20)
应用 Daniel Peolzleithner 的补丁(issue #23)
解决 issue #18,`multiprocessing.Manager()` 和重定向冲突问题
使 `remote_exec` 代码的 `__name__ == “__channelexec__”`
1.0.0b3 (2009-06-19)¶
插件类已移除:现在可以直接在 `conftest.py` 或全局 `pytest_*.py` 文件中定义钩子。
添加了新的 `pytest_namespace(config)` 钩子,允许将辅助函数直接注入 `py.test.*` 命名空间。
记录并完善了许多钩子
通过 `pytest_generate_tests` 钩子添加了新风格的生成式测试,该钩子与函数参数良好集成。
1.0.0b1¶
引入了新的“`funcarg`”设置方法,详见 `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` 对象,允许将函数执行分叉到一个子进程并获取结果。
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` URL 中包含 `+` 号 [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,以便在 2.5 版本(`py.execnet`)中调用 `atexit` [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]