更新日志¶
版本遵循 语义化版本控制 (<major>.<minor>.<patch>)。
向后不兼容(破坏性)的更改只会在主要版本中引入,并提前在发布版本的弃用部分中通知。
pytest 9.0.1 (2025-11-12)¶
Bug 修复¶
打包更新和下游注意事项¶
#13933: tox 配置已调整,以确保所需的版本字符串可以通过
SETUPTOOLS_SCM_PRETEND_VERSION_FOR_PYTEST环境变量作为发布过程的一部分传递到其 package_env 中 – 由 @webknjaz。
面向贡献者的更改¶
pytest 9.0.0 (2025-11-05)¶
新功能¶
#1367: 已添加子测试支持。
子测试 是参数化的替代方案,在参数化值并非在收集时都已知的情况下非常有用。
示例
def contains_docstring(p: Path) -> bool: """Return True if the given Python file contains a top-level docstring.""" ... def test_py_files_contain_docstring(subtests: pytest.Subtests) -> None: for path in Path.cwd().glob("*.py"): with subtests.test(path=str(path)): assert contains_docstring(path)
每个断言失败或错误都由上下文管理器捕获并单独报告,从而清晰地显示所有缺少文档字符串的文件。
此外,现在还支持
unittest.TestCase.subTest()。此功能最初是作为 pytest-subtests 中的一个独立插件实现的,但此后已合并到核心。
注意
此功能是实验性的,未来版本可能会有所发展。这意味着我们可能会更改子测试在失败时的报告方式,但功能及其使用方式是稳定的。
#13743: 添加了对原生 TOML 配置文件的支持。
尽管自版本 6 以来,pytest 支持在
pyproject.toml文件中[tool.pytest.ini_options]下的配置,但它是以“INI 兼容模式”进行的,其中所有配置值都被视为字符串或字符串列表。现在,pytest 支持原生 TOML 数据模型。在
pyproject.toml中,原生 TOML 配置位于[tool.pytest]表下。# pyproject.toml [tool.pytest] minversion = "9.0" addopts = ["-ra", "-q"] testpaths = [ "tests", "integration", ]
仍支持
[tool.pytest.ini_options]表,但不能同时使用这两个表。如果您更喜欢使用单独的配置文件,或者不使用
pyproject.toml,则可以使用pytest.toml或.pytest.toml。# pytest.toml or .pytest.toml [pytest] minversion = "9.0" addopts = ["-ra", "-q"] testpaths = [ "tests", "integration", ]
文档现在(有时)以 TOML 和 INI 两种格式在选项卡式界面中显示配置代码片段。
有关完整详细信息,请参阅 配置文件格式。
#13823: 添加了通过
strict配置选项启用的“严格模式”。当设置为
true时,strict选项目前启用可以显式设置各个严格性选项以覆盖全局
strict设置。以前已弃用的
--strict命令行标志现在启用严格模式。如果 pytest 将来添加新的严格性选项,它们也将启用严格模式。因此,您应该仅在使用固定/锁定的 pytest 版本时,或希望主动采用新的严格性选项时启用严格模式。
有关更多详细信息,请参阅 使用 pytest 的严格模式。
#13737: 添加了
strict_parametrization_ids配置选项。设置后,如果 pytest 检测到非唯一的参数集 ID,它将发出错误,而不是通过添加
0、1等自动使 ID 唯一。这对于捕获意外重复特别有用。#13072: 添加了使用 OSC 9;4; ANSI 序列在终端选项卡中显示测试会话进度的支持。当 pytest 在 ConEmu、Gnome Terminal、Ptyxis、Windows Terminal、Kitty 或 Ghostty 等支持的终端模拟器中运行时,您将在终端选项卡或窗口中看到进度,从而一目了然地监控 pytest 的进度。
此功能在 TTY 中运行时自动启用。它作为内部插件实现。如果需要,可以通过以下方式禁用: - 在用户级别,使用命令行上的
-p no:terminalprogress或通过环境变量PYTEST_ADDOPTS='-p no:terminalprogress'。 - 在项目配置级别,使用addopts = "-p no:terminalprogress"。#478: 当配置中
consider_namespace_packages为true时,支持 PEP420(隐式命名空间包)作为--pyargs目标。以前,此选项仅影响包导入,现在它也影响测试发现。
#13678: 添加了一个新的
faulthandler_exit_on_timeout配置选项,默认设置为“false”,以在死锁情况下让faulthandler在超时后中断pytest进程。以前,
faulthandler超时只会将所有线程的追踪信息转储到 stderr,但不会中断pytest进程。– 由 @ogrisel。
#13829: 添加了通过
Parser.addini()中的aliases参数支持配置选项别名。插件现在可以为配置选项注册替代名称,从而在配置命名方面提供更大的灵活性,并在重命名选项时支持向后兼容性。如果配置文件中同时指定了规范名称和别名,则规范名称始终优先。
现有功能的改进¶
#13330: 将 pytest 配置分散到多个文件(例如,同时存在
pytest.ini文件和带有[tool.pytest.ini_options]表的pyproject.toml)现在将打印警告,以使用户更清楚地知道只有一个文件实际被使用。– 由 @sgaist
#13574: 单个参数
--version不再加载整个插件基础设施,从而在仅显示 pytest 版本时更快、更可靠。两次传递
--version(例如,pytest --version --version)保留了原始行为,同时显示 pytest 版本和插件信息。注意
由于
--version现在被提前处理,因此它仅在通过命令行直接传递时生效。如果通过其他机制设置,例如PYTEST_ADDOPTS或addopts,它将不起作用。#13823: 添加了
strict_xfail作为xfail_strict选项的别名,strict_config作为--strict-config标志的别名,以及strict_markers作为--strict-markers标志的别名。这使得所有严格性选项都具有前缀为strict_的配置选项,从而保持一致。#13700: 当给定
--quiet时,--junitxml不再在 pytest 会话结束时打印generated xml file摘要。#13732: 以前,当过滤警告时,如果过滤器引用了无法导入的类,pytest 将会失败。现在,这只会输出一条消息指示问题。
#13859: 澄清
pytest.raises()当正则表达式match失败时的错误消息。#13861: 改进了测试预期错误消息的句式结构。以前,错误消息是“预期的异常必须是
,但得到 ”。现在,它变成了“预期 ,但得到 ”。
删除和向后不兼容的破坏性更改¶
#12083: 修复了一个 bug,即
pytest a/ a/b这样的调用只会运行a/b中的测试,而不会运行a/下的其他测试。此修复涉及对处理此类重叠参数和重复项方式的一些重大更改
pytest a/b a/或pytest a/ a/b等效于pytest a;如果一个参数与另一个参数重叠,则只保留前缀。pytest x.py x.py等效于pytest x.py;以前,这样的调用被视为明确请求运行文件中的测试两次。
如果您依赖这些行为,请考虑使用 –keep-duplicates,它保留了其现有行为(包括该 bug)。
#13719: 停止支持 Python 3.9,因为它已结束生命周期。
#13766: 以前,如果定义了环境变量
$CI或$BUILD_NUMBER,pytest 就会假定它正在 CI/CD 环境中运行;现在,只有当至少一个变量被定义并设置为非空值时,CI 模式才会被激活。#13779: PytestRemovedIn9Warning 弃用警告现在默认是错误。
按照我们尽可能减少干扰地移除弃用功能的计划,所有
PytestRemovedIn9Warning类型的警告现在默认生成错误而不是警告消息。受影响的功能将在 pytest 9.1 中有效移除,因此请查阅文档中的 弃用和移除 部分,以获取有关如何更新现有代码的说明。
在 pytest
9.0.X系列中,可以通过在pytest.ini文件中添加以下内容,将错误改回警告,作为权宜之计[pytest] filterwarnings = ignore::pytest.PytestRemovedIn9Warning
但这将在 pytest
9.1发布时停止工作。如果您对某个特定功能的移除有疑虑,请在 #13779 中添加评论。
弃用(在下一个主要版本中移除)¶
#13807:
monkeypatch.syspath_prepend()现在在预置路径包含旧式命名空间包(使用pkg_resources.declare_namespace()的那些)时发出弃用警告。用户应迁移到原生命名空间包 (PEP 420)。有关详细信息,请参阅 monkeypatch.syspath_prepend 与旧式命名空间包。
Bug 修复¶
#13445: 使
pytest.skip()及其相关函数的类型注解更符合规范,以使其在更多类型检查器中工作。#13537: 修复了一个 bug,即在 teardown 中仅包含
Skipped异常的ExceptionGroup未正确处理并显示为错误。#13598: 修复了在 Windows 上涉及短路径和符号链接时可能出现的收集混乱问题。
#13716: 修复了一个 bug,即像
pytest x.py[a]这样无意义的调用(文件不能被参数化)被默默地视为pytest x.py。现在这是一个使用错误。#13722: 修复了在使用
pytest.approx()比较长度不同的映射时,令人误解的断言失败消息。#13773: 修复了静态 fixture 闭包计算,以正确考虑被覆盖的 fixture 所请求的传递依赖项。
#13816: 修复了
pytest.approx(),它现在在比较具有不同键的映射时返回更清晰的错误消息。#13849: 即使为空,隐藏的
.pytest.ini文件现在也会被视为配置文件。这与非隐藏的pytest.ini不一致。#13865: 修复了
--show-capture与--tb=line的问题。#13522: 修复了子进程模式下的
pytester忽略了除第一个pytester.plugins <pytest.Pytester.plugins> 之外的所有插件。修复了子进程模式下的
pytester静默忽略非字符串pytester.plugins的问题。现在它会报错。如果您受到此影响,请按名称指定插件,或将受影响的测试明确切换为使用pytester.runpytest_inprocess。
打包更新和下游注意事项¶
#13791:
iniconfig和packaging的最低要求分别提高到1.0.1和22.0.0。
面向贡献者的更改¶
#12244: 修复了当
TERM=dumb时自测失败的问题。#12474: 添加了计划的 GitHub Action 工作流,以在仓库文档中运行 Sphinx 链接检查。
#13621: pytest 自己的测试套件现在处理
lsof命令挂起的情况(例如由于无法访问的网络文件系统),受影响的自测将在 10 秒后跳过。#13638: 修复了
scripts/prepare-release-pr.py中已弃用的 gh pr new 命令。该脚本现在使用与 GitHub CLI v2.0+ 兼容的 gh pr create。#13695: 在
Pytester.run中刷新stdout和stderr,以避免在 CI 上test_faulthandler.py::test_timeout中截断输出 – 由 @ogrisel。#13771: 在没有符号链接支持的 Windows 环境中跳过
test_do_not_collect_symlink_siblings,以避免假阴性。#13841: 贡献 pytest 时,现在需要
tox>=4。#13625: 在
cacheprovider.py中为pytest_addoption()、pytest_configure()和cacheshow()函数添加了缺失的文档字符串。
杂项内部更改¶
#13830: 配置覆盖(
-o/--override-ini)现在在启动期间处理,而不是在config.getini()期间处理。
pytest 8.4.2 (2025-09-03)¶
Bug 修复¶
#13478: 修复了在使用
console_output_style与times且模块被跳过时发生的崩溃。#13530: 修复了在使用
pytest.approx()和设置了decimal.FloatOperation陷阱的decimal.Decimal实例时发生的崩溃。#13549: 在 Python
3.14中检查函数签名时,不再评估类型注解。这可以防止在模块未显式使用
from __future__ import annotations并在if TYPE_CHECKING:块中导入注解类型时,在模块收集过程中发生崩溃。#13559: 在
pytest.Parser.addini()的type参数的Literal类型注解中添加了缺失的int和float变体。#13563:
pytest.approx()现在仅在 NumPy 已在sys.modules中时才导入numpy。这修复了8.4.0中引入的无条件导入行为。
改进的文档¶
#13577: 澄清
pytest_generate_tests在测试模块/类中发现;其他 hook 必须在conftest.py或插件中。
面向贡献者的更改¶
pytest 8.4.1 (2025-06-17)¶
Bug 修复¶
#13461: 更正了
_pytest.terminal.TerminalReporter.isatty以支持作为方法调用。以前它只是一个布尔值,这在使用-o log_cli=true时可能会破坏正确的代码)。#13477: 重新引入了
pytest.PytestReturnNotNoneWarning,它在 pytest8.4中被意外移除。当测试函数返回非
None值时,会引发此警告,这通常是初学者犯的错误。有关更多信息,请参阅 测试函数中返回非 None 值。
#13497: 修复了与
Twisted 25+的兼容性问题。
改进的文档¶
#13492: 修复了关于
faulthandler在 Windows 上无法工作的过时警告。
pytest 8.4.0 (2025-06-02)¶
删除和向后不兼容的破坏性更改¶
弃用(在下一个主要版本中移除)¶
#10839: 请求异步 fixture 而没有解析它的
pytest_fixture_setup钩子现在会发出 DeprecationWarning。这最常发生在同步测试请求异步 fixture 时。这应该不会对大多数使用异步测试或使用异步 pytest 插件的 fixture 的用户产生影响,但可能会影响非标准钩子设置或autouse=True。有关如何解决此警告的指导,请参阅 依赖异步 fixture 的同步测试。
新功能¶
#11538: 添加了
pytest.RaisesGroup作为pytest.raises()的等价物,用于预期ExceptionGroup。还添加了pytest.RaisesExc,它现在是pytest.raises()背后的逻辑,并用作pytest.RaisesGroup的参数。RaisesGroup包括指定多个不同预期异常的能力、嵌套异常组的结构以及用于模拟 except* 的标志。有关更多信息,请参阅 关于预期异常组的断言 和文档字符串。#12504: 当您预期一个异常组时,
pytest.mark.xfail()现在接受pytest.RaisesGroup作为raises参数。如果您想利用check参数,也可以传递pytest.RaisesExc。#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: Fixture 现在在输出中清晰地表示为“fixture 对象”,而不是像以前那样作为普通函数,这使得初学者很容易发现错误,例如引用在同一模块中声明但未在测试函数中请求的 fixture。
– 由 @the-compiler 和 @glyphack
#12426: 当不指定任何 fixture 而使用 pytest.mark.usefixtures 时,现在会发出警告。以前,空的 usefixtures 标记会被默默忽略。
#12707: 在 Python 3.13+ 中,当陷入 Pdb 时,可以导航异常链。
#12736: 为 pytest 生成的 junit-xml 的根标签
testsuites添加了一个新的属性name,其固定值为"pytest tests"。此属性是许多 junit-xml 规范的一部分,甚至是 pytest 实现所基于的
junit-10.xsd规范的一部分。#12943: 如果测试因包含单个异常的异常组而失败,则现在将在简短测试摘要信息中显示包含的异常。
-
尽早设置不可引发的钩子,并尽可能晚地取消设置,以收集尽可能多的不可引发的异常。
在取消设置不可引发的钩子之前调用垃圾收集器,以收集任何零散的异常。
每个测试阶段收集多个不可引发的异常。
报告
tracemalloc分配追踪(如果可用)。避免使用基于生成器的钩子来允许在测试失败中处理
StopIteration。如果引发了
pytest.PytestUnraisableExceptionWarning异常,则将不可引发的异常报告为其原因。在不可引发的钩子中计算不可引发对象的
repr,以便在可用时获取最新信息,并应有助于对象的恢复。
#13010:
pytest.approx()现在可以比较包含数字和非数字混合的集合。-
尽早设置异常钩子,并尽可能晚地取消设置,以收集来自线程的尽可能多的未处理异常。
每个测试阶段收集多个线程异常。
报告
tracemalloc分配追踪(如果可用)。避免使用基于生成器的钩子来允许在测试失败中处理
StopIteration。如果引发了
pytest.PytestUnhandledThreadExceptionWarning异常,则将线程异常报告为其原因。在异常钩子中提取线程对象的
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=noCLI 选项禁用)。
Bug 修复¶
#10404: 尽快应用配置/cli 中的 filterwarnings,并尽可能晚地恢复它们,以便在 pytest 运行期间以及在移除不可引发和线程异常钩子之前收集警告作为错误。
这允许非常晚的警告和不可引发/线程异常使测试套件失败。
这还将 lsof 插件发出的警告从 PytestWarning 更改为新的警告 PytestFDWarning,以便更容易过滤。
#11067: 现在无论测试是因 pytest.mark.xfail 还是
pytest.fail()而 xfailed,测试报告都是一致的。以前,通过标记 xfailed 的测试会在消息前加上字符串
"reason: ",而通过函数 xfailed 的测试则没有。前缀已被移除。#12008: 在 #11220 中,由于更改了为直接参数分配索引的方式,引入了无意的重新排序。更具体地说,在该更改之前,对 metafunc 的 callspecs 的直接参数的索引是在所有参数化发生之后分配的。现在,该更改被还原。
#12863: 修复了当标记(包括 pytest.mark.parametrize)放置在
@staticmethod或@classmethod之上时,应用这些标记的问题。#12929: 正确处理测试用例、设置和拆解中的 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中使用indirect=True传递scope可能会导致其他 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: 在文档中添加了处理抽象测试类的配方。
文档中添加了一个新示例,演示如何使用混入类处理抽象测试类,而无需手动为子类设置
__test__属性。这确保了抽象测试类的子类由 pytest 自动收集。
打包更新和下游注意事项¶
#13317: 指定了
colorama、iniconfig和packaging的最低允许版本;并提升了python_version<'3.11'的exceptiongroup的最低允许版本,从发布候选版本到完整发布。
面向贡献者的更改¶
#12017: 混合内部改进
在某些测试中将格式化迁移到 f-strings。
在 JUnitXML 测试中使用类型安全结构。
将 `` MockTiming`` 移至
_pytest.timing。
—— 作者:@RonnyPfannschmidt
#12647: 修复了使用
hypothesispytest 插件运行测试套件的问题。
杂项内部更改¶
#6649: 将
TerminalReporter添加到公共 pytest API,因为它属于pytest_terminal_summaryhook 的签名。
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行为在 xfail 回溯方面与 8.0 之前相同。虽然这是一个行为更改,但它将默认行为恢复到 8.0.0 之前的行为,这最终被认为是更好的行动方案。—— 作者:@okken
#12281: 添加了对标记表达式中关键字匹配的支持。
现在可以通过标记关键字参数选择测试。支持的值是
int、(未转义的)str、bool和None。有关更多信息,请参阅 标记示例。
—— 作者:@lovetheguitar
#12567: 添加了
--no-fold-skipped命令行选项。如果设置了此选项,则短摘要中跳过的测试不再按原因分组,而是所有测试都以其 nodeid 独立打印,与其他状态相同。
—— 作者:@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 拆卸错误的问题。最初在 pytest 8.0.0 中添加,但由于 pytest-xdist 中的回归,在 8.0.2 中恢复。此回归已在 pytest-xdist 3.6.1 中修复。
#11797:
pytest.approx()现在正确处理Sequence类似对象。#12204、#12264: 修复了 pytest 8.0 中的回归问题,该问题导致当多个测试由于共享的高作用域 fixture 抛出异常而失败时,回溯会越来越长——作者:@bluetech。
还修复了 pytest 5.4 中类似回归,即收集器在设置期间抛出异常。
此修复需要内部更改,这可能会影响某些插件
FixtureDef.cached_result[2]现在是一个元组(exc, tb),而不是exc。SetupState.stack失败现在是一个元组(exc, tb),而不是exc。
#12275: 修复了遇到
abstract类(包括抽象unittest.TestCase子类)时发生的收集错误。#12328: 修复了 pytest 8.0.0 中的一个回归问题,该问题导致在某些情况下,包作用域参数化项未能正确重新排序以最小化设置/拆卸。
#12424: 修复了在重新运行使用 pytest-rerunfailures 等插件的 unittest 测试时,
assert testcase is not None断言失败导致的崩溃。在 8.2.2 中回归。#12472: 修复了在
pytest_report_teststatus钩子中使用自定义测试状态返回类别"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 引入了垃圾回收器中的一个不稳定错误,预计不会在该版本中修复,因为 3.8 已终止支持。
—— 作者:@x612skm
#12493: 变更日志草稿预览集成已重构为使用第三方扩展
sphinxcontib-towncrier。以前的仓库内脚本将变更日志预览文件放在doc/en/_changelog_towncrier_draft.rst。该文件不再在 Git 中被忽略,可能会在贡献者的开发环境中显示为未跟踪文件。为了解决这个问题,贡献者可以运行以下命令进行清理$ git clean -x -i -- doc/en/_changelog_towncrier_draft.rst
—— 作者:@webknjaz
#12498: 所有未文档化的
tox环境现在都有描述。可以通过在终端中调用tox -av在开发环境中列出它们。—— 作者:@webknjaz
#12501: 变更日志配置已更新,以引入更准确的面向受众的类别。以前有一个含义不清且广泛的
trivial变更日志片段类型。它已被删除,现在我们用contrib、misc和packaging取而代之。新的变更说明类型面向的是下游打包者和项目贡献者。此外,杂项部分保留用于不适合其他地方的未指定更新。
—— 作者:@webknjaz
#12502: GitHub 自动化更新插件列表的拉取请求的用户体验已更新。以前,维护人员必须关闭自动创建的拉取请求并重新打开它们以触发 CI 运行。从现在开始,他们只需点击
Ready for review按钮即可。—— 作者:@webknjaz
#12522:
:pull:RST 角色已被更短的:pr:替换,因为开始使用第三方 sphinx-issues Sphinx 扩展中的实现——作者:@webknjaz。#12531: 覆盖率报告配置已更新,以从覆盖率报告中排除标记为预期失败的 pytest 自己的测试。这减少了不稳定测试对最终数字的影响。
—— 作者:@webknjaz
#12533:
extlinksSphinx 扩展不再启用。它曾经声明的:bpo:角色已随之删除。BPO 本身几年前已迁移到 GitHub,可以通过使用其 GitHub issue 编号和sphinx-issues扩展实现的:issue:角色来链接相应的 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)。
错误修复¶
琐碎/内部更改¶
#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或类似方法访问测试方法的类不受影响。如果类确实这样做了,则应注意在给定
"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: 如果模块可以找到但引发了
ImportError而不是ModuleNotFoundError,pytest.importorskip()现在会发出警告。可以通过将
exc_type=ImportError传递给pytest.importorskip()来抑制警告。有关详细信息,请参阅 pytest.importorskip 关于 ImportError 的默认行为。
#11728: 对于基于
unittest的测试,在类清理期间(由使用TestCase.addClassCleanup注册的函数引发)发生的异常现在会报告,而不是静默失败。#11777: 当给出
-vv时,short test summary info部分的文本不再被截断。#12112: 改进了启用
consider_namespace_packages时的命名空间包检测,涵盖了更多情况(如可编辑安装)。#9502: 添加了
PYTEST_VERSION环境变量,该变量在 pytest 会话开始时定义,之后未定义。它包含pytest.__version__的值,除其他外,可用于轻松检查代码是否在 pytest 运行中。
错误修复¶
#12065: 修复了 pytest 8.0.0 中的一个回归问题,该问题导致包含
setup_method和使用@staticmethod或@classmethod的测试的测试类会因AttributeError: 'NoneType' object has no attribute 'setup_method'而崩溃。现在,使用
@staticmethod和@classmethod的测试的request.instance属性不再是None,而是该类的一个新实例,就像在非静态方法中一样。以前它是None,并且此类测试的所有 fixture 都将共享一个self。#12135: 修复了 fixture 多次将其终结器添加到其请求的 fixture 会在某些情况下导致不可靠和不直观的拆卸顺序的问题。
#12194: 修复了
--importmode=importlib和--doctest-modules的一个 bug,该 bug 导致子模块未作为属性出现在父模块中。#1489: 修复了一些高作用域 fixture 的拆卸未按其初始化顺序反向发生的情况。
琐碎/内部更改¶
pytest 8.1.2 (2024-04-26)¶
错误修复¶
#12114: 修复了
pytest.approx()在与numpy数组一起使用并与其他类型比较时发生的错误。
pytest 8.1.1 (2024-03-08)¶
注意
此版本并非通常的 bug 修复版本——它包含功能和改进,是 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 中的一个 bug,但我们决定在 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: 如果没有找到其他合适的配置文件候选,即使没有
[tool.pytest.ini_options]表,pyproject.toml也将被视为配置文件并定义rootdir。#11978: 为日志插件添加了
--log-file-mode选项,启用日志文件追加。此选项接受"w"或"a",默认为"w"。以前,模式是硬编码为
"w",这会在日志记录之前截断文件。#12047: 当 fixture 的多个终结器引发异常时,现在所有异常都报告为异常组。以前,只报告第一个异常。
错误修复¶
#11475: 修复了
--importmode=importlib会多次导入非测试模块的回归问题。#11904: 修复了 pytest 8.0.0 中的一个回归问题,该问题会导致在使用
--pyargs时,由于权限错误而导致测试收集失败。此更改改进了使用
--pyargs指定的测试的收集树,请参阅 #12043 以与 pytest 8.0 和 <8 进行比较。#12011: 修复了 8.0.1 中的回归,即当传递
--doctest-modules时,setup_modulexunit 样式 fixture 不执行。#12014: 修复了在警告 fixture 上使用的标记时使用的
stacklevel。#12039: 修复了
8.0.2中的回归问题,即在 Windows CI 下,使用tmp_path创建的测试被多次收集。
改进的文档¶
#11790: 更详细地文档记录了使用
tmp_pathfixture 创建的临时目录的保留。
琐碎/内部更改¶
#11785: 对可能影响访问它们的插件的私有函数进行了一些更改
FixtureManager._getautousenames()现在接受Node本身而不是 nodeid。FixtureManager.getfixturedefs()现在接受Node本身而不是 nodeid。_pytest.nodes.iterparentnodeids()函数已删除,没有替代。首选遍历节点层次结构本身。如果确实需要,请从以前的 pytest 版本复制该函数。
#12069: 将以下功能的弃用延迟到
9.0.0在发布
8.1.0后发现,关于即将删除的警告未按预期显示,因此团队决定恢复删除。这就是
8.1.0被撤回的原因。
pytest 8.1.0 (已撤回)¶
pytest 8.0.2 (2024-02-24)¶
错误修复¶
pytest 8.0.1 (2024-02-16)¶
错误修复¶
#11875: 正确处理 Python 3.13 中
getpass.getuser()的错误。#11879: 修复
ExceptionInfo._stringify_exception可能导致pytest.raises()崩溃的边缘情况。#11906: 修复
pytest.warns()使用具有多个__init__参数的自定义警告子类时的回归问题。#11907: 修复 pytest 8.0.0 中的回归问题,即在
pytest.warns()块内调用pytest.skip()和类似的控制流异常时,这些异常会被抑制而不是传播。#11929: 修复 pytest 8.0.0 中的回归问题,即模块中定义的自动使用夹具会被模块中的 doctests 忽略。
#11937: 修复 pytest 8.0.0 中的回归问题,即在某些情况下会以相反的顺序收集项。
pytest 8.0.0 (2024-01-27)¶
错误修复¶
pytest 8.0.0rc2 (2024-01-17)¶
改进¶
#11233:
-r对 xfailures 和 xpasses 的改进当设置
-rx时,报告 xfailures 的追溯。当设置
-rX时,报告 xpasses 的捕获输出。对于 xpasses,在摘要中测试名称和原因之间添加
-,以匹配 xfail 的显示方式。
#11825:
pytest_plugin_registered钩子现在有一个新的plugin_name参数,其中包含plugin注册时使用的名称。
错误修复¶
#11706: 修复了在使用
--maxfail或--stepwise时,高范围夹具中拆卸错误的报告问题。注意:此更改在 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 - 我们提及这一点以防外部代码正在使用它,即使它被标记为 private。
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现在是"";以前它是根目录名称。这与始终为""的session.nodeid匹配。现在,收集树包含直到 根目录 的目录/包,对于在根目录中找到的初始参数。对于根目录之外的文件,只收集直接目录/包 – 但请注意,不鼓励从根目录之外进行收集。
例如,给定以下文件系统树
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,而不管type是什么。如果既未提供
default也未提供type,则假定type=str并返回""作为默认值(这与以前的行为一致)。
团队决定不对这项更改引入弃用期,因为这样做在与社区沟通和实施方面都会很复杂,而且团队认为这项更改不会破坏现有插件,除非在极少数情况下。
#11667: pytest 的
setup.py文件已移除。如果您依赖此文件(例如,使用setup.py install安装 pytest),请参阅 Why you shouldn’t invoke setup.py directly 以获取替代方案。#9288:
warns()现在在上下文关闭时重新发出未匹配的警告 – 以前它会消耗所有警告,隐藏那些未被函数匹配的警告。虽然这是一个新功能,但我们将其作为一项重大更改发布,因为许多测试套件配置为在出现警告时出错,因此将在新重新发出的警告上失败。
内部的
FixtureManager.getfixtureclosure方法已更改。使用此方法或继承FixtureManager并覆盖该方法的插件需要适应此更改。
弃用¶
#10465: 返回非
None值的测试函数现在将发出pytest.PytestWarning而不是pytest.PytestRemovedIn8Warning,这意味着这将来仍将是一个警告而不是错误。#3664: 对夹具函数应用标记现在会发出警告:夹具中的标记从未有任何效果,但对夹具应用标记(例如
usefixtures)并期望它工作是常见的用户错误。这将在 pytest 9.0 中成为一个错误。
功能与改进¶
改进的差异显示¶
这些更改改进了 pytest 在断言失败时打印的差异显示。请注意,语法高亮需要 pygments 包。
#11520: 现在,非常详细(
-vv)的差异输出以差异的形式着色,而不是一大块红色。错误报告中的 Python 代码现在以 Python 语法高亮显示。
错误报告中的部分现在更好地分离。
#1531: 针对每个标准库容器类型的非常详细的差异(
-vv)得到了改进。缩进现在保持一致,并且标记位于各自的独立行,这应该会减少向用户显示的差异。以前,使用标准的 Python 漂亮打印机生成输出,它将开闭标记放在与第一个/最后一个条目相同的行上,并且没有一致的缩进。
#10617: 为除相等
==之外的比较添加了更全面的集合断言重写,现在以下操作提供了更好的失败消息:!=、<=、>=、<和>。
断言冗余的独立控制¶
#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 设置夹具内部被跳过,则测试摘要现在显示测试位置而不是夹具位置。
#11314: 使用
--log-file选项记录到文件时,如果未分别提供--log-file-level、--log-file-format和--log-file-date-format,则将使用--log-level、--log-format和--log-date-format作为回退。#11610: 添加了
LogCaptureFixture.filtering()上下文管理器,它向caplog夹具添加给定的logging.Filter对象。#11447:
pytest.deprecated_call()现在也考虑FutureWarning类型的警告。#11600: 改进了
pytest.mark.xfail的condition参数的文档和类型签名,以使用False作为默认值。#7469:
FixtureDef现在被导出为pytest.FixtureDef,用于类型化。#11353: 为
PytestPluginManager添加了类型提示。
错误修复¶
#10701:
pytest.WarningsRecorder.pop()将返回列表中最匹配的警告,而不是请求类型的第一个警告实例。#11255: 修复了在没有包的情况下
parametrize(..., scope="package")崩溃的问题。#11277: 修复了一个错误,当一个间接参数有多个夹具时,会选择范围最广的夹具的范围作为参数集,而不是范围最窄的夹具。
#11456: 参数化测试现在*真正*确保赋予每个输入的 ID 是唯一的——例如,
a, a, a0现在会得到a1, a2, a0,而不是以前(有 bug 的)a0, a1, a0。这必然意味着更改以前发生冲突的节点 ID,并且为了可读性,当非唯一 ID 以数字结尾时,会添加一个下划线。#11563: 修复了对相同的参数化值多次使用空字符串时发生的崩溃。
#11712: 修复了
NO_COLOR和FORCE_COLOR的处理,使其忽略空值。#9036: 当
with块内部引发异常时,pytest.warns和类似函数现在会捕获警告。
改进文档¶
琐碎/内部更改¶
#11208: (内部)
FixtureDef.cached_result类型已更改。现在,当设置时,第三项cached_result[2]是一个异常实例而不是异常三元组。#11218: (此条目旨在帮助访问私有 pytest 内部以实例化
FixtureRequest对象的插件。)FixtureRequest现在是一个抽象类,不能直接实例化。已添加一个新的具体TopRequest子类作为FixtureRequest的子类,用于测试函数中的request夹具,作为夹具函数中现有SubRequest子类的对应物。#11315:
pytester夹具现在使用monkeypatch夹具来管理当前工作目录。如果您将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 上文件顶部非字符串常量被检测为 docstring 的问题。
#11572: 处理了在 故障处理程序 拆卸时
sys.stderr和sys.__stderr__可能已关闭的边缘情况。#11710: 修复了收集错误中的回溯未被剪枝的问题。
#7966: 移除了断言重写机制中当
__iter__方法中引发异常时无用的错误消息。现在它们被视为不可迭代。
改进文档¶
#11091: 更新了文档,以提及带连字符的选项:将
--junitxml替换为--junit-xml,将--collectonly替换为--collect-only。
pytest 7.4.3 (2023-10-24)¶
错误修复¶
#10447: 现在按反向 mro 顺序考虑标记,以确保首先考虑基类标记——这解决了回归问题。
#11239: 修复了断言中
:=影响无关测试用例的问题。#11439: 处理了在 故障处理程序 拆卸时
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钩子文档中的不一致问题。#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实现。很可能,您的钩子对于不想忽略的路径返回False,这会终止处理并且不允许其他插件(包括 pytest 本身)忽略该路径。修复方法是对于您的钩子不想忽略的路径返回None而不是False。#8711: 如果
level被logging.disable(LEVEL)全局禁用,caplog.set_level()和caplog.at_level()将临时启用请求的level。
错误修复¶
#10831: 终端报告:修复了在
--tb=line模式下运行时的错误,即pytest.fail(pytrace=False)测试报告None。#11068: 修复了
--last-failed针对 非 Python 测试文件 的整个文件跳过功能(“跳过 N 个文件”)。#11104: 修复了 pytest 7.3.2 中的回归问题,该问题导致
testpaths被考虑用于加载初始 conftests,即使它未被使用(例如,当在命令行上给出明确路径时)。现在只有在使用时才考虑testpaths。#1904: 修复了使用
__tracebackhide__ = True隐藏的跟踪条目仍然显示在链式异常中(“... the above exception ...”消息之后的部分)。#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错误的 bug。#10894: 支持 Python 3.12(撰写本文时为测试版)。
#10999:
monkeypatchsetitem/delitem类型注释现在允许TypedDict参数。#11028: 修复了断言重写中的一个 bug,即使用海象运算符赋值的变量不能在函数调用中后续使用。
#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-disableCLI 选项,用于禁用单个记录器。#8141: 添加了
tmp_path_retention_count和tmp_path_retention_policy配置选项,以控制tmp_path夹具创建的目录的保留方式。
改进¶
#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: 如果截断消息比隐藏文本长,测试的完整输出不再被截断。显示的行号也已修复。
错误修复¶
改进文档¶
琐碎/内部更改¶
pytest 7.2.2 (2023-03-03)¶
错误修复¶
#10533: 修复了
pytest.approx()处理包含一个或多个0.0值的字典的问题。#10592: 修复了同时传递
--cache-show和--help时崩溃的问题。#10597: 修复了名为
teardown的 fixture 方法会作为noseteardown 阶段的一部分被调用的 bug。#10626: 修复了同时传递
--fixtures和--help时崩溃的问题。#10660: 修复了
pytest.raises()返回一个“ContextManager”,以便类型检查器可以将pytest.raises(...) if ... else nullcontext()缩小到“ContextManager”而不是“object”。
改进的文档¶
pytest 7.2.1 (2023-01-13)¶
错误修复¶
pytest 7.2.0 (2022-10-23)¶
弃用¶
#10012: 更新
pytest.PytestUnhandledCoroutineWarning为弃用;它将在 pytest 8 中引发错误。#10396: pytest 不再依赖
py库。pytest提供了py.error和py.path模块的打包副本,但如果安装了py库,它将使用该库。如果您需要其他py.*模块,请继续单独安装已弃用的py库,否则通常可以将其作为依赖项删除。#4562: 弃用使用属性/标记配置 hook specs/impls。
改为使用
pytest.hookimpl()和pytest.hookspec()。有关更多详细信息,请参阅文档。#9886: 为
nose编写的测试的运行功能已正式弃用。这包括
普通的
setup和teardown函数和方法:这可能会让用户感到惊讶,因为setup()和teardown()不是 pytest 惯用语,而是nose支持的一部分。使用 @with_setup 装饰器进行 setup/teardown。
有关更多详细信息,请查阅弃用文档。
#7337: 如果测试函数返回
None以外的值,现在会发出弃用警告。这可以防止初学者常见的错误,他们期望返回bool(例如return foo(a, b) == result)会导致测试通过或失败,而不是使用assert。计划是未来将测试返回非None视为错误。
特性¶
#9897: 为
testpaths添加了 shell 风格的通配符支持。
改进¶
#10218:
@pytest.mark.parametrize()(以及类似的函数)现在接受任何Sequence[str]作为参数名称,而不仅仅是list[str]和tuple[str, ...]。(请注意,
str本身是一个Sequence[str],仍然像以前一样被视为逗号分隔的名称列表)。#10381: 添加了
--no-showlocals标志。这可以直接传递给测试以覆盖通过addopts声明的--showlocals。#3426: NFC 和 NFD 形式的字符串断言失败,如果规范化为相同的字符串,现在会有专门的错误消息详细说明问题,并显示其 utf-8 表示。
#8508: 引入了通过
pytest.warns()匹配警告的多行显示,并增强了pytest.ExceptionInfo.match()(由pytest.raises()返回)的匹配比较。#8646: 改进
pytest.raises()。以前传递空元组会给出令人困惑的错误。我们现在立即抛出更具帮助性的消息。#9741: 在 Python 3.11 上,使用标准库的
tomllib解析 TOML。tomli不再是 Python 3.11 的依赖项。#9742: 使用
-vv显示不带转义换行符的断言消息。#9823: 改进了找不到给定文件的收集器时显示的错误消息。
#9873: 短测试摘要中添加了一些颜色。
#9883: 标准化所有命令行选项的帮助描述。
#9920: 在 CI 环境中运行时,在
short test summary info中显示完整的崩溃消息。#9987: 通过允许
.pytest.ini作为pytest.ini的替代品,增加了对隐藏配置文件 的支持。
错误修复¶
#10382: 当
raise unittest.SkipTest()出现在文件顶层时,不要中断到 pdb。#7792: 标记现在根据测试类中的完整 MRO 继承。以前,如果一个测试类继承自两个或多个类,只有第一个超类的标记才会应用。
从超类继承标记时,子类的标记现在按 MRO 顺序排列在超类标记之前。以前是相反的。
从超类继承标记时,子类的
pytestmark属性现在只包含直接应用于它的标记。以前,它也包含其超类的标记。请注意,通常不应直接访问此属性;应改用Node.iter_markers。#9159: 即使使用
--tb=native以外的显示选项,也通过在ExceptionGroups中强制本机显示来显示内部异常。这是在ExceptionGroups中完全实现 pytest 原生内部异常显示之前的临时步骤。#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)¶
错误修复¶
改进的文档¶
琐碎/内部更改¶
#10114: 在 Windows 上将 atomicwrites 依赖项替换为
os.replace。
pytest 7.1.2 (2022-04-23)¶
错误修复¶
#9726: 移除了
pytest.approx()中不必要的numpy导入。#9820: 修复了
dataclasses与InitVar的比较。#9869: 增加了
NODE_CTOR_FSPATH_ARG弃用的stacklevel以指向用户的代码,而不是 pytest。#9871: 修复了一个奇怪(幸好罕见)的错误,即
temp_pathfixture 在尝试获取当前用户的用户名时可能会引发内部错误。
pytest 7.1.1 (2022-03-17)¶
错误修复¶
#9767: 修复了 pytest 7.1.0 中的一个回归错误,即源树外部的一些 conftest.py 文件(例如,在
site-packages目录中)未被拾取。
pytest 7.1.0 (2022-03-13)¶
破坏性变更¶
#8838: 根据我们的政策,以下功能已在 6.X 系列中弃用,现已移除
pytest._fillfuncargs函数。pytest_warning_captured钩子 - 改用pytest_warning_recorded。-k -foobar语法 - 改用-k 'not foobar'。-k foobar:语法。pytest.collect模块 - 直接从pytest导入。
有关更多信息,请查阅文档中的 Deprecations and Removals。
改进¶
#5192: 修复了某些数据类型的测试输出,其中
-v会显示较少的信息。此外,在显示序列的差异时,
-q会产生完整的差异,而不是预期的差异。#9362: pytest 现在避免在检测到
attrs或dataclasses中默认__eq__被覆盖时进行专门的断言格式化。#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现在请求一个monkeypatchfixture,而不是在内部创建一个。这解决了涉及 pytest 环境变量的测试的一些问题。#9730: 格式错误的
pyproject.toml文件现在会产生更清晰的错误消息。
pytest 7.0.1 (2022-02-11)¶
错误修复¶
#9608: 修复 Python 3.9 中
importlib.readers的无效导入。#9610: 恢复
UnitTestFunction.obj返回未绑定方法而不是绑定方法。修复了 unittest TestCases 中非默认__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.Config.inifile在pytest_cmdline_main钩子期间可用(在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参数已被弃用。有关详细信息,请参阅弃用说明。节点构造函数的
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(例如File)的自定义 pytest 节点类型现在会发出警告。它从未得到合理的官方支持,并会触发难以调试的错误。有关详细信息,请参阅弃用说明。
#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用于从pytest.raises()返回并传递给各种钩子的ExceptionInfo类型。pytest.Parser用于传递给pytest_addoption钩子的Parser类型。pytest.OptionGroup用于从parser.addgroup方法返回的OptionGroup类型。pytest.HookRecorder用于从Pytester返回的HookRecorder类型。pytest.RecordedHookCall用于从HookRecorder返回的RecordedHookCall类型。pytest.LineMatcher用于RunResult和其他类型中使用的LineMatcher类型。pytest.TestReport用于各种钩子中使用的TestReport类型。pytest.CollectReport用于各种钩子中使用的CollectReport类型。
直接构造它们大多数不被支持;它们仅用于类型注解。这样做会发出弃用警告,并且在 pytest 8.0 中可能会成为硬性错误。
子类化它们也不受支持。这目前在运行时没有强制执行,但会被类型检查器(如 mypy)检测到。
#7856: –import-mode=importlib 现在适用于依赖于模块在
sys.modules中的功能,例如pickle和dataclasses。#8144: 以下钩子现在接收一个额外的
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。旧的fspath和这个新属性都会被设置,无论path还是fspath(已弃用)传递给构造函数。它是fspath属性(它表示与py.path.local相同的路径)的替代。虽然fspath由于reportinfo()等方法的持续迁移尚未弃用,但我们预计在未来的版本中弃用它。#8421:
pytest.approx()现在适用于映射/字典和序列/列表中的Decimal。#8606: 使用
--fixtures-per-test和--fixtures调用 pytest 时,已增加以下内容夹具位置路径与夹具名称一起打印。
夹具 docstring 的第一部分打印在夹具名称下方。
在 fixture 名称下使用
--verbose选项打印整个 fixture 的 docstring。
#8761: 新增 pytest.version_tuple 属性,使用户可以更简单地根据 pytest 版本执行操作(例如声明在后续版本中引入的钩子)。
#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中显示 fixture 路径时,来自 pytest 本身的 fixture 现在显示省略路径,而不是site-packages目录中文件的完整路径。#8898: 在生成参数化 ID 时,复数现在像浮点数和整数一样处理。
#9062:
--stepwise-skip现在隐式启用--stepwise,并且可以单独使用。#9205:
pytest.Cache.set()现在在保存字典时保留键的顺序。
Bug 修复¶
#7124: 修复了提供
--doctest-modules时,__main__.py会引发ImportError的问题。#8061: 修复了如果静态方法测试用例继承自父测试类,它们会失败的问题。
#8192:
testdir.makefile现在默默地接受不以.开头的值,以保持与旧版本 pytest 的向后兼容性。pytester.makefile现在在ext参数中缺少.时会发出更清晰的错误。#8258: 修复了 pytest 的
faulthandler支持在 pytest 启动期间(例如使用python -X dev -m pytest)已经启用faulthandler模块时,无法在崩溃时转储回溯的问题。#8317: 修复了从
getpass.getuser()派生出的非法目录字符引发OSError的问题。#8367: 修复
Class.from_parent以便它将额外的关键字参数转发给构造函数。#8377: 测试选择选项
pytest -k和pytest -m现在支持匹配包含正斜杠 (/) 字符的名称。#8384:
@pytest.mark.skip装饰器现在正确处理其参数。当reason参数意外地同时作为位置参数和关键字参数给出时(例如,因为它与skipif混淆),现在会发生TypeError。以前,此类测试会被静默跳过,并且位置参数会被忽略。此外,reason现在被正确地记录为位置参数或关键字参数(而不是仅限关键字)。#8394: 对处理经典 setup/teardown 的内部 fixture 使用私有名称,以便它们在默认的
--fixtures调用中不显示(但它们仍会在--fixtures -v中显示)。#8456: 当安装了插件的预发行版本时,
required_plugins配置选项现在可以正常工作,而不是错误地声称这些插件根本没有安装。#8464:
-c <config file>现在也将rootdir正确定义为包含<config file>的目录。#8503: 当
setuptools未安装时,pytest.MonkeyPatch.syspath_prepend()不再失败。它现在只在pkg_resources之前被导入时才调用pkg_resources.fixup_namespace_packages,因为否则不需要它。#8548: 引入修复以处理
log-cli-format中的精度宽度,从而修复某些格式的输出着色。#8796: 修复了跳过 doctest 时的内部错误。
#8983: 测试选择选项
pytest -k和pytest -m现在支持匹配包含反斜杠 (\) 字符的名称。反斜杠被视为字面字符,而不是转义字符(要匹配的值已经被转义)。#8990: 修复了
pytest -vv在某些情况下因内部异常AttributeError: 'str' object has no attribute 'relative_to'而崩溃的问题。#9077: 修复了从会话范围的 fixture 访问
request.fspath/request.path时出现的令人困惑的错误消息。#9163: 重写后的 assert 语句的结束行号和结束列偏移量现在已正确设置。
#9169: 支持在重写文件中使用
importlib.resources的filesAPI。#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 配置升级为使用具有更好 Unicode 支持的 PDF 文档的
较新 Ubuntu 版本 <https://blog.readthedocs.com/new-build-specification/>`__。#9341: 各种常用于 使用非 Python 测试 的方法现在在参考文档中得到了正确记录。它们以前没有文档。
琐碎/内部更改¶
#8133: 迁移到
setuptools_scm6.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 制品的命令:使用构建包而不是 setup.py。
#9351: 修正了 doc/en/example/special.rst 中细微的错别字。
pytest 6.2.5 (2021-08-29)¶
琐碎/内部更改¶
pytest 6.2.4 (2021-05-04)¶
Bug 修复¶
#8539: 修复了 Python 3.10 上的断言重写问题。
pytest 6.2.3 (2021-04-03)¶
Bug 修复¶
#8414: pytest 曾经在
/tmp下创建具有世界可读权限的目录。这意味着系统中的任何用户都能够读取测试在临时目录中写入的信息(例如由tmp_path/tmpdirfixture 创建的目录)。现在,这些目录以私有权限创建。pytest 曾经会默默地使用一个预先存在的
/tmp/pytest-of-<username>目录,即使它由另一个用户拥有。这意味着另一个用户可以预先创建这样的目录并控制另一个用户的临时目录。现在,这种情况会导致错误。
pytest 6.2.2 (2021-01-25)¶
Bug 修复¶
pytest 6.2.1 (2020-12-15)¶
Bug 修复¶
#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: 新增
pytesterfixture,它与testdir相同,但其方法在适当的时候返回pathlib.Path而不是py.path.local。这是内部使用
pathlib.Path对象的一部分,以便将来移除对py的依赖。在内部,旧的
pytest.Testdir现在是Pytester的一个薄包装器,保留了旧的接口。#7695: 添加了一个新的钩子
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(),以防无法使用monkeypatchfixture。以前有些用户从私有_pytest.monkeypatch.MonkeyPatch命名空间导入它。此外,
MonkeyPatch.context现在是一个类方法,可以作为with MonkeyPatch.context() as mp: ...使用。这是直接使用MonkeyPatch的推荐方式,因为与monkeypatchfixture 不同,直接创建的实例不会自动undo()。
改进¶
#1265: 为从
pytester.run_pytest().stdout等返回的LineMatcher类添加了__str__实现。它返回整个输出,就像现有的str()方法一样。#2044: 详细模式现在会在“SKIPPED”、“XFAIL”或“XPASS”之后,在测试的终端行中显示测试被跳过的原因。
#7469 内置 pytest fixture 的类型现在被导出,以便它们可以在测试函数的类型注释中使用。新导出的类型是
fixture
request的pytest.FixtureRequest。fixture
cache的pytest.Cache。fixture
capfdbinary和capsysbinary的pytest.CaptureFixture[bytes]。fixture
caplog的pytest.LogCaptureFixture。fixture
pytester的pytest.Pytester。fixture
testdir的pytest.Testdir。fixture
tmpdir_factory的pytest.TempdirFactory。fixture
tmp_path_factory的pytest.TempPathFactory。fixture
monkeypatch的pytest.MonkeyPatch。fixture
recwarn的pytest.WarningsRecorder。
不支持构造它们(除了
MonkeyPatch);它们仅用于类型注释。这样做会发出弃用警告,并且在 pytest 8.0 中可能会成为硬错误。子类化它们也不受支持。这目前在运行时没有强制执行,但会被类型检查器(如 mypy)检测到。
#7527: 当相同类型的
namedtuple实例之间比较失败时,pytest 现在显示不同的字段名称(可能嵌套),而不是它们的索引。#7615:
Node.warn现在允许任何Warning的子类,而不仅仅是PytestWarning。#7701: 改进了使用
--collected-only时的报告。它现在将在摘要统计中显示收集到的测试数量。#7710: 在
pytest.approx()中,对非数字类型使用严格相等比较,而不是引发TypeError。这是 3.7 之前未记录的行为,但现在正式成为支持的特性。
#7938: 新增
--sw-skip参数,它是--stepwise-skip的简写。#8023: 将
'node_modules'添加到norecursedirs的默认值。#8032:
doClassCleanups(在 Python 3.8 的unittest中引入)现在被适当地调用。
Bug 修复¶
#4824: 修复了使用 autouse fixture 和 xunit fixture 收集项目时的二次行为并提高了性能。
#7758: 修复了 pytest 5.4.0 中引入的一个问题,即包中的某些文件会从
--lf中丢失,即使它们包含失败的测试。#7911: 由
tmp_path和tmpdir创建的目录现在在 3 天内未修改后被视为过期(之前的值是 3 小时),以避免删除长时间运行的测试套件中仍在使用的目录。#7913: 修复了
pytester.spawn在涉及readline模块时崩溃或挂起的问题。#7951: 修复了收集测试时处理递归符号链接的问题。
#7981: 修复了在收集过程中未跟随符号链接目录的问题。该问题在 pytest 6.1.0 中回归。
#8016: 修复了使用
pytest --doctest-modules path/to/an/__init__.py时,只收集一个 doctest 的问题。
改进的文档¶
琐碎/内部更改¶
pytest 6.1.2 (2020-10-28)¶
Bug 修复¶
改进的文档¶
#7815: 改进了
pytest._fillfuncargs()的弃用警告消息。
pytest 6.1.1 (2020-10-03)¶
Bug 修复¶
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的特殊语法-k '-expr'已弃用。请改用-k 'not expr'。-k的特殊语法-k 'expr:'已弃用。如果您使用此功能并需要替代品,请提出一个问题。#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: 将空
help值传递给Parser.add_option现在被接受,而不是在运行pytest --help时崩溃。传递None会引发更具信息性的TypeError。#7558: 修复了 pylint 在
pytest.mark.parametrize()和其他内置标记(skip、skipif、xfail、usefixtures、filterwarnings)上出现的not-callablelint 问题。#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-fileCLI 选项和log_fileini 标记现在在需要时创建子目录。#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 中引入的用于当前目录和收集期间解析符号链接是一个错误修复,但它实际上是一个新功能,在 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_printini 选项。请改用--show-capture。#7226: 从
pytest.Function.__init__中移除了未使用的args参数。#7418: 移除了
pytest_doctest_prepare_content钩子规范。pytest 至少 10 年没有触发此钩子。#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命令现在会抑制当pytest的输出被管道传输且管道被接收程序关闭时(常见的例子是less和head)打印到 stderr 的BrokenPipeError错误消息。#4391: 提高了测试持续时间测量的精度。
CallInfo项目现在有一个新的<CallInfo>.duration属性,使用time.perf_counter()创建。此属性用于填充<TestReport>.duration属性,它比以前的<CallInfo>.stop - <CallInfo>.start更准确(因为这些基于time.time())。#4675: 数据类和
attrs类的富比较现在是递归的。#6285: 暴露了
pytest.FixtureLookupError异常,当request.getfixturevalue()(其中request是一个FixtureRequestfixture)无法返回给定名称的 fixture 时会引发该异常。#6433: 如果在日志调用中格式化消息时遇到错误,例如
logging.warning("oh no!: %s: %s", "first")(缺少第二个参数),pytest 现在会传播该错误,这可能会导致测试失败。以前,这种错误会导致错误打印到 stderr,这对于通过的测试默认不显示。此更改使测试期间的错误可见。
您可以通过设置
logging.raiseExceptions = False暂时或永久抑制此行为。#6817: 命令行选项帮助文本中的显式换行符得以保留,这使得插件能够更好地控制向用户显示的帮助。
#6940: 当使用
--duration选项时,终端消息输出现在对隐藏项的数量和持续时间更加精确。#6991: 收集的文件在任何钩子报告(例如
--lf的状态)之后显示。#7091: 当通过
--capture=fd或capfd和capfdbinaryfixtures 使用fd捕获,并且文件描述符(0、1、2)无法复制时,FD 捕获仍会执行。以前,在这种情况下,直接写入文件描述符会失败或丢失。#7119: 如果
--basetemp参数为空、是当前工作目录或其父目录之一,则以错误退出。这样做是为了防止意外数据丢失,因为传递给此参数的任何目录都将被清除。#7128:
pytest --version现在只显示 pytest 版本,而pytest --version --version则显示更详细的信息,包括插件。这与其他工具显示--version的方式更加一致。#7133:
caplog.set_level()现在将覆盖通过 CLI 或配置文件设置的任何log_level。#7159:
caplog.set_level()和caplog.at_level()不再影响“捕获的日志报告”部分中显示的日志级别。#7348: 改进了数据类/属性上的比较断言的递归差异报告。
#7385:
--junitxml现在在 setup 和 teardown 期间的失败,在messageXML 属性中包含异常原因。以前
<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的所有参数都必须在函数签名中显式定义。最初更改的目的是消除预期为非预期/令人惊讶的行为,但事实证明许多人依赖它,因此该限制已被恢复。
#6910: 修复了使用
--reportlog选项时插件返回未知统计信息导致崩溃的问题。#6924: 确保
unittest.IsolatedAsyncioTestCase确实被等待。#6925: 修复
TerminalRepr实例,使其再次可哈希。#6947: 修复了使用
unittest.TestCase.addCleanup()注册的函数在测试失败时未被调用的回归问题。#6951: 允许用户仍设置已弃用的
TerminalReporter.writer属性。#6956: 防止 pytest 将
ConftestImportFailure追溯打印到标准输出。#6991: 修复了 pytest 5.4 以来
--lf过滤过多导致的回归问题。#6992: 撤销“tmpdir: clean up indirection via config for factories”#6767,因为它会破坏 pytest-xdist。
#7061: 当 yielding fixture 无法 yield 值时,报告测试 setup 错误而不是崩溃。
#7076: SKIPPED 报告中被
@pytest.mark.skip跳过的文件路径现在是相对于调用目录的。以前是相对于根目录的。#7110: 修复了回归问题:
asyncbase.TestCase测试现在可以再次正确执行。#7126: 当 Python 使用
-bb标志调用时,--setup-show在字节值用作parametrize参数时不会再引发错误。#7143: 修复
pytest.File.from_parent,使其将额外的关键字参数转发给构造函数。#7145: 具有损坏的
__getattribute__方法的类在失败时会正确显示。#7150: 防止在引发
ConfTestImportFailure时隐藏底层异常。#7180: 修复了与 locale 编码不同的文件的
_is_setup_py。#7215: 修复了当使用
--pdb运行时,对于跳过的测试会调用unittest.TestCase.tearDown()的回归问题。#7253: 当直接在函数上使用
pytest.fixture时,例如pytest.fixture(func),如果同时传递了autouse或params参数,函数不再被忽略,而是被标记为 fixture。#7360: 修复了在极少数情况下,当使用完全相同的字符串但引用不同的全局值时,传递给
pytest.mark.skipif和pytest.mark.xfail的字符串表达式可能评估不正确的问题。#7383: 修复了整个代码库中的异常原因,即在包装异常时使用
raise new_exception from old_exception。
改进的文档¶
琐碎/内部更改¶
pytest 5.4.3 (2020-06-02)¶
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: 修复了与 locale 编码不同的文件的
_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 已经超过 10 年没有调用过它。
#6673: 错误差异中“+/-”的含义颠倒/修复了。“-”表示结果中缺少预期的内容,“+”表示结果中存在意外的额外内容。
#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关系。作为此更改的一部分,会话/配置参数已被禁止,并且随着我们深入研究细节,我们可能还需要禁止更多参数。
如果子类打算扩展
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:
testdirfixture 遵循monkeypatchfixture 为内部运行设置的环境配置。#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现在适用于单元测试。#4445: 修复了 pytest 生成的一些警告报告,使其指向用户代码中警告的正确位置。
#5301: 修复
--last-failed以从已知失败的文件中收集新测试。#5928: 在用户代码级别报告
PytestUnknownMarkWarning,而不是pytest级别。#5991: 修复了
--pdb和单元测试的交互:不使用 unittest 的TestCase.debug()。#6334: 修复了在
-r命令行选项中同时使用f/F和s/S报告字符时(例如-rFf)摘要条目出现两次的问题。大写变体从未被记录,首选形式应为小写。
#6409: 对于没有先前通过的非最后一个项目,带有彩色终端进度指示器时回退到绿色(而不是黄色)。
#6454:
--disable-warnings适用于-ra和-rA。#6497: 修复了 fixture 中请求键与缓存键比较的错误。
构造
if key == cached_key:可能会失败,原因要么是明确禁止==,要么是(例如 NumPy 数组)a == b的结果通常无法转换为bool。已实现的修复将==替换为is。#6557: 使捕获的输出流
.write()方法返回与原始流相同的返回值。#6566: 修复
EncodedFile.writelines以调用底层缓冲区的writelines方法。#6575: 修复了当
faulthandler启动时已初始化(例如设置了PYTHONFAULTHANDLER=1环境变量)并且配置文件中定义了faulthandler_timeout时发生的内部崩溃。#6597: 修复包含参数化空字符串变量的节点 ID。
#6646: 为当前项目(重新)存储断言重写钩子,这修复了它们在例如 pytester 的
testdir.runpytest等之后仍被使用的问题。#6660:
pytest.exit()在从pytest_sessionfinish钩子发出时得到处理。这包括从调试器中退出。#6752: 当
pytest.raises()作为函数使用时(而不是上下文管理器),现在会通过match关键字参数传递给被测试函数。以前它会被吞噬和忽略(pytest 5.1.0 中的回归)。#6801: 在 doctests 中对于意外异常的追溯之间不显示空行。
#6802:
testdir fixture现在可以在 doctests 中使用。
改进的文档¶
琐碎/内部更改¶
#6404: 移除对 Python 3.9 中已弃用的
parser模块的使用。
pytest 5.3.5 (2020-01-29)¶
Bug 修复¶
#6517: 修复了 pytest 5.3.4 中由于断言错误导致的 INTERNALERROR 回归问题。
pytest 5.3.4 (2020-01-20)¶
Bug 修复¶
pytest 5.3.3 (2020-01-16)¶
Bug 修复¶
#2780: 使用
-rP时显示 teardown 期间捕获的输出。#5971: 修复了处理
multiprocessing模块创建的子进程中引发的异常时pytest-xdist崩溃的问题。#6436:
FixtureDef对象现在会正确地向在其之前执行的 fixture 栈中的 autouse 和参数化 fixture 注册其终结器,以便它们在正确的时间和顺序被销毁。#6532: 修复了使用
testdir结果解析包含多个错误的输出(5.3.0 中的回归)。
琐碎/内部更改¶
#6350: 优化了测试参数 ID 的自动重命名。
pytest 5.3.2 (2019-12-13)¶
改进¶
#4639: 撤销“现在当对
None进行断言时会发出警告”。该警告被证明不如最初预期有用,并且存在相当多的误报情况。
Bug 修复¶
pytest 5.3.1 (2019-11-25)¶
改进¶
#6231: 改进了对 pytest.mark.parametrize 拼写错误的检查。
#6257: 处理通过
pytest_internalerror使用的pytest.exit(),例如从事后调试器中退出。
Bug 修复¶
#5914: pytester: 修复了在正向匹配后使用
no_fnmatch_line()的问题。#6082: 修复了
property文档字符串中 doctest 样本的行检测问题,作为对 python/cpython#61648 的变通方案。#6254: 修复了与 pytest-parallel 的兼容性(pytest 5.3.0 中的回归)。
#6255: 通过删除而不是设置为
None来清除sys.last_traceback、sys.last_type和sys.last_value属性。这更好地匹配了 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:
ExceptionInfo对象的repr已改进,以遵守底层异常的__repr__方法。#5936: 使用
-vv显示未截断的断言消息。#5990: 修复了测试摘要中的单复数不匹配问题(例如,显示“1 error”而不是“1 errors”)。
#6008:
Config.InvocationParams.args现在始终是一个tuple,以更好地传达它应该不可变并避免意外修改。#6023:
pytest.main现在返回一个pytest.ExitCode实例,除非使用了自定义退出代码(在这种情况下它仍然返回int)。#6026: 对齐 pytester 的
LineMatcher输出中的前缀。#6059: 收集错误在终端的简短测试摘要中报告为错误(而不是像以前那样报告为失败)。
#6069:
pytester.spawn不再无条件地跳过/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的鲁棒性和性能。
Bug 修复¶
#2049: 修复了
--setup-plan显示 fixture 生命周期不准确信息的问题。#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: 修复了在插件类中定义的函数范围 fixture 中的
self引用:以前self会引用一个 测试 类,而不是 插件 类。#570: 修复了长期存在的问题,即在参数化期间使用间接 fixture 时未遵守 fixture 范围。
#5782: 修复了打印来自
--pastebin的错误响应时的解码错误。#5786: 测试和收集报告中的链式异常现在已正确序列化,允许
pytest-xdist等插件正确显示它们。#5792: Windows: 修复了在某些情况下加载
conftest.py时出现的错误,即工作目录的大小写与文件系统中存储的大小写不同时(例如,c:\test而不是C:\test)。
pytest 5.1.1 (2019-08-20)¶
错误修复¶
#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现在是 fixture 的保留名称。
有关更多信息,请查阅文档中的 弃用和移除 部分。
#5565: 移除了对 unittest2 的未使用支持代码。
自 Python 3.3+ 起,
unittest2后向移植模块不再是必需的,并且 pytest 中支持它的少量代码似乎也未使用:移除后,所有测试仍然不变地通过。尽管我们的政策是在移除任何功能或第三方库支持之前引入弃用期,但由于此代码显然根本没有使用(即使
unittest2被 pytest 执行的测试套件使用),因此决定在此版本中将其移除。如果您因此遇到回归问题,请提交问题。
#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不会删除包含只读文件的目录的问题,这可能导致 pytest 在第二次使用--basetemp选项执行时崩溃。#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的文档字符串。
琐碎/内部更改¶
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认为它明确时,但这可能由于插件选项的延迟解析而导致不正确。例如,请参见问题 #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 版本,以避免陈旧的缓存。#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 中引入的错误,该错误导致在将超过 2 个位置参数传递给
pytest.mark.parametrize时出现收集错误。#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 块分支。修复方法是在 if 块级联之前设置
letter的初始值,以便它始终具有一个值。
pytest 4.6.10 (2020-05-08)¶
功能¶
琐碎/内部更改¶
#6404: 移除对 Python 3.9 中已弃用的
parser模块的使用。
pytest 4.6.9 (2020-01-04)¶
错误修复¶
#6301: 修复了基于 egg 的分发和
editable安装 (pip install --editable) 的断言重写。
pytest 4.6.8 (2019-12-19)¶
功能¶
#5471: JUnit XML 现在在 testsuite 标签中包含时间戳和主机名。
错误修复¶
#5430: junitxml: 现在在测试在调用阶段失败时,失败测试的日志会传递给 junit 报告。
琐碎/内部更改¶
#6345: 仅将
colorama限制为0.4.1版本,以便更新的 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_testsini 值,可用于启用或禁用在 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: 处理由于单个替代 Unicode 字符在 Jython 中无法表示而导致的内部错误。
#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(run-last-failure) 的报告。#5035:
--cache-show选项/操作接受可选的 glob 以仅显示匹配的缓存条目。#5059: 标准输入(stdin)可以传递给 pytester 的
Testdir.run()和Testdir.popen()。#5068:
-r选项现在支持A,以在简短测试摘要中显示所有报告(包括通过的报告)。#5108: 简短测试摘要在通过输出(
-rP)后显示。#5172:
--last-failed(--lf) 选项变得更智能,现在如果测试文件的所有测试在以前的运行中都已通过,它将跳过整个文件,大大加快了收集速度。#5177: 引入新的特定警告
PytestWarning子类,以便更容易根据类而不是消息过滤警告。新的子类是PytestAssertRewriteWarningPytestCacheWarningPytestCollectionWarningPytestConfigWarningPytestUnhandledCoroutineWarningPytestUnknownMarkWarning
#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现在也显示函数范围以外的 fixture 范围。
错误修复¶
改进的文档¶
#4935: 扩展了关于注册标记以及
--strict影响的文档。
琐碎/内部更改¶
#4942:
logging.raiseExceptions不再设置为False。#5059: pytester 的
Testdir.popen()现在通过带有默认值(subprocess.PIPE)的关键字参数使用stdout和stderr。#5069: 终端中的简短测试摘要代码已移至终端插件。
#5082: 改进了 pytester 插件中各种方法的 kwargs 验证。
#5202:
record_property现在在使用junit_family=xunit2时发出PytestWarning:该 fixture 生成的property标签作为testcase的子标签,根据最新的 schema 是不允许的。#5239: 将
pluggy限制为< 1.0,这样我们就不会在发布时自动更新到1.0:有计划的破坏性更改,我们希望确保 pytest 正确支持pluggy 1.0。
pytest 4.4.2 (2019-05-08)¶
错误修复¶
改进的文档¶
琐碎/内部更改¶
#5182: 移除了内部和未使用的
_pytest.deprecated.MARK_INFO_ATTRIBUTE。
pytest 4.4.1 (2019-04-15)¶
错误修复¶
pytest 4.4.0 (2019-03-29)¶
功能¶
#2224: 当未安装合适的异步插件(例如
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选项现在通过模块属性处理类(例如pdb:pdb.Pdb和 pdbpp),并且其验证得到了改进。#4875: 如果
testpaths配置选项生效(即命令行中未明确传递目录或文件名),则在 pytest 头部显示在rootdir和inifile行旁边。此外,
inifile仅在存在配置文件时显示,而不是显示空字符串inifile:。#4911: Doctest 现在可以使用
pytest.skip()动态跳过。#4920: 已进行内部重构,以便实现 pytest-subtests 插件,该插件增加了 unittest 子测试支持和一个新的
subtestsfixture,如 #1367 中讨论的。有关内部重构的详细信息,请参阅相关 PR 中的详细信息。
#4931: pytester 的
LineMatcher断言传递的行是序列。#4936: 处理
-p no:plug之后的-p plug。这可用于从命令行等覆盖被阻止的插件(例如在“addopts”中)。
#4951: 仅通过 fixture (capsys, capfs) 与
pdb.set_trace()进行捕获时,输出捕获得到正确处理。#4956:
pytester在测试运行期间将$HOME和$USERPROFILE设置为临时目录。这确保不从真实用户的主目录加载配置文件。
#4980: 命名空间包在使用
monkeypatch.syspath_prepend和testdir.syspathinsert(通过pkg_resources.fixup_namespace_packages)时处理得更好。#4993: stepwise 插件现在报告状态信息。
#5008: 如果
setup.cfg文件包含[tool:pytest]并且也包含不再受支持的[pytest]部分,pytest 将使用[tool:pytest]而忽略[pytest]。以前它会无条件报错。这使得插件更容易支持旧版本的 pytest。
错误修复¶
#1895: 修复了通过
request.getfixturevalue()动态请求的 fixture 可能会在请求 fixture 之前被 teardown 的错误。#4851: pytester 现在取消设置
PYTEST_ADDOPTS,以便不与testdir.runpytest()使用外部选项。#4903: 在 2038 年之后的年份中,对重写的
.pyc文件使用正确的修改时间。#4928: 修复了
ScopeMismatch错误中的行偏移。#4957:
-p no:plugin现在可以正确处理默认(内部)插件,例如-p no:capture。以前它们总是被加载(导入),使得例如
capfdfixture 可用。#4975: 修复了
-qq选项的解释,之前它被视为-v。#4978:
outcomes.Exit不再在assertrepr_compare中被吞噬。#4988: 在会话结束时显式关闭日志记录的文件处理器。
#5003: 修复了标记收集错误中的行偏移(差一)。
改进的文档¶
#4974: 更新了
pytest_cmdline_parse钩子的文档,以说明可用性限制。
琐碎/内部更改¶
#4718: 现在需要
pluggy>=0.9。#4815: Python 2.7 现在需要
funcsigs>=1.0。#4829: 一些与
yield测试相关的剩余内部代码已被删除。#4890: 从 pytester 插件中移除了内部未使用的
anypythonfixture。#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选项,但现在仅默认为short(与auto一起)。
pytest 4.3.1 (2019-03-11)¶
错误修复¶
琐碎/内部更改¶
#4768: 避免在顶层导入 pkg_resources。
pytest 4.3.0 (2019-02-16)¶
弃用¶
#4724:
pytest.warns()现在在接收到未知关键字参数时发出警告。这将来会更改为错误。
功能¶
#2753: argparse 的使用错误被映射到 pytest 的
UsageError。#3711: 添加
--ignore-glob参数以使用 Unix shell 风格的通配符排除测试模块。为conftest.py添加collect_ignore_glob以使用 Unix shell 风格的通配符排除测试模块。#4698: 关于 pytest 5.0 不再支持 Python 2.7 和 3.4 的警告已移除。
最终认为它弊大于利,并且这些 Python 版本的用户不应遇到问题,因为
pip不会在这些解释器上安装 pytest 5.0。#4707: 借助新的
set_log_path()方法,现在可以通过钩子设置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标志时,也会显示*selected*测试的数量。#4688:
pytest_report_teststatus钩子现在也可以接收config参数。#4691:
pytest_terminal_summary钩子现在也可以接收config参数。
Bug修复¶
#3547:
--junitxml可以发出与Jenkins xUnit兼容的XML。junit_familyINI选项接受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_pathfixture和其他相关fixture提供已解析的路径(又称真实路径)。#4667:
pytest_terminal_summary使用pytest_report_teststatus钩子的结果,而不是硬编码字符串。#4669: 在Python 2上正确处理包含非ASCII字符的
unittest.SkipTest异常。#4680: 确保
tmpdir和tmp_pathfixture是同一个文件夹。#4681: 确保
tmp_path始终是真实路径。
琐碎/内部更改¶
pytest 4.1.1 (2019-01-12)¶
Bug修复¶
改进的文档¶
#3375: 记录了使用
setup.cfg可能会使其他工具崩溃或导致难以追踪的问题,因为它使用了与pytest.ini或tox.ini文件不同的解析器。
琐碎/内部更改¶
#4602: 在regen tox env中卸载
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的部分一直以来都是冲突和错误的来源。请注意,对于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_propertyfixture已被移除,请改用更通用的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。
特性¶
#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的支持。它处理
header与Python 3.7类似,并将任何其他关键字参数转发给Pdb构造函数。这允许
__import__("pdb").set_trace(skip=["foo.*"])。#4483: 添加了ini参数
junit_duration_report,用于可选地报告测试调用持续时间,不包括设置和拆卸时间。JUnit XML规范和pytest默认行为是包含设置和拆卸时间在测试持续时间报告中。您可以通过将此添加到
pytest.ini文件来仅包含调用持续时间(不包括设置和拆卸)。[pytest] junit_duration_report = call
#4532:
-ra现在将最后显示错误和失败,而不是作为摘要中的第一项。这使得获取错误和失败列表以有选择地运行测试变得更容易。
#4599:
pytest.importorskip现在支持reason参数,当请求的模块无法导入时会显示该参数。
Bug修复¶
改进的文档¶
琐碎/内部更改¶
#4447: 将
--result-log的弃用类型更改为PytestDeprecationWarning。已决定在下一次主要修订中移除此功能。
pytest 4.0.2 (2018-12-13)¶
Bug修复¶
改进的文档¶
#1495: 记录常见的doctest fixture目录树结构陷阱
pytest 4.0.1 (2018-11-23)¶
Bug修复¶
琐碎/内部更改¶
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环境使用不同的缓存。
Bug修复¶
#3554: 修复
CallInfo.__repr__在调用尚未完成时的问题。
pytest 3.10.1 (2018-11-11)¶
Bug修复¶
#4287: 修复调试插件(pdb)的嵌套使用,例如与pytester的
testdir.runpytest一起使用。#4304: 如果
cacheprovider也被阻塞,则阻塞stepwise插件,因为一个依赖于另一个。#4306: 将
minversion解析为实际版本,而不是点分隔的字符串。#4310: 修复由于多个参数匹配同一包而导致的重复收集问题。
#4321: 修复具有解析符号链接的
item.nodeid。#4325: 修复直接符号链接文件的收集问题,其中目标不匹配
python_files。#4329: 修复_collect_report_last_write导致的report_collect中的TypeError。
琐碎/内部更改¶
#4305: 在test_capture中用Python级别语法替换字节/unicode助手。
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秒打印/更新一次。
Bug修复¶
#2701: 修复虚假的
RemovedInPytest4Warning: usage of Session... is deprecated, please use pytest警告。#4046: 修复在包
__init__.py文件中运行测试的问题。#4260: 在匿名编译源代码期间抑制警告。
#4262: 修复删除由
tmpdir/tmp_path创建的过时目录时的访问被拒绝错误。#611: 将fixture命名为
request现在将引发警告:requestfixture是内部的,不应被覆盖,因为它会导致内部错误。#4266: 处理(忽略)在收集过程中引发的异常,例如与Django的LazySettings代理类一起使用时。
改进的文档¶
#4255: 添加了关于传递给filter warnings的模块名称未进行正则表达式转义的缺失文档。
琐碎/内部更改¶
pytest 3.9.3 (2018-10-27)¶
Bug修复¶
改进的文档¶
#3851: 在
@pytest.mark.parametrize的文档中添加对empty_parameter_set_markini选项的引用
琐碎/内部更改¶
pytest 3.9.2 (2018-10-22)¶
Bug修复¶
#2909: 改进检测到fixture之间递归依赖时的错误消息。
#3340: 修复在钩子
pytest_sessionstart()和pytest_sessionfinish()中不显示日志消息的问题。#3533: 修复JUnit报告中跳过测试的未转义XML原始对象
#3691: Python 2: 安全地格式化关于将unicode字符串传递给
warnings.warn的警告消息,这可能会在猴子补丁warnings.warn本身时导致意外的MemoryError异常。#4026: 改进无法确定函数签名时的错误消息。
#4177: 将
setuptools>=40.0固定,以支持setup.cfg中的py_modules。#4179: 恢复了符号链接当前测试运行的tmpdir行为。
#4192: 修复在python2下使用
recwarn时warnings.warn报告的文件名。
pytest 3.9.1 (2018-10-16)¶
特性¶
#4159: 对于包含测试类的测试套件,仅当指定了更高级别的冗余级别(至少“-vv”)时,才输出有关子类模块的信息。
pytest 3.9.0 (2018-10-15 - 由于发布自动化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提供的设置/拆卸机制的前身。您可以查阅文档中的funcarg比较部分。使用名为
"Class"的对象作为自定义在Collector子类中收集的节点类型的方式已被弃用。用户应改用pytest_collect_make_item在收集期间自定义节点类型。此问题应仅影响创建新收集类型的高级插件,因此如果您看到此警告消息,请联系作者以便他们更改代码。
生成以下消息的警告已更改为
RemovedInPytest4Warninggetfuncargvalue 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_collectini选项,用于在参数化收集空集时引发异常。#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。
Bug修复¶
#2535: 改进了
unittest.TestCase子类的测试函数使用参数化fixture时的错误消息。#3057:
request.fixturenames现在正确返回由request.getfixturevalue()创建的fixture的名称。#3946: 使用
-W作为命令行选项传递的警告过滤器现在优先于ini配置文件中定义的过滤器。#4066: 通过直接使用
textwrap.dedent修复源重新缩进的问题。#4102: 在Python 2中,
pytest.warn将捕获之前已警告的警告。以前它们从未被引发过。#4108: 解析参数的符号链接。
这修复了运行
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,并且当钩子实现使用它时将发出适当的警告。
Bug修复¶
#3539: 修复断言重写模块的重新加载问题。
#4034:
TestReport对象的.user_properties属性是一个(name, value)元组列表,但有时可能会被实例化为元组的元组。它现在始终是一个列表。#4039: 当使用
--pyargs时,不再针对在非顶级目录中使用pytest_plugins发出警告:当前的--pyargs机制不可靠,可能会给出假阴性结果。#4040: 当使用
-rP选项时,排除通过测试的空报告。#4051: 改进了向
-m选项传递无效Python表达式时的错误消息。#4056: 当Python 2上环境变量名称不是
str时,MonkeyPatch.setenv和MonkeyPatch.delenv会发出警告。在Python 2中,向
os.environ添加unicode键会导致subprocess(以及可能其他模块)出现问题,这使得这是一个特别容易与from __future__ import unicode_literals一起使用的微妙错误。
改进的文档¶
#3928: 在文档中添加了fixture作用域的可能值。
pytest 3.8.1 (2018-09-22)¶
Bug修复¶
#3286:
.pytest_cache目录现在被Git自动忽略。希望为其他SCM贡献解决方案的用户请查阅/评论此问题。#3749: 修复了包内测试收集期间出现的以下错误
TypeError: object of type 'Package' has no len()
#3941: 修复了间接参数化会考虑测试函数使用的所有fixture的作用域来确定参数化作用域,而不仅仅是正在参数化的fixture的作用域的bug。
#3973: 修复了如果测试更改了当前工作目录而未恢复它,断言重写器会崩溃的错误。
#3998: 修复了当使用
--pdb进入调试器时,某些caplog属性(例如record_tuples)不可用的问题。#3999: 修复了python2.x中当类在也包含非ascii文本的断言中返回非ascii二进制
__repr__时出现的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: 向
console_output_style添加了count选项,以启用将进度显示为计数而不是百分比。#3837:
pytester.RunResult.assert_outcomes签名添加了对“xfailed”和“xpassed”结果的支持。
错误修复¶
改进文档¶
琐碎/内部更改¶
#3853: 在没有失败测试时,移除了使用
--failed-first和--last-failed打印的"run all (no recorded failures)"消息。
pytest 3.7.4 (2018-08-29)¶
错误修复¶
改进文档¶
#3902: 修复 pytest.org 链接
pytest 3.7.3 (2018-08-26)¶
错误修复¶
#3033: 拆卸期间的夹具可以再次使用
capsys和capfd来检查测试期间捕获的输出。#3773: 修复如果
__init__.py文件与python_files配置选项匹配时,从这些文件中收集测试的问题。#3796: 修复连续子包的夹具拆卸在外部包结束时执行一次的问题。
#3816: 修复
--show-capture=no选项仍然显示在夹具拆卸期间打印的日志的错误。#3819: 修复当实时 CLI 日志激活时,
stdout/stderr未被捕获的问题。#3843: 修复在命令行中使用
test.py::test语法和--doctest-modules直接指定测试函数时导致的收集错误。#3848: 修复 Python 2 上无法将 Unicode 参数传递给
testdir.runpytest的错误。#3854: 修复当文件名以大写字母开头时,包内测试重复收集的错误。
改进文档¶
琐碎/内部更改¶
pytest 3.7.2 (2018-08-16)¶
错误修复¶
#3671: 修复
filterwarnings未注册为内置标记的问题。#3771: 修复如果
pytest_ignore_collect钩子返回False而不是None时收集期间的无限递归问题。#3774: 修复装饰过的夹具会丢失功能(例如
@mock.patch)的错误。#3775: 修复导入前缀为
pytest_的模块或其他对象时会引发PluginValidationError的错误。#3788: 修复
TestCase子类在__init__期间引发异常时在拆卸期间出现的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: 修复了插件与夹具函数直接调用时发出的警告代码之间的兼容性问题。
#3748: 修复了
numpy<1.13中pytest.approx数组的无限递归问题。#3757: 将 pathlib2 固定到
>=2.2.0,因为我们需要__fspath__支持。#3763: 修复 Python 3 中断言消息为
bytes时出现的TypeError。
pytest 3.7.0 (2018-07-30)¶
弃用和移除¶
功能¶
#2283: 新的
package夹具范围:当 package 的最后一个测试完成时,夹具被最终确定。此功能被认为是 实验性 的,因此请谨慎使用。#3576:
Node.add_marker现在支持append=True/False参数,以确定标记是最后(默认)还是最先出现。#3579: 夹具
caplog现在有一个messages属性,提供对格式化插值日志消息的便捷访问,而无需格式化程序/处理程序提供的额外数据。#3610: 新的
--trace选项,用于在测试开始时进入调试器。#3623: 引入
pytester.copy_example作为对项目示例进行验收测试的辅助工具。
错误修复¶
改进文档¶
#3295: 更正
--last-failed-no-failures的用法文档,在提供的示例中添加了缺失的--last-failed参数,因为它们具有误导性,让人以为不需要缺失的参数。
琐碎/内部更改¶
#3519: 现在在
.pytest_cache中创建了一个README.md文件,以明确该目录存在的原因。
pytest 3.6.4 (2018-07-28)¶
错误修复¶
使用
-mpytest调用 pytest,这样sys.path不会被site-packages中安装的包污染。 (#742)
改进文档¶
在夹具文档中使用
smtp_connection而不是smtp,以避免可能的混淆。 (#3592)
琐碎/内部更改¶
pytest 3.6.3 (2018-07-04)¶
错误修复¶
改进文档¶
@pytest.mark.skipif示例上方的描述现在更好地匹配代码。 (#3611)
琐碎/内部更改¶
pytest 3.6.2 (2018-06-20)¶
错误修复¶
改进文档¶
添加了
--strict标志的文档。 (#3549)
琐碎/内部更改¶
pytest 3.6.1 (2018-06-05)¶
错误修复¶
改进文档¶
在夹具文档中添加了关于如何使用夹具作为工厂的部分。 (#3461)
琐碎/内部更改¶
pytest 3.6.0 (2018-05-23)¶
功能¶
重构
pytest.mark内部实现,采用正确的每个节点处理方式,修复了旧设计导致的许多长期存在的错误。这引入了新的Node.iter_markers(name)和Node.get_closest_marker(name)API。强烈建议用户阅读文档中关于重构原因,或者直接了解更新现有代码以使用新 API 的详细信息。 (#3317)现在,当
@pytest.fixture多次应用于同一函数时,会引发ValueError。这种有缺陷的行为会导致意想不到的问题,如果某个测试套件能正常工作,那大多是偶然的。 (#2334)支持 Python 3.7 的内置
breakpoint()方法,有关详细信息,请参阅使用内置断点函数。 (#3180)monkeypatch现在支持context()函数,它充当上下文管理器,撤销with块内进行的所有打补丁操作。 (#3290)--pdb选项现在使 KeyboardInterrupt 进入调试器,而不是停止测试会话。在 python 2.7 上,再次按下 CTRL+C 退出调试器。在 python 3.2 及更高版本上,使用 CTRL+D。 (#3299)当
log-level参数的数值大于根记录器级别的值时,pytest 不再更改根记录器的日志级别,这使得它与用户代码中的自定义日志配置更好地配合。 (#3307)
错误修复¶
改进文档¶
将文档版权年份更改为每次发布时自动更新的范围。 (#3303)
琐碎/内部更改¶
pytest现在依赖于 python-atomicwrites 库。 (#3008)将所有 pypi.python.org URL 更新为 pypi.org。 (#3431)
使用内部插件管理器检测
pytest_前缀的钩子,因为pluggy正在弃用PluginManager的implprefix参数。 (#3487)从
_pytest.compat导入Mapping和Sequence,而不是直接从collections导入到python_api.py::approx中。将Mapping添加到_pytest.compat,在 python 2 上从collections导入,但在 Python 3.7 或更高版本上从collections.abc导入,以避免在 Python 3.7 或更高版本上出现DeprecationWarning。 (#3497)
pytest 3.5.1 (2018-04-23)¶
错误修复¶
改进文档¶
修复
caplog夹具文档中的拼写错误,该文档错误地将某些属性识别为方法。 (#3406)
琐碎/内部更改¶
当参数化函数接受默认值时,添加了更具指示性的错误消息。 (#3221)
移除内部
_pytest.terminal.flatten函数,转而使用more_itertools.collapse。 (#3330)从
collections.abc而不是collections导入一些模块,因为前者在 Python 3.7 中会触发DeprecationWarning。 (#3339)record_property 不再是实验性的,忘记移除警告了。 (#3360)
在文档和 CLI 帮助中提及,只有在添加
-v选项时,pytest --fixtures才会打印以_开头的夹具。 (#3398)
pytest 3.5.0 (2018-03-21)¶
弃用和移除¶
功能¶
新的
--show-capture命令行选项,允许指定在测试失败时如何显示捕获的输出:no、stdout、stderr、log或all(默认)。 (#1478)夹具现在根据其作用域进行实例化,作用域更高的夹具(例如
session)会比作用域较低的夹具(例如function)更早实例化。相同作用域的夹具的相对顺序保持不变,基于它们的声明顺序和依赖关系。 (#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命令行选项,使 doctests 能够显示每个代码片段的多个失败,而不是在第一次失败时停止。 (#3149)如果
junit_loggingini 选项设置为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)
错误修复¶
改进文档¶
琐碎/内部更改¶
将
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 中调用夹具时的 python 示例 (#3308)
pytest 3.4.2 (2018-03-04)¶
错误修复¶
改进文档¶
将日志插件添加到插件列表。 (#3209)
琐碎/内部更改¶
修复 fixture.rst 中的一个小拼写错误 (#3259)
pytest 3.4.1 (2018-02-20)¶
错误修复¶
将
doctest.UnexpectedException的导入移至顶层,以避免在使用--pdb时可能出现的错误。 (#1810)添加了在进入 pdb 之前打印捕获的 stdout/stderr 的功能,并改进了一个给出关于输出捕获的假阴性的测试。 (#3052)
修复了使用参数化夹具的测试排序问题,这可能导致夹具创建次数超出必要。 (#3161)
修复了在“测试运行”钩子之外的钩子中发生的日志记录会导致内部错误的错误。 (#3184)
当安装并导入 pypi
mock.patch时,正确检测由unittest.mock.patch装饰器注入的参数。 (#3206)当
pytest.raises()与match=失败时显示的错误现在更清晰地说明了发生了什么:当没有引发异常时,“matching ‘…’”部分被删除,因为它错误地暗示引发了异常但它不匹配。当引发了错误的异常时,它现在被抛出(就像没有match=的pytest.raised()会做的那样),而不是抱怨不匹配的文本。 (#3222)修复了 macOS 上 doctests 中的输出捕获处理问题。 (#985)
改进文档¶
为
pytest.raises的match和message参数添加 Sphinx 参数文档。 (#3202)
琐碎/内部更改¶
pytest 3.4.0 (2018-01-30)¶
弃用和移除¶
所有 pytest 类现在都继承自
object,以实现更好的 Python 2/3 兼容性。这不应影响用户代码,除非在极少数边缘情况下。 (#2147)
功能¶
引入
empty_parameter_set_markini 选项,用于选择当@pytest.mark.parametrize给出空参数集时应用的标记。有效选项是skip(默认)和xfail。请注意,计划在未来版本中将默认值更改为xfail,因为这被认为不易出错。 (#2527)当捕获被禁用时 (
-s),控制台输出会回退到“经典”模式,否则输出会变得模糊不清,以至于毫无用处。 (#3038)新的
pytest_runtest_logfinish钩子,在测试项执行完成后调用,类似于pytest_runtest_logstart。 (#3101)改进使用多个夹具收集测试时的性能。 (#3107)
新的
caplog.get_records(when)方法,提供对“setup”、“call”和“teardown”测试阶段捕获记录的访问。 (#3117)新的夹具
record_xml_attribute,允许在 JUnit 报告中修改和插入<testcase>xml 节点上的属性。 (#3130)默认缓存目录已从
.cache重命名为.pytest_cache,此前社区反馈称.cache名称未能明确其由 pytest 使用。 (#3138)在实时日志输出中为级别名称列着色。 (#3142)
错误修复¶
修复 macOS 上 pexpect 测试挂起的问题,通过使用 flush() 而不是 wait()。 (#2022)
修复在使用
pytester插件进行进程内 pytest 运行后恢复 Python 状态的问题;如果后续运行依赖于早期运行泄漏的全局解释器更改,这可能会破坏使用多个进程内 pytest 运行的测试。 (#3016)修复在插件设置钩子之前测试中止时跳过插件报告钩子的问题。 (#3074)
修复在拆卸过程中测试失败时报告的进度百分比。 (#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 的夹具函数时可能出现的混淆。 (#2698)
修正了 pytest 中使用的 doctest 标志的句子措辞。 (#3076)
文档中链接优先使用
https://*.readthedocs.io而不是http://*.rtfd.org。 (#3092)提高入门指南的可读性(措辞、语法) (#3131)
添加了注意事项,不建议在同一进程中多次调用 pytest.main,因为会进行导入缓存。 (#3143)
琐碎/内部更改¶
pytest 3.3.2 (2017-12-25)¶
错误修复¶
改进文档¶
添加关于多个参数化参数行为的澄清说明 (#3001)
琐碎/内部更改¶
pytest 3.3.1 (2017-12-05)¶
错误修复¶
修复
-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“bugs”链接 (#2949)
pytest 3.3.0 (2017-11-23)¶
弃用和移除¶
pytest 不再支持 Python 2.6 和 3.3。这些 Python 版本已经 EOL 一段时间,给 pytest 核心团队带来了维护和兼容性成本,在与社区其他成员协商后,我们决定从这个版本开始不再支持它们。仍然需要这些版本的用户应将 pytest 固定到
<3.3。 (#2812)删除内部
_preloadplugins()函数。此删除是pytest_namespace()钩子弃用的一部分。 (#2636)内部将
CallSpec2更改为具有标记列表而不是损坏的关键字映射。这移除了内部CallSpec2类的关键字属性。 (#2672)删除 ParameterSet.deprecated_arg_dict - 它不是公共 API,缺少下划线是命名错误。 (#2675)
移除内部多类型属性
Node._evalskip,并将其替换为布尔值Node._skipped_by_mark。 (#2767)传递给
pytest.fixture的params列表现在在调用pytest.fixture时被认为是不可变的和冻结的。以前,该列表可以在夹具首次调用之前更改,从而允许某种形式的动态参数化(例如,从命令行选项更新),但这是一种不必要的实现细节,它使内部复杂化并阻止了一些内部清理。有关详细信息和建议的解决方法,请参阅问题 #2959。
功能¶
pytest_fixture_post_finalizer钩子现在可以接收request参数。(#2124)用 Python 3 上的 inspect.signature 和 Python 2 上的 funcsigs.signature 替换 compat.py 中用于确定 fixtures 可用参数的旧内省代码。这应该尊重函数上的
__signature__声明。(#2267)只报告一次带有全局
pytestmark变量的测试。(#2549)现在 pytest 在运行测试时显示总进度百分比。可以通过将
console_output_style设置为classic来设置之前的输出样式。(#2657)通过添加
match关键字,使warns的签名与raises匹配。(#2708)pytest 现在捕获并显示标准
logging模块的输出。用户可以通过在pytest.ini、命令行以及在单个测试中使用标记来控制要捕获的日志级别。此外,还提供了一个caplogfixture,使用户能够在特定测试期间测试捕获的日志(例如,类似于capsys)。有关更多信息,请参阅日志记录文档。此功能是通过合并流行的 pytest-catchlog 插件引入的,感谢 @thisch。请注意,在合并过程中,与已停用的pytest-capturelog的向后兼容性接口已删除。(#2794)向
pytest.skip()添加allow_module_levelkwarg,支持跳过整个模块。(#2808)允许在 PYTEST_ADDOPTS 中设置
file_or_dir、-c和-o。(#2824)将 stdout/stderr 捕获结果作为
namedtuple返回,以便可以通过属性访问out和err。(#2879)添加
capfdbinary,它是capfd的一个版本,从readouterr()返回字节。(#2923)添加
capsysbinary,它是capsys的一个版本,从readouterr()返回字节。(#2934)实现跳过
setup.py文件在运行时带--doctest-modules的功能。(#502)
错误修复¶
在
capsys/capfd.disabled()上下文管理器之后恢复输出捕获。(#1993)pytest_fixture_setup和pytest_fixture_post_finalizer钩子现在为所有conftest.py文件调用。(#2124)如果在加载插件时发生异常,pytest 不再隐藏原始回溯。在 Python 2 中,它将显示原始回溯,并带有一条新消息,解释是在哪个插件中。在 Python 3 中,它将显示 2 个规范化异常,即加载插件时的原始异常,以及 pytest 抛出的关于加载插件的异常。(#2491)
capsys和capfd现在可以被其他 fixtures 使用。(#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)停止 vendoring
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)¶
错误修复¶
从
pytest中删除py<1.5限制,因为这可能导致某些安装中出现版本冲突。(#2926)
pytest 3.2.4 (2017-11-13)¶
错误修复¶
改进文档¶
pytest 3.2.3 (2017-10-03)¶
错误修复¶
改进文档¶
琐碎/内部更改¶
pytest 3.2.2 (2017-09-06)¶
错误修复¶
改进文档¶
琐碎/内部更改¶
pytest 3.2.1 (2017-08-08)¶
错误修复¶
改进文档¶
明确记录哪些 pytest 功能适用于
unittest。(#2626)
pytest 3.2.0 (2017-07-30)¶
弃用和移除¶
功能¶
为 approx 添加对 numpy 数组(和字典)的支持。(#1994)
现在,测试函数对象具有一个
pytestmark属性,其中包含直接应用于测试函数的标记列表,而不是从父类或模块继承的标记。(#2516)默认情况下,收集会忽略本地虚拟环境;
--collect-in-virtualenv会覆盖此行为。(#2518)允许将装饰为
@staticmethod的类方法作为测试函数进行收集的候选。(仅适用于 Python 2.7 及更高版本。Python 2.6 仍将忽略静态方法。)(#2528)引入
mark.with_args以允许将函数/类作为唯一参数传递给标记。(#2540)新的
cache_dirini 选项:设置缓存插件内容存储的目录。目录可以是相对路径或绝对路径:如果是相对路径,则在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)
错误修复¶
在
pytester.py.Testdir.popen()中,将stdin设置为已关闭的PIPE,以避免不必要的交互式pdb(#2023)在使用
capsys捕获模式时,为sys.std*流添加缺失的encoding属性。(#2375)修复在 Windows 上,如果
colorama在conftest.py文件中导入,则终端颜色变为黑色的问题。(#2510)修复了报告跳过测试摘要时行号不正确的问题。(#2548)
捕获:确保 EncodedFile.name 是一个字符串。(#2555)
选项
--fixtures和--fixtures-per-test现在将保留文档字符串中的缩进。(#2574)doctests 行号现在已正确报告,修复了 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-linttox 环境,用于在代码上运行自动 pep8 修复。(#2582)在 pytest 自己的测试套件中将警告转换为错误,以便更及时地捕获由于弃用导致的回归。(#2588)
在 CHANGELOG 条目中显示多个问题链接。(#2620)
pytest 3.1.3 (2017-07-03)¶
错误修复¶
修复 Python 2 中文档字符串中 doctest 的解码错误。(#2434)
现在,由 finalizers 在 teardown 期间引发的异常将被抑制,直到所有 finalizers 都被调用,然后重新引发初始异常。(#2440)
修复了在命令行上指定测试时“已收集项”报告不正确的问题。(#2464)
上下文管理器形式的
deprecated_call现在可以捕获弃用警告,即使相同的警告之前已经引发过。此外,deprecated_call将始终生成相同的错误消息(以前在上下文管理器模式和函数调用模式下会生成不同的消息)。(#2469)修复了 pytest 收集的路径可能带有三重前导
/字符的问题。(#2475)修复了尝试检测递归回溯开始时发生的内部错误。(#2486)
改进文档¶
明确说明哪些钩子在第一个非 None 结果后停止调用。(#2493)
琐碎/内部更改¶
pytest 3.1.2 (2017-06-08)¶
错误修复¶
通过
pytest_addoption添加的必需选项将不再阻止在不传递它们的情况下使用 –help。(#1999)在断言重写中遵守
python_files。(#2121)修复了回溯中包含无法比较的对象(如
numpy数组)时可能导致递归错误检测的问题。(#2459)UnicodeWarning仅在消息包含非 ASCII Unicode 时由内部 pytest 警告插件发出(仅限 Python 2)。(#2463)添加了一个针对 Python 3.6
WindowsConsoleIO因 Pytest 的FDCapture而中断的变通方案。其他使用控制台句柄的代码可能仍受相同问题的影响,可能需要进一步的变通方案/修复,例如colorama。(#2467)
改进文档¶
修复内部 API 链接到
pluggy对象的问题。(#2331)明确指出
pytest.xfail会在调用点停止测试执行,并改进skipping文档的整体流程。(#810)
pytest 3.1.1 (2017-05-30)¶
错误修复¶
pytest 警告捕获不再覆盖现有警告过滤器。以前的行为会覆盖所有过滤器,并导致配置警告过滤器以满足其需求的测试套件出现回归。请注意,由此产生的副作用是
DeprecationWarning和PendingDeprecationWarning默认不再显示。(#2430)修复 doctest 文本文件中非 ASCII 内容的问题。(#2434)
修复 Python 2 中 Unicode 警告的编码错误。(#2436)
pytest.deprecated_call现在以上下文管理器形式捕获PendingDeprecationWarning。(#2441)
改进文档¶
添加 towncrier 进行更新日志管理。(#2390)
3.1.0 (2017-05-22)¶
新功能¶
pytest-warnings插件已集成到核心中,现在pytest会在测试会话结束时自动捕获并显示警告。感谢 @nicoddemus 提供的 PR。
添加了
junit_suite_nameini 选项,用于指定 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。
pytest 现在在可调用 ID 在参数化测试中引发时发出警告。感谢 @fogo 提供的 PR。
现在可以通过将
__test__属性设置为类体中的False来跳过测试类不被收集(#2007)。感谢 @syre 报告和 @lwm 提供的 PR。更改 junitxml.py 以生成符合 Junitxml 架构的报告。如果相同的测试在调用中失败,然后在 teardown 中出错,我们将测试用例元素拆分为两个,一个包含错误,另一个包含失败。(#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。
错误修复¶
修复在 python 3 中使用
capsysfixture 时,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 报告中每个测试用例元素出现两次 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)¶
未正确将
option=value传递给-o/--override-ini时添加警告(#2105)。同时改进了帮助文档。感谢 @mbukatov 报告和 @lwm 提供的 PR。现在
--confcutdir和--junit-xml分别作为目录和文件名进行正确验证(#2089 和 #2078)。感谢 @lwm 提供的 PR。在错误消息中添加提示,指出可能缺少
__init__.py(#478)。感谢 @DuncanBetts。更准确地描述文档中 fixture 终结的发生时间(#687)。感谢 @DuncanBetts。
为
recwarn.rst提供:ref:目标,以便我们可以使用 intersphinx 引用。感谢 @dupuy 报告和 @lwm 提供的 PR。在 Python 2 中,在
pytest.approx的字符串表示中使用简单的+-ASCII 字符串(例如"4 +- 4.0e-06"),因为在 pytest 内部不同上下文和表示中处理它很脆弱,可能导致 #2111 等错误。在 Python 3 中,表示仍使用±(例如4 ± 4.0e-06)。感谢 @kerrick-lyft 报告和 @nicoddemus 提供的 PR。使用
item.Function、item.Module等现在会发出弃用警告,请改用pytest.Function、pytest.Module等(#2034)。感谢 @nmundar 提供的 PR。修复了使用
approx与复数时的错误消息(#2082)。感谢 @adler-j 报告和 @nicoddemus 提供的 PR。修复了断言重写钩子对被
pytest_plugins机制多次导入的模块产生误报警告的问题。感谢 @nicoddemus 提供的 PR。移除了一个内部缓存,该缓存可能导致子目录中的
conftest.py文件的钩子在其他目录中被错误调用(#2016)。感谢 @d-b-w 报告和 @nicoddemus 提供的 PR。删除了旨在支持早期 Python 3 版本的内部代码,该代码产生了将
None留在sys.modules中的副作用,当表达式被 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)¶
改进将非字符串 ID 传递给
pytest.mark.parametrize时的错误消息(#1857)。感谢 @okken 报告和 @nicoddemus 提供的 PR。向 stdin 存根类
pytest.capture.DontReadFromInput添加buffer属性。感谢 @joguSD 提供的 PR。修复了字符串比较与 Unicode 失败时发生的
UnicodeEncodeError。(#1864)感谢 @AiOO 提供的 PR。如果
pytest_plugins被定义为字符串(而不是字符串序列),当模块被考虑进行断言重写时,现在可以正确处理。由于此错误,如果测试套件使用pytest_plugins加载内部插件,则比必要重写的模块要多得多(#1888)。感谢 @jaraco 报告和 @nicoddemus 提供的 PR(#1891)。在使用
--pdb运行unittest.TestCase子类的测试时,不要调用 tearDown 和清理。这允许对所有在 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。修复了在 zipfile 中嵌入
pytest时出现的加载器错误。感谢 @mbachry 提供的 PR。
3.0.0 (2016-08-18)¶
不兼容的更改
此版本进行了一些不兼容的更改,旨在删除长期弃用的功能或更改现有行为,以使其不那么令人意外/更有用。
重新解释模式现已删除。只剩下纯模式和重写模式,因此
--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*入口点。带版本号和后缀的入口点从未被文档化,是 pre-virtualenv 时代的遗留物。这些入口点还在 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 报告错误,@RedBeardCode 和 @tomviner 提供的 PR。_pytest.monkeypatch.monkeypatch类已重命名为_pytest.monkeypatch.MonkeyPatch,这样它就不会与monkeypatchfixture 冲突。--exitfirst / -x现在可以被随后的--maxfail=N覆盖,并且只是--maxfail=1的同义词。
新功能
支持类方法上的 nose 风格
__test__属性,包括 unittest 风格的类。如果设置为False,则不收集测试。新的
doctest_namespacefixture,用于将名称注入到 doctest 运行的命名空间中。感谢 @milliams 提供的完整 PR(#1428)。新增了
--doctest-report选项,用于在运行(失败的)文档测试时更改差异的输出格式(实现了 #1749)。感谢 @hartym 的 PR。pytest.fixture装饰器新增了name参数,允许为 fixture 指定自定义名称(以解决 funcarg 遮蔽 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 strings。如果与-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:pytest 现在忽略命令行中给定的重复路径。要保留以前的行为,即通过在命令行中多次指定同一测试来运行多次,请传递--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 的结果缓存。
对测试为元组字面量的断言发出警告。此类断言永远不会失败,因为元组始终为真,通常是错误(参见 #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。显式传递的 parametrize ids 不会被转义为 ASCII(#1351)。感谢 @ceridwen 的 PR。
在测试函数中声明未知 fixture 时,错误消息中显示的 fixture 现在已排序。感谢 @nicoddemus 的 PR。
pytest_terminal_summary钩子现在接收测试会话的exitstatus作为参数。感谢 @blueyed 的 PR (#1809)。Parametrize ids 可以接受
None作为特定的测试 ID,在这种情况下将使用该参数自动生成的 ID。感谢 @palaviv 的完整 PR (#1468)。xunit 风格的 setup/teardown 方法(
setup_method、setup_module等)的参数现在是可选的,可以省略。感谢 @okken 提出此问题,以及 @nicoddemus 的 PR。在 parametrize 中出现重复 ID 时,改进了自动 ID 生成的选择。感谢 @palaviv 的完整 PR (#1474)。
现在默认显示 pytest 警告摘要。新增了一个标志
--disable-pytest-warnings以显式禁用警告摘要(#1668)。通过提醒用户检查测试模块/包的名称,使收集期间的 ImportError 更明确(#1426)。感谢 @omarkohl 的完整 PR (#1520)。
将
build/和dist/添加到默认的--norecursedirs列表。感谢 @mikofski 的报告和 @tomviner 的 PR (#1544)。上下文管理器形式的
pytest.raises接受自定义message,用于在未发生异常时引发。感谢 @palaviv 的完整 PR (#1616)。conftest.py文件现在受益于断言重写;以前只适用于测试模块。感谢 @flub、@sober7 和 @nicoddemus 的 PR (#1619)。不包含任何文档测试的文本文件不再显示为“跳过”。感谢 @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向后兼容性支持 float/complex 类型(#457)。完善了
rootdir的确定逻辑,仅考虑有效路径,从而修复了一些问题:#1594、#1435 和 #1471。根据当前行为更新了文档。感谢 @blueyed、@davehunt 和 @matthiasha 的 PR。始终包含完整的断言解释。以前的行为是隐藏恰好为 False 的子表达式,假设这是冗余信息。感谢 @bagerard 的报告 (#1503)。感谢 @davehunt 和 @tomviner 的 PR。
在未使用参数化变量的情况下提供更好的消息(参见 #1539)。感谢 @tramwaj29 的 PR。
更新了文档字符串,使其风格更统一。
在启动时为
pytest.exit(msg)添加 stderr 写入。以前消息从未显示。感谢 @BeyondEvil 报告 #1210。感谢 @jgsonesen 和 @tomviner 的 PR。不再显示不正确的测试取消选择原因(#1372)。感谢 @ronnypfannschmidt 的 PR。
--resultlog命令行选项已弃用:它很少使用,并且有更现代更好的替代方案(参见 #830)。感谢 @nicoddemus 的 PR。改进了 fixture 查找错误时的错误消息:在第一行添加“E”,在其余行添加“>”。修复了 #717。感谢 @blueyed 的报告和 PR,@eolo999 的初始 PR 以及 @tomviner 在 EuroPython2016 sprint 期间的指导。
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文件中的错误变得更容易(#1516)。感谢 @txomon 的 PR。不包含任何文档测试的文本文件不再显示为“跳过”。感谢 @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 在使用 condition 关键字参数时不工作的问题。感谢 @astraw38 报告此问题 (#1496),以及 @tomviner 的 PR (#1524)。
修复 win32 路径问题:当在
pytest.main("-c your_absolute_path")中放置带有绝对路径的自定义配置文件时。修复当引发的错误类不支持 unicode/编码字节时,最大递归深度检测的问题。感谢 @prusse-martin 的 PR (#1506)。
修复在严格模式下使用
pytest.mark.skip标记的问题。感谢 @pquentin 的 PR 以及 @RonnyPfannschmidt 演示如何修复此错误。对文档进行了小幅改进和修复。感谢 @omarkohl 的 PR。
修复
--fixtures以显示所有 fixture 定义,而不是每个 fixture 名称只显示一个。感谢 @hackebrot 的 PR。
2.9.1 (2016-03-17)¶
Bug 修复
改进插件加载失败时的错误消息。感谢 @nicoddemus 的 PR。
修复 (#1178):
pytest.fail带有非 ASCII 字符时会引发内部 pytest 错误。感谢 @nicoddemus 的 PR。修复 (#469):当参数 ID 包含
::时,junit 错误解析 report.nodeid。感谢 @tomviner 的 PR (#1431)。修复 (#578):在失败点包含非 ASCII 行的 SyntaxError 错误会生成内部 py.test 错误。感谢 @asottile 的报告和 @nicoddemus 的 PR。
修复 (#1437):当向 parameterize 传入字节字符串正则表达式模式时,尝试将其解码为 utf-8,忽略错误。
修复 (#649):不能在命令行上指定运行参数化测试节点。
修复 (#138):改进 Python 3.3+ 链式异常的报告
2.9.0 (2016-02-29)¶
新功能
新增了
pytest.mark.skip标记,无条件跳过标记的测试。感谢 @MichaelAquilina 的完整 PR (#1040)。--doctest-glob现在可以在命令行中多次传递。感谢 @jab 和 @nicoddemus 的 PR。新的
-rp和-rP报告选项分别提供通过测试的摘要和完整输出。感谢 @codewarrior0 的 PR。pytest.mark.xfail现在有一个strict选项,它会使XPASS测试导致测试套件失败(默认为False)。还有一个xfail_strictini 选项可用于项目范围配置。感谢 @rabbbit 的请求和 @nicoddemus 的 PR (#1355)。Parser.addini现在支持bool类型的选项。感谢 @nicoddemus 的 PR。新增
ALLOW_BYTES文档测试选项。这会从文档测试输出的字节字符串中去除b前缀(类似于ALLOW_UNICODE)。感谢 @jaraco 的请求和 @nicoddemus 的 PR (#1287)。在
KeyboardInterrupt时提示使用--fulltrace选项显示错误。修复了 #1366。感谢 @hpk42 的报告和 @RonnyPfannschmidt 的 PR。获取异常源位置时捕获
IndexError异常。修复了动态生成代码(fixture 和测试)中 pytest 内部错误,其中源行有意是假的。
更改
重要提示:py.code 已合并到
pytest仓库中,作为pytest._code。做出此决定是因为py.code在pytest之外的使用很少,并且它位于不同的仓库中使得及时修复其代码中的错误变得困难。团队希望通过此举能够更好地重构和改进该代码。此更改不应影响用户,但如果他们遇到任何奇怪的行为,让用户知晓会很有用。请记住,
pytest._code的代码是私有和实验性的,因此您绝对不应显式导入它!请注意,原始的
py.code仍然可以在 pylib 中找到。pytest_enter_pdb现在可选地接收 pytest 配置对象。感谢 @nicoddemus 的 PR。删除了 Python 2.5 或更低版本的代码和文档,包括删除了过时的
_pytest.assertion.oldinterpret模块。感谢 @nicoddemus 的 PR (#1226)。即使未使用
-vv,当在环境中找到CI或BUILD_NUMBER时,比较现在始终完整显示。感谢 @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 中的双节点 ID,这是一个回归,导致 pytest-pep8 + pytest-flakes 等插件组合失败
解决了在启用标准 I/O 捕获的情况下使用
--pdb时 pyreadline 中发生的异常。感谢 Erik M. Bray 的 PR。修复 #900:如果
monkeypatch调用的目标引发ImportError,则提供更好的错误消息。修复 #1292:monkeypatch 调用(setattr、setenv 等)现在是 O(1)。感谢 David R. MacIver 的报告和 Bruno Oliveira 的 PR。
修复 #1223:现在,当使用
--pdb时,捕获的 stdout 和 stderr 会在进入 pdb 之前正确显示,而不是被丢弃。感谢 Cal Leeming 的 PR。修复 #1305:在
pytest_terminal_summary期间发出的 pytest 警告现在已正确显示。感谢 Ionel Maries Cristian 的报告和 Bruno Oliveira 的 PR。修复 #628:解决了文档测试包含 unicode 时内部 UnicodeDecodeError 错误。感谢 Jason R. Coombs 的报告和 Bruno Oliveira 的 PR。
修复 #1334:在 setup 错误时将捕获的 stdout 添加到 jUnit XML 报告中。感谢 Georgy Dyuldin 的 PR。
2.8.5 (2015-12-11)¶
修复 #1243:修复了在收集过程中注入的类属性可能破坏 pytest 的问题。Alexei Kozlenok 提供了 PR,感谢 Ronny Pfannschmidt 和 Bruno Oliveira 的审查和帮助。
修复 #1074:预计算 junitxml 块,而不是将整个树存储在对象中。感谢 Bruno Oliveira 的报告和 Ronny Pfannschmidt 的 PR。
修复 #1238:修复了
pytest.deprecated_call()接收多个参数的问题(2.8.4 中引入的回归)。感谢 Alex Gaynor 的报告和 Bruno Oliveira 的 PR。
2.8.4 (2015-12-06)¶
修复 #1190:当 deprecated 函数已在同一模块中的另一个测试中调用时,
deprecated_call()现在可以正常工作。感谢 Mikhail Chernykh 的报告和 Bruno Oliveira 的 PR。修复 #1198:
--pastebin选项现在在 Python 3 上可以正常工作。感谢 Mehdy Khoshnoody 的 PR。修复 #1219:当捕获的输出包含非 ASCII 字符时,
--pastebin现在可以正常工作。感谢 Bruno Oliveira 的 PR。修复 #1204:另一个在收集时出现糟糕的 __getattr__() 时的错误。感谢 Florian Bruhin 的 PR。
修复了没有运行测试时打印的摘要。感谢 Florian Bruhin 的 PR。
修复 #1185 - 确保 MANIFEST.in 与 sdist 中的内容完全匹配
一些关于良好实践的文档现代化。感谢 Bruno Oliveira 的 PR。
2.8.3 (2015-11-18)¶
修复 #1169:为 TestCaseFunction 中的测试用例添加 __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:当字符串比较失败且差异过大无法在不传递 -vv 的情况下显示时,仍然显示几行差异。感谢 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 现在还为枚举、正则表达式和类对象(而不是类实例)生成有意义的测试 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 错误。感谢 Sergey Chipiga 的报告和 Jan Bednarik 的 PR。
修复 issue82:默认情况下避免从 setup.cfg/pytest.ini/tox.ini 文件及更高级别加载 conftest 文件(--confcutdir 仍可设置以覆盖此行为)。感谢 Bruno Oliveira 的 PR。
修复 issue768:在 Python 模块中找到的 docstrings 没有设置会话 fixture。感谢 Jason R. Coombs 的报告和 Bruno Oliveira 的 PR。
添加了
tmpdir_factory,这是一个会话范围的 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:在根本没有运行测试的情况下(例如命令行中给定的目录不包含任何测试,或者命令行选项过滤掉所有测试,例如 -k),pytest 现在以状态码 5 退出。感谢 Eric Siegerman (issue812) 和 Bruno Oliveira 的 PR。
摘要栏在警告情况下现在显示为黄色,例如:所有测试都被跳过或 xpass/xfailed,或者根本没有运行任何测试(与 issue500 相关)。感谢 Eric Siegerman。
新增
testpathsini 选项:在从根目录执行 pytest 时搜索测试的目录列表。当项目有明确指定的测试目录时,这可以用于加快测试收集,通常比为所有不包含测试的目录配置 norecursedirs 更实用。感谢 Adrian 的想法 (#694) 和 Bruno Oliveira 的 PR。修复 issue713:文档测试失败的 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。内部重构 pluginmanager API 和代码,以便 pytest-agnostic 的简单 pluginmanager 和 PytestPluginManager 之间有明确的区别,后者添加了许多行为,其中包括处理本地 conftest 文件。就文档方法而言,这是一个向后兼容的更改,但它仍然可能破坏依赖于特定细节(尤其是 pluginmanager.add_shutdown() API)的第三方插件。感谢 Holger Krekel。
插件管理:引入
pytest.hookimpl和pytest.hookspec装饰器,用于设置实现/规范特定参数。这取代了之前已弃用的pytest.mark的使用,后者旨在仅包含测试函数的标记。编写/完善了“编写插件”的文档,现在它们有自己的页面,并与“使用/安装插件”页面分开。
修复 issue732:正确地从任何钩子调用站点取消注册插件,允许在测试执行期间拥有临时插件。
弃用并警告钩子实现中的
__multicall__参数。请改用 pytest-2.7 中已引入的hookwrapper机制。通过默认使用进程内测试,大大加快了 pytest 自身测试套件的调用速度(测试运行可以通过 --runpytest=subprocess 修改,以便在许多地方创建子进程)。在测试中运行 pytest 的主要 API 是“runpytest()”或“runpytest_subprocess”和“runpytest_inprocess”(如果您需要特定的测试运行方式)。在所有情况下,您都会得到一个 RunResult,但进程内测试还会有一个带有记录事件/报告的“reprec”属性。
修复 monkeypatch.setattr(“x.y”, raising=False) 以在“y”不是预先存在的属性时实际不引发异常。感谢 Florian Bruhin。
修复 issue741:使 testdir.run 的运行输出可复制/粘贴。感谢 Bruno Oliveira。
新增
--noconftest参数,该参数会忽略所有conftest.py文件。为 JUnit-XML 输出添加
file和line属性。修复 issue890:将所有文档文件的扩展名从
txt更改为rst。感谢 Abhijeet 的 PR。修复 issue714:添加了对特定 argnames 应用 indirect=True 参数的功能。感谢 Elizaveta239。
修复 issue890:将所有文档文件的扩展名从
txt更改为rst。感谢 Abhijeet 的 PR。修复 issue957:“# doctest: SKIP” 选项现在会将文档测试注册为 SKIPPED 而不是 PASSED。感谢 Thomas Grainger 的报告和 Bruno Oliveira 的 PR。
issue951:添加新的 record_xml_property fixture,支持在 xml 输出中记录额外信息。感谢 David Diaz 的 PR。
issue949:普通选项(例如
-s、-v等)之后的路径现在被正确用于发现rootdir和ini文件。感谢 Peter Lauri 的报告和 Bruno Oliveira 的 PR。
2.7.3 (2015-09-15)¶
允许
importorskip中使用“dev”、“rc”或其他非整数版本字符串。感谢 Eric Hunsberger 的 PR。修复 issue856:在所有输出中(例如 --fixtures)考虑 --color 参数。感谢 Barney Gale 的报告和 Bruno Oliveira 的 PR。
修复 issue855:将字符串对象作为
plugins参数传递给 pytest.main 现在被解释为要导入并注册为插件的模块名称,而不是静默地不起作用。感谢 xmo-odoo 的报告和 Bruno Oliveira 的 PR。修复 issue744:修复 Python 3.5+ 中 ast.Call 更改的问题。感谢 Guido van Rossum、Matthias Bussonnier、Stefan Zimmermann 和 Thomas Kluyver。
修复 issue842:在类中应用标记不再将这些标记传播到也具有标记的超类。感谢 xmo-odoo 的报告和 Bruno Oliveira 的 PR。
在调用 pytest.deprecated_call 后保留警告函数。感谢 Pieter Mulder 的 PR。
修复 issue854:在 unittest.TestCase 子类中定义为类成员的 autouse yield_fixtures 现在按预期工作。感谢 xmo-odoo 的报告和 Bruno Oliveira 的 PR。
修复 issue833:--fixtures 现在显示所有已收集测试文件的 fixture,而不是仅显示第一个文件的 fixture。感谢 Florian Bruhin 的报告和 Bruno Oliveira 的 PR。
修复 issue863:当使用多个标记时,如果满足跳过/xfail 条件,则跳过的测试现在报告正确的原因。感谢 Raphael Pierzina 的报告和 Bruno Oliveira 的 PR。
优化了 tmpdir fixture 初始化,这应该会使测试会话更快(特别是在使用 pytest-xdist 时)。唯一可见的影响是现在 pytest 使用 $TEMP 目录中的一个子目录来存放此 fixture 创建的所有目录(默认为 $TEMP/pytest-$USER)。感谢 Bruno Oliveira 的 PR。
2.7.2 (2015-06-23)¶
修复 issue767:pytest.raises value 属性在 Python 2.6 上不包含异常实例。感谢 Eric Siegerman 提供了测试用例,以及 Bruno Oliveira 的 PR。
自动为 junitxml 和结果日志创建目录。感谢 Aron Curzon。
修复 issue713:文档测试失败的 JUnit XML 报告。感谢 Punyashloka Biswal。
修复 issue735:Python 3.4+ 调试版本中的断言失败。感谢 Benjamin Peterson。
修复 issue114:skipif 标记向内部跳过插件报告;感谢 Floris Bruynooghe 的报告和 Bruno Oliveira 的 PR。
修复 issue748:unittest.SkipTest 报告给内部 pytest unittest 插件。感谢 Thomas De Schampheleire 的报告和 Bruno Oliveira 的 PR。
修复 issue718:在 Python 2 中,无法创建包含不可排序元素的集合的表示。感谢 Edison Gustavo Muenz。
修复 issue756,修复 issue752(以及类似问题):依赖于 py-1.4.29,它具有更精细的回溯生成算法。
2.7.1 (2015-05-19)¶
修复 issue731:在折叠 False 解释时,不要被对象 repr 中可能存在的不平衡括号所迷惑。感谢 Carl Meyer 的报告和测试用例。
修复 issue553:正确处理 FixtureLookupError 中 inspect.getsourcelines 失败,这可能导致内部错误,从而模糊原始问题。感谢 talljosh 的初步诊断/补丁和 Bruno Oliveira 的最终补丁。
修复 issue660:正确报告作用域不匹配访问错误,独立于 fixture 参数的顺序。同时避免 pytest 内部回溯,因为它不向用户提供信息。感谢 Holger Krekel。
简化并记录了发布过程。此外,所有版本(在 setup.py 和文档生成中)现在都从 _pytest/__init__.py 中读取。感谢 Holger Krekel。
修复了文档,删除了 yield-fixtures 是实验性的概念。它们将长期存在 :) 感谢 Bruno Oliveira。
通过使用环境标记来满足要求,支持构建 wheel。感谢 Ionel Maries Cristian。
修复了 2.6.4 的回归问题,例如在测试引发 SystemExit 时丢失了 stdout 捕获打印。感谢 Holger Krekel。
重新引入了 pytester 插件的 _pytest fixture,pytest-xdist 等至少使用它。
2.7.0 (2015-03-26)¶
修复 issue435:当断言重写处于活动状态时,使 reload() 工作。感谢 Daniel Hahler。
修复 issue616:conftest.py 文件及其包含的 fixture 现在被正确地考虑可见性,独立于确切的当前工作目录和使用的测试参数。非常感谢 Eric Siegerman 及其 PR235,其中包含针对 conftest 可见性的系统测试,现在已通过。此更改还引入了
rootdir的概念,它作为新的 pytest 标头打印并记录在 pytest 自定义网页中。更改了“转移”测试的报告,即在一个文件中收集但实际来自另一个文件的测试(例如,当测试类中的测试来自不同文件中的基类时)。我们现在显示节点 ID 并通过后缀指示另一个文件。
添加了通过环境变量 PYTEST_ADDOPTS 设置命令行选项的功能。
添加了 bitbucket 和 github 上新的 pytest-dev 团队的文档。请参阅 https://pytest.cn/en/stable/contributing.html。感谢 Anatoly 的推动和初步工作。
修复 issue650:新选项
--doctest-ignore-import-errors,它会将文档测试中的导入错误转换为跳过。感谢 Charles Cloud 的完整 PR。修复 issue655:解决导致 python2/3 将 sys.exc_info 泄露到 fixture/测试中,从而导致第三方代码失败的不同方式
修复 issue615:断言重写在格式化布尔运算时没有正确转义 % 符号,这在布尔值与模运算符混合时导致错误。感谢 Tom Viner 的报告、分类和修复。
实现了 issue351:增加了将 parametrize id 指定为可调用对象以生成自定义测试 id 的功能。感谢 Brianna Laugher 的想法和实现。
引入并记录了新的 hookwrapper 机制,对于希望为其目的封装某些钩子执行的插件很有用。这取代了 pytest 本身和一些外部插件使用的未文档化的
__multicall__协议。请注意,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)。
失败时,
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 支持。
修复 issue620:在 --genscript 目标中添加关于二进制 blob 含义的解释。感谢 Dinu Gherman。
修复 issue614:修复了 pastebin 支持。
2.6.3 (2014-09-24)¶
修复 issue575:xunit-xml 将收集错误报告为失败而不是错误,感谢 Oleg Sinyavskiy。
修复 issue582:修复 setuptools 示例,感谢 Laszlo Papp 和 Ronny Pfannschmidt。
修复 pickling capture.EncodedFile 时的无限递归错误,感谢 Uwe Schmitt。
修复 issue589:修复了与 numpy 等在显示异常时的不良交互。检查精确的“超出最大递归深度”异常,而不是假定任何 RuntimeError 都是该异常(在 py dep 中实现)。感谢 Charles Cloud 对问题的分析。
修复 conftest 相关的 fixture 可见性问题:当在测试包之外的 CWD 中运行时,pytest 会错误地发现 fixture。感谢 Wolfgang Schnerring 找出了可重现的示例。
引入 pytest_enter_pdb 钩子(例如 pytest_timeout 在交互式进入 pdb 时取消超时需要)。感谢 Wolfgang Schnerring。
检查 xfail/skip 也适用于非 Python 函数测试项。感谢 Floris Bruynooghe。
2.6.2 (2014-09-05)¶
添加了函数 pytest.freeze_includes(),它使得使用 cx_freeze 等工具轻松地将 pytest 嵌入到可执行文件中。请参阅文档以获取示例和原理。感谢 Bruno Oliveira。
改进断言重写缓存失效的精度。
修复 issue561:调整 autouse fixture 示例以适应 python3。
修复 issue453:__repr__ 包含“n{”、“n}”和“n~”时的断言重写问题。
修复 issue560:如果“else:”或“finally:”后面跟有同一行上的语句,则正确显示代码。
修复 monkeypatch 文档中的示例,感谢 t-8ch。
修复 issue572:更正 python3 的 tmpdir 文档示例。
不要标记为通用 wheel,因为 Python 2.6 由于额外的 argparse 依赖项而与其他构建不同。修复 issue566。感谢 sontek。
实现 issue549:用户提供的断言消息现在不再替换 py.test 自省消息,而是额外显示。
2.6.1 (2014-08-07)¶
不再在 –verbose 输出中显示行号,输出现在纯粹是节点 ID。行号仍在失败报告中显示。感谢 Floris Bruynooghe。
修复 issue437,其中断言重写可能导致 pytest-xdist worker 节点收集不同的测试。感谢 Bruno Oliveira。
修复 issue555:为 capture-streams 添加“errors”属性,以满足一些 distutils 和可能其他代码访问 sys.stdout.errors 的需求。
修复 issue547 capsys/capfd 在禁用输出捕获(“-s”)时也有效。
解决 issue170:允许 pytest.mark.xfail(…) 通过可选的“raises=EXC”参数指定预期异常,其中 EXC 可以是单个异常或异常类元组。感谢 David Mohr 提供的完整 PR。
修复 pytest 与 unittest.mock.patch 装饰器(当它使用“new”参数时)的集成。感谢 Nicolas Delaby 提供的测试和 PR。
修复当参数包含“::”节点 ID 规范(从“-v”输出复制粘贴)时检测 conftest 文件的问题。
修复 issue544,只删除“::”分隔部分末尾的“@NUM”,并且如果该部分具有“.py”扩展名。
不使用 py.std 导入助手,而是直接导入。感谢 Bruno Oliveira。
2.6¶
根据作用域缓存 fixtures 中的异常(issue 467)。
修复 issue537:默认情况下避免导入旧的断言重解释代码。
修复 issue364:默认情况下缩短和增强回溯表示。新的“–tb=auto”选项(默认)将仅显示第一个和最后一个条目的长回溯。您可以使用“–tb=long”获取打印所有条目为长条目的旧行为。此外,默认情况下短条目现在与“–tb=native”的打印方式非常相似。
修复 issue514:让断言重解释了解私有类属性。
更改 -v 输出以包含测试的完整节点 ID。用户可以从测试运行中复制节点 ID,包括行号,并将其用作位置参数以仅运行单个测试。
修复 issue 475:如果使用错误的异常类型调用 pytest.raises,则提前且易于理解地失败。
修复 issue516:在入门指南中告知当前依赖项。
稍微清理 setup.py 并指定支持的版本。感谢 Jurko Gospodnetic 提供的 PR。
当使用 -v 运行测试时,将 XPASS 颜色更改为黄色而不是红色。
修复 issue473:解决 mock 在双重打补丁时将未绑定方法放入类字典的问题。
修复 issue498:如果 fixture finalizer 失败,确保 fixture 仍然失效。
修复 issue453:pytest_assertrepr_compare 钩子的结果现在会将其换行符转义,以免 format_exception 崩溃。
内部新的警告系统:当 pytest 在测试收集或执行中检测到异常时,现在会生成警告。警告最终会发送到一个新的 pytest_logwarning 钩子,目前仅由终端插件实现,该插件在摘要行中显示警告,并在指定 -rw(报告警告)时显示更多详细信息。
对于具有 __init__ 的测试类和测试模块中看起来像测试但不是函数的 callable,将跳过转换为警告。
修复 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:改进了与 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 目录中运行测试
python setup.py test(为此使用 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 – 更好地与 cx_freeze 互操作,不尝试从 collections.abc 导入,这会导致 py27/cx_freeze 的问题。感谢 Wolfgang L. 报告并追踪问题。
修复文档和代码,几乎所有地方都使用“pytest”而不是“py.test”。感谢 Jurko Gospodnetic 提供的完整 PR。
修复 issue425:在“py.test -h”末尾提及 –markers 和 –fixtures 根据指定的测试路径(或当前目录)工作。
修复 issue413:带 unicode 属性的异常现在在 python2 和 pytest-xdist 运行中也能正确打印。(修复需要 py-1.4.20)
从 pylib 1.4.20.dev2 (rev 13d9af95547e) 复制、清理并集成 py.io capture。
解决 issue416:澄清有关 conftest.py 加载语义的文档。
修复 issue429:断言表达式中比较带有非 ascii 字符的字节字符串现在工作得更好。感谢 Floris Bruynooghe。
将 capfd/capsys.capture 设为私有,它未使用且不应公开。
2.5.1 (2013-12-17)¶
合并 Tobias Bieniek 的新文档样式 PR。
修复 issue403:允许在收集节点中参数化多个同名函数。感谢 Andreas Kloeckner 和 Alex Gaynor 的报告和分析。
允许参数化 fixtures 通过向 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 自身的自动化发布测试中移除了 python2.5,这意味着它可能很快就会失效(但我们相信此版本仍然有效)。
简化并修复了在涉及参数化 fixture 或函数参数时调用 finalizer 的实现。现在在设置时惰性地执行最终化,而不是在“拆卸阶段”。虽然这起初听起来很奇怪,但它有助于确保即使在复杂代码中也能正确处理设置/拆卸。用户级代码不应受到影响,除非它正在实现 pytest_runtest_teardown 钩子并期望在其中拆卸某些 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 修复 finalizer 顺序,使其在依赖于高于函数作用域的参数化 fixture 的独立 fixture 上采用 LIFO 顺序。(这需要相当大的努力,所以请忍受这个句子的复杂性 :) 感谢 Ralph Schmitt 提供的精确失败示例。
通过为参数实现特殊索引,仅对参数化测试 ID 使用索引,修复 issue244。
通过运行所有 finalizer,但保存第一个失败 finalizer 的异常并重新抛出它,从而使 teardown 仍然失败,修复 issue287。我们重新抛出第一个失败的异常,因为它可能是其他 finalizer 失败的原因。
修复当 mock.patch 或其他标准装饰器封装与测试方法一起使用时的排序问题。这修复了 issue346,并应有助于解决随机“xdist”收集失败。感谢 Ronny Pfannschmidt 和 Donald Stufft 帮助隔离它。
修复 issue357 - “-k”表达式的特殊情况,允许使用不是有效 python 表达式的简单字符串进行过滤。示例:“-k 1.3”匹配所有参数化为 1.3 的测试。“-k None”过滤所有名称中包含“None”的测试,反之亦然,“-k ‘not None’”。以前这些示例会引发语法错误。
通过删除 trial 支持代码修复 issue384,因为 unittest 兼容性增强允许 trial 自行处理它。
当导入插件产生 ImportError 时,不要隐藏它。修复 issue375。
修复 issue275 - 允许 usefixtures 和 autouse fixtures 用于运行 doctest 文本文件。
修复 issue380,使 –resultlog 仅依赖于 longrepr 而不是有时才存在的“reprcrash”属性。
解决 issue122:允许 @pytest.fixture(params=iterator) 通过尽早展开为列表。
修复 pytest 自身测试的 pexpect-3.0 兼容性。(修复 issue386)
允许嵌套的 parametrize-value 标记,感谢 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 提出这一点。
在 pypy 上 xfail 一个检查错误编码/ascii 的测试(pypy 不会报错)。修复 issue385。
内部使 varnames() 处理类的 __init__,尽管 pytest 本身目前不需要它。也修复了缓存。修复 issue376。
修复 issue221 - 正确处理没有 __init__.py 的命名空间包的导入。
重构内部 FixtureRequest 处理以避免猴子补丁。其中一个积极的用户可见效果是,“request”对象现在可以在闭包中使用。
修复 pytest.importskip(modname, minverstring) 中的版本比较。
修复 issue377,在 nose-compat 文档中澄清 pytest 不会将 unittest-API 复制到“plain”命名空间中。
修复 @mock’d 测试函数的详细报告。
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 交互(mark 插件中的集合名称假设 item 总是有一个函数,而对于这些插件来说这不是真的等等)。感谢 Andi Zeidler。
引入 node.get_marker/node.add_marker API,供 pytest-pep8 和 pytest-flakes 等插件使用,以避免 node.keywords 伪字典的混乱细节。修改了文档。
移除在启动时尝试“复制”stdout 的做法,因为它很麻烦。正常的捕获应该足以捕获测试搞乱标准 FD 的可能性。
添加 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¶
已知不兼容性
如果从 python2.7 或更高版本调用 –genscript,您只能获得一个在 python2.7 或更高版本上运行的独立脚本。使用 Python2.6 还可以获得一个 python2.5 兼容版本。
如果相应的 setup 方法失败,所有 xunit 样式的 teardown 方法(nose 样式、pytest 样式、unittest 样式)将不会被调用,请参阅下面的 issue322。
pytest_plugin_unregister 钩子从未被正确调用,并且没有已知的该钩子实现 - 因此它被移除。
pytest.fixture 装饰的函数不能再是生成器(即使用 yield)。如果这导致不可预见的实际问题,此更改可能会在 2.4.1 中撤销。但是,您总是可以编写并返回一个内部函数/生成器,并更改 fixture 消费者以迭代返回的生成器。此更改是代替新的
pytest.yield_fixture装饰器而进行的,请参见下文。
新功能
实验性地引入了一个新的
pytest.yield_fixture装饰器,它接受与 pytest.fixture 完全相同的参数,但要求 fixture 函数使用yield语句而不是return statement。这允许与 fixture 函数中的“with-style”上下文管理器直接集成,并且通常避免注册最终化回调,而是将“yield 之后”视为 teardown 代码。感谢 Andreas Pelme、Vladimir Keleshev、Floris Bruynooghe、Ronny Pfannschmidt 等人的讨论。如果也指定了“reason”,则允许直接使用 skipif/xfail 的布尔表达式。重新编写跳过文档以推荐“条件作为布尔值”,因为这可以防止在模块之间导入标记时出现意外。将条件指定为字符串将继续得到完全支持。
报告:根据失败/错误是否发生或所有都通过,将最后一行着色为红色或绿色。感谢 Christian Theunert。
使“import pdb ; pdb.set_trace()”在捕获方面原生工作(不再需要“-s”),使
pytest.set_trace()仅仅是一个快捷方式。修复 issue181:–pdb 现在也适用于收集错误(和内部错误)。这是通过轻微的内部重构和引入新的钩子
pytest_exception_interact钩子(参见下一项)来实现的。修复 issue341:引入新的实验性钩子,供 IDE/终端拦截调试:
pytest_exception_interact(node, call, report)。新的 monkeypatch.setattr() 变体,用于提供更短的调用来修补模块中的类/函数。
monkeypatch.setattr(“requests.get”, myfunc)
将用
myfunc替换“requests”模块的“get”函数。修复 issue322:如果 setUpClass 失败,tearDownClass 不会运行。感谢 Mathieu Agopian 的初步修复。同时使所有 pytest/nose finalizer 模仿相同的通用行为:如果 setupX 存在并失败,则不运行 teardownX。这在内部引入了一个新方法“node.addfinalizer()”助手,该助手只能在节点的设置阶段调用。
简化 pytest.mark.parametrize() 签名:允许传递逗号分隔的字符串来指定 argnames。例如:
pytest.mark.parametrize("input,expected", [(1,2), (2,3)])与以前的:pytest.mark.parametrize(("input", "expected"), ...)一样有效。添加对 setUpModule/tearDownModule 检测的支持,感谢 Brian Okken。
通过使用“argcomplete”集成选项的制表符补全。感谢 Anthon van der Neut 提供的 PR。
将选项名称更改为连字符分隔的长选项,但保持旧的拼写向后兼容。py.test -h 将只显示连字符版本,例如“–collect-only”,但“–collectonly”也将保持有效(出于向后兼容性原因)。非常感谢 Anthon van der Neut 的实现和 Hynek Schlawack 的推动。
修复 issue 308 - 允许在参数化时标记/xfail/跳过单个参数集。感谢 Brianna Laugher。
调用新的实验性 pytest_load_initial_conftests 钩子,允许第三方插件在加载 conftest 之前做一些事情。
Bug 修复
修复 issue358 - 捕获选项现在通过使用新的 parser.parse_known_args 方法解析得更正确。
pytest 现在使用 argparse 而不是 optparse(感谢 Anthon),这意味着如果安装到 python2.6 或更低版本环境中,“argparse”将作为依赖项添加。
修复 issue333:修复一个不好的 unittest/pytest 钩子交互案例。
PR27:在收集期间正确处理 nose.SkipTest。感谢 Antonio Cuni,Ronny Pfannschmidt。
修复 issue355:junitxml 将 name=”pytest” 属性添加到 testsuite 标签。
修复 issue336:插件中的自动使用 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 finalizer(以前 finalizer 不总是被调用)。
修复 issue320 - 修复 fixture 的类作用域与模块级函数混合使用时的问题。感谢 Anatoly Bubenkoff。
您可以指定“-q”或“-qq”以获得不同级别的“更安静”报告(感谢 Katarzyna Jachim)。
修复 issue300 - 修复在子目录中启动 py.test 时 conftest 加载顺序的问题。
修复 issue323 - 许多模块作用域参数化参数的排序。
使 sessionfinish 钩子以与会话开始时相同的 cwd 上下文执行(有助于修复使用相对路径写入输出文件的插件行为,例如 pytest-cov)。
修复 issue316 - 正确引用文档中的收集钩子。
修复 issue 306 - 清理 -k/-m 选项以分别仅匹配标记/测试名称/关键字。感谢 Wouter van Ackooy。
改进了 python 模块中 doctests 的 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) 钩子现在可以使用“.section(title)”和“.line(msg)”方法在测试运行结束时打印额外信息。
2.3.5 (2013-04-30)¶
修复 issue169:也尊重 setup/teardown 错误的 –tb=style。
从不将 fixture 函数用于测试函数收集。
允许重新运行测试项 / 有助于修复 pytest-reruntests 插件,也有助于保持更少的 fixture/资源引用。
将捕获的 stdout/stderr 放入 junitxml 输出,即使对于通过的测试也是如此(感谢 Adam Goucher)。
Issue 265 - 将 nose setup/teardown 与 setupstate 集成,这样如果它没有 setup 就不会尝试 teardown。
issue 271 - 不要在 worker 节点上写入 junitxml。
Issue 274 - 当 doctest 不知道示例位置时,不要尝试显示完整的 doctest 示例。
issue 280 - 在有 bug 的 CPython 2.6.0 上禁用断言重写。
注入“getfixture()”助手以从 doctests 检索 fixture,感谢 Andreas Zeidler。
issue 259 - 当断言重写时,与 Python 2 上默认的 ASCII 源编码保持一致。
issue 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 测试发现时指定以“_”开头的 Prefixes。(感谢 Graham Horler)
通过将额外数据放在新行并增加缩进来改进 PYTEST_DEBUG 跟踪输出。
确保跳过/失败等 OutcomeExceptions 已初始化异常属性。
issue 260 - 不在普通的 unittest 用例上使用 nose 特殊设置。
修复 issue134 - 打印阻止运行指定测试项的收集错误。
修复 issue266 - 接受 MarkEvaluator 表达式中的 unicode。
2.3.4 (2012-11-20)¶
生成的测试函数现在将激活自动使用 fixture,但不能接受 fixture 作为 funcargs - 无论如何,建议使用 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 拆卸的 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 的 request 对象,该对象在没有活动请求时会因 getattr 访问而崩溃。感谢 Thomas Waldmann。
修复 issue213 - 允许使用不支持 __eq__ 运算符的值(如 numpy 数组)进行参数化。
修复 issue215 - 将 test_python.org 拆分为多个文件。
修复 issue148 - @unittest.skip on classes 现在被识别并避免调用 setUpClass/tearDownClass,感谢 Pavel Repin。
修复 issue209 - 通过依赖于重新引入了 pre-AST 解释器语句查找的新 pylib 版本,重新引入 python2.4 支持。
nose 支持:仅当 setup 是 callable 时才调用,感谢 Andrew Taumoefolau。
修复 issue219 - 将 py2.4-3.3 分类器添加到 TROVE 列表。
在回溯中,*,** 参数值现在与普通参数一起显示(感谢 Manuel Jacob)。
修复 issue217 - 支持 mock.patch 与 pytest 的 fixture - 请注意,您需要 mock-1.0.1 或 python3.3 内置的 unittest.mock。
修复 issue127 - 改进 pytest_addoption() 的文档,并添加一个
config.getoption(name)助手函数以保持一致性。
2.3.2 (2012-10-25)¶
修复 issue208 和 issue29 使用新的 py 版本,以避免在长模块中打印回溯时长时间暂停。
修复 issue205 - 子目录中自定义 pytest_pycollect_makemodule 和 pytest_pycollect_makeitem 的 conftest 现在可以正常工作。
修复参数化设置的拆卸顺序。
修复 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 分发包中,以便为运行 pytest 自身测试的维护者正确分发 ignore-dirs 和其他配置位。
2.3.1 (2012-10-20)¶
修复 issue202 - 修复回归:从 fixture 函数中使用“self”现在按预期工作(它是使用 fixture 的测试方法所看到的相同的“self”实例)。
由于 pexpect 不支持(挂起),在 freebsd* 系统上跳过使用 pexpect 的测试(主要是 test_pdb.py)。
从 –markers 输出链接到网页,为 pytest.mark.* 的使用提供帮助。
2.3.0 (2012-10-19)¶
修复 issue202 - 更好地为参数化测试函数自动命名。
修复 issue139 - 引入 @pytest.fixture,它允许直接作用域和参数化 funcarg 工厂。
修复 issue198 - 在某些情况下,由于路径操作问题,带有嵌套目录结构的 windows32 无法找到 conftest fixture。
修复 issue193 跳过参数化为空参数集的测试函数。
修复 python3.3 兼容性,主要是之前依赖于字典顺序的报告部分。
引入按资源和参数化设置重新排序测试,这优先于通常的文件排序。
修复 issue185 monkeypatching time.time 不会导致 pytest 失败。
修复 issue172 pytest.fixture 装饰的 setup_module 函数重复调用。
修复 junitxml=path 构造,以便如果测试更改了当前工作目录且路径是相对路径,它能从原始当前工作目录正确构造。
修复“python setup.py test”示例以导致正确的“errno”返回。
修复 issue165 - 修复损坏的文档链接并提及 Stack Overflow 中的常见问题解答。
捕获将失败表示写入终端时的 unicode 问题,以防止整个会话崩溃。
修复 xfail/skip 混淆:skip-mark 或命令式 pytest.skip 现在优先于 xfail-markers,因为在跳过的情况下我们无法确定 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__ 对象的魔术全局 callable(例如 mock.call)而失败。
修复 issue 182:testdir.inprocess_run 现在考虑传入的插件。
- 修复 issue 188:确保 sys.exc_info 在 python2 上是清晰的。
在调用测试之前。
修复 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:正确匹配所有无效的 xml 字符以进行 junitxml 二进制转义。
修复 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 钩子现在都提供了“nextitem”,它为 None 表示测试运行结束。
修复由于未知来源收集项导致的收集崩溃,感谢 Ralf Schmitt(通过依赖更近期的 pylib 修复)。
2.2.0 (2011-11-18)¶
修复 issue90:引入测试项的急切拆卸,以便更早地调用拆卸函数。
添加一个功能强大的 metafunc.parametrize 函数,它允许分多步参数化测试函数参数,因此可以从独立的插件和位置进行参数化。
添加 @pytest.mark.parametrize 助手,它允许使用不同的参数值轻松调用测试函数。
在“参数化”示例页面中添加示例,包括测试场景的快速移植以及新的参数化函数和装饰器。
通过 ini 文件或插件钩子引入“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 现在可以在 python3 上使用。
修复 issue89:–pdb 在 doctest 中出现意外异常时更合理地工作。
修复并清理 pytest 自身的测试套件,使其不泄漏 FD。
修复 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 钩子应用于测试子集。
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 钩子中工作。
修复 issue60 / 修复涉及创建 __pycache__ 的错误条件。
修复 issue63 / 涉及包含“%”字符串的插入的断言重写。
修复带有 ** 参数的调用上的断言重写。
如果禁用字节码生成,则不缓存重写模块。
修复只读目录中的断言重写。
修复 issue59:为 junitxml 输出提供 system-out/err 标签。
修复 issue61:3 个或更多操作数的布尔运算上的断言重写。
您现在可以使用“cd doc ; make man”构建手册页。
2.1.0 (2011-07-09)¶
修复 issue53 以正确的顺序调用 nosestyle setup 函数。
修复 issue58 和 issue59:新的断言代码修复。
合并 Benjamin 的断言重写分支:现在 Python 2.6 及更高版本上的测试模块的断言是通过重写 AST 并在导入测试模块之前保存 pyc 文件来完成的。有关详细信息,请参阅 doc/assert.txt。
修复 issue43:改进 doctests,在出现意外异常时提供更好的回溯报告。
修复 issue47:junitxml 中测试用例的计时输出现在正确。
修复 issue48:MarkInfo repr 中的拼写错误导致异常。
修复 issue49:避免在初始化部分失败时出现令人困惑的错误。
修复 issue44:junitxml 文件路径的环境/用户名扩展。
在 pypy 的测试运行中显示 releaselevel 信息。
重构文档页面以实现更好的导航和 PDF 生成。
即使在会话启动期间中断,也报告 KeyboardInterrupt。
修复 issue 35 - 提供 PDF 文档版本和索引页面的下载链接。
2.0.3 (2011-05-11)¶
修复 issue38:对钩子调用(特别是早期的 configure/sessionstart 钩子)进行更友好的回溯。
修复 junitxml 文件中缺失的跳过原因/元信息,通过 http://lists.idyll.org/pipermail/testing-in-python/2011-March/003928.html 报告。
修复 issue34:避免带有“test”前缀的派生自对象的类导致收集失败。
在实际未使用 –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 钩子生成的测试函数调用。
修复 issue27 - collectonly 和关键字选择 (-k) 现在可以协同工作。此外,如果您执行“py.test –collectonly -q”,您现在会得到一个扁平的测试 ID 列表,您可以将其粘贴到 py.test 命令行以执行特定测试。
修复 issue25 避免报告 –pdb 和 python3.2/编码输出的问题。
修复 issue23 - tmpdir 参数现在在 Python3.2 和 WindowsXP 上可用。从 Python3.2 开始,os.symlink 可能受支持。通过要求较新的 py lib 版本,py.path.local() 实现会承认这一点。
修复了文档中的拼写错误(感谢 Victor Garcia,Brianna Laugher),特别感谢 Laura Creighton 也审查了部分文档。
修复 verbose 进度报告中类输出的轻微错误(感谢 Amaury)。
更精确地(避免)node.Class|Function 访问的弃用警告。
避免回溯中的标准 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 兼容性测试与 python3 兼容(现在 nose-1.0 支持 python3)。
移除有些令人惊讶的“相同-conftest”检测,因为它在多个子目录中出现 conftest.py 时会忽略它们。
改进断言(“not in”),感谢 Floris Bruynooghe。
改进在“python -OO”上运行时(断言和文档字符串被关闭,可能导致假阳性)的行为/警告。
引入 pytest_cmdline_processargs(args) 钩子,允许命令行参数的动态计算。这修复了回归,因为 py.test 在 2.0 之前允许从 conftest.py 文件设置命令行选项,而 pytest-2.0 至今只允许从 ini 文件设置。
修复 issue7:doctest 模块中的断言失败。doctests 中意外的失败通常会显示得更清晰,即在 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 插件。
修复由于 collection-before-running 语义导致的已生成的测试的回归,这些测试未像 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 - 标记现在也适用于 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”创建,现在将创建与测试名称更好地关联的 basename(感谢 Ronny)。
“xpass”(意外通过)测试不会导致 exitcode!=0。
修复 issue131 / issue60 - 在用作命名空间包的 __init__ 文件中导入 doctests。
修复 bug:导入 conftest.py 时捕获 stdout/stderr。
修复 bug:unittest 收集的函数现在也可以在类/模块级别应用“pytestmark”。
添加对 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 作为上下文管理器,示例。
with py.test.raises(ZeroDivisionError): x = 0 1 / x with py.test.raises(RuntimeError) as excinfo: call_something() # you may do extra checks on excinfo.value|type|traceback here
(感谢 Ronny Pfannschmidt)
Funcarg 工厂现在可以动态地对测试调用应用标记。例如,如果工厂为测试提供预期会失败的参数,这会很有用。
def pytest_funcarg__arg(request): request.applymarker(py.test.mark.xfail(reason="flaky config")) ... def test_function(arg): ...
改进了收集和导入错误报告。这利用了一个更通用的机制,即对于自定义测试项/收集节点,现在统一调用
node.repr_failure(excinfo),这样您可以覆盖它以返回您选择的字符串错误表示,该表示将作为(红色)字符串报告。引入“–junitprefix=STR”选项,用于在 junitxml 文件中所有报告前添加前缀。
Bug 修复
使测试以及
pytest_recwarn插件特别是完全兼容 Python2.7(如果您使用recwarnfuncarg,警告将被启用,以便您可以跨 Python 正确检查它们的存在)。完善 –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-plugin 中执行分布式测试相关报告,而不是在通用 py.test 分发包中包含与分布式相关的代码。
修复 Windows 上的 homedir 检测。
发布 distribute_setup.py 版本 0.6.13。
1.3.1 (2010-05-25)¶
新功能
issue91:引入新的 py.test.xfail(reason) 助手,用于命令式地将测试标记为预期失败。可以在 setup 和测试函数中使用。这对于参数化测试特别有用,当某些配置预期失败时。在这种情况下,不能使用带有 @py.test.mark.xfail 的声明式方法,因为它会标记所有配置为 xfail。
issue102:引入新的 –maxfail=NUM 选项,在 NUM 次失败后停止测试运行。这是‘-x’或‘–exitfirst’选项的推广,现在它等同于‘–maxfail=1’。‘-x’和‘–maxfail’现在都会在末尾打印一行指示中断。
issue89:允许 py.test.mark 装饰器用于类(类装饰器是在 python2.6 中引入的),并且还允许通过指定列表在类/模块级别应用多个标记。
改进和完善进度条中的字母报告:. 通过 f 失败的测试 s 跳过的测试(提醒:仅用于依赖/平台不匹配)x 预期失败的测试(预期失败但失败的测试)X 预期失败但通过的测试(预期失败但通过的测试)
您可以将“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”字符任意组合组成的字符串参数。它们与你在点状进度打印期间看到的单个字符相关,并会在测试运行结束时为每个测试打印一行额外信息。这额外的一行指示了你可以直接粘贴到 py.test 命令行以重新运行特定测试的确切位置或测试 ID。
允许外部插件通过新的 pytest_addhooks(pluginmanager) 钩子注册新的钩子。新发布的用于分布式和循环失败测试的 pytest-xdist 插件需要此功能。
添加新的 pytest_ignore_collect(path, config) 钩子,允许项目和插件为其目录结构定义排除行为 - 例如,您可以在 conftest.py 中定义此方法。
def pytest_ignore_collect(path): return path.check(link=1)
以防止甚至在符号链接目录中尝试收集任何测试。
新的 pytest_pycollect_makemodule(path, parent) 钩子,允许自定义匹配测试模块的 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 组合,但请注意:jython2.5.1/win32 不提供命令行启动器,请参见 https://bugs.jython.org/issue1491。有关如何解决此问题,请参阅 pylib 安装文档。
修复 unicode 异常值和不可打印对象的处理
(issue87) 修复 assertionold 代码中的 unboundlocal 错误
(issue86) 改进 looponfailing 的文档
完善 IO 捕获:stdin-redirect 伪文件现在具有 NOP close() 方法
发布 distribute_setup.py 版本 0.6.10
添加了指向新的 capturelog 和 coverage 插件的链接
1.2.0 (2010-01-18)¶
完善了“py.cleanup”的用法和选项
py.cleanup # remove "*.pyc" and "*$py.class" (jython) files py.cleanup -e .swp -e .cache # also remove files with these extensions py.cleanup -s # remove "build" and "dist" directory next to setup.py files py.cleanup -d # also remove empty directories py.cleanup -a # synonym for "-s -d -e 'pip-log.txt'" py.cleanup -n # dry run, only show what would be removed
添加了一个新选项“py.test –funcargs”,它显示给定测试路径可用的 funcargs 及其帮助字符串(其各自工厂函数上的 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”钩子可以返回要在测试运行标题中显示的其他行。
(实验性) 允许“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 收集钩子。
特定于收集/项节点的 runtest/collect 钩子仅在完全匹配的 conftest.py 文件上调用,即位于项文件系统路径正下方的文件
更改:第一个返回内容的 pytest_collect_directory 钩子现在将阻止进一步的钩子被调用。
更改:figleaf 插件现在需要 –figleaf 才能运行。还将其长命令行选项缩短了一些(参见 py.test -h)。
更改:pytest doctest 插件现在默认启用,并有一个新选项 –doctest-glob 用于设置文件匹配模式。
更改:删除内部 py._* 助手变量,只保留 py._pydir
增强捕获功能,使其在自定义 pytest_runtest_setup 代码失败并阻止捕获设置代码运行的情况下也能正常工作。
使默认插件提供的 py.test.* 助手在早期可见——对于 pydoc 和交互式会话都透明地工作,例如,它们会定期看到 py.test.mark 和 py.test.importorskip。
简化内部插件管理器机制
通过引入 RootCollector 节点简化内部收集树
修复断言重新解释,该断言会看到包含“keyword=…”的调用
修复 issue66:在分布式测试期间,在工作节点上调用 pytest_sessionstart 和 pytest_sessionfinish 钩子,正确报告模块/会话拆卸钩子。
修复 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 路径:修复了 svn 路径 path.check(versioned=True) 的错误,允许 svn 路径中包含“%”,使 svnwc.update() 默认为交互模式,如 1.0.x 中,并添加 svnwc.update(interactive=False) 以禁用交互。
完善分布式 tarball 以包含测试和无 pyc 文件
更努力地使 py.compat.* 访问的弃用警告报告正确的位置
1.0.3¶
调整和改进文档
移除 py.rest 工具和内部命名空间 - 它从未真正宣传过,如果需要,仍可与旧版本一起使用。如果有兴趣,我想它可以复活为自己的工具。
修复 issue48 和 issue59:如果导入测试文件中的模块似乎不是来自文件路径,则引发错误 - 避免了反复报告的“同名”混淆
合并了 Ronny 的 nose 兼容性 hack:现在支持 nose 风格的 setup_module() 和 setup() 函数
引入通用化的 py.test.mark 函数标记
重组/完善命令行分组
弃用 parser.addgroup,转而使用创建选项组的 getgroup
添加 –report 命令行选项,允许控制跳过/xfail 部分的显示
通用化跳过:一种基于平台或 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 在这方面的帮助。
整合内置实现以兼容 >=2.3,添加助手以方便保持 2 和 3k 兼容代码
弃用 py.compat.doctest|subprocess|textwrap|optparse
弃用 py.magic.autopath,移除 py/magic 目录
将 pytest 断言处理移至 py/code 和 pytest_assertion 插件,添加“–no-assert”选项,弃用 py.magic 命名空间,转而使用(更少的)py.code 命名空间。
整合并清理 py/code 类和文件
清理 py/misc,将测试移至 bin-for-dist
在 py.test 的 monkeypatch funcarg 中引入 delattr/delitem/delenv 方法
整合 py.log 实现,移除旧方法。
引入 py.io.TextIO 和 py.io.BytesIO 用于区分文本/unicode 和字节流(如果可用,使用底层标准库 io.*)
提供 py.unittest_convert 助手脚本,该脚本将“unittest.py”风格的文件转换为更简单的 assert/direct-test-classes py.test/nosetests 风格。该脚本由 Laura Creighton 编写。
简化内部 localpath 实现
1.0.2 (2009-08-27)¶
修复打包问题,由 fedora redhat 打包触发,还在 tarball 中添加了 doc、examples 和 contrib 目录。
添加了指向新的 django 插件的文档链接。
1.0.1 (2009-08-19)¶
添加了一个“pytest_nose”插件,该插件处理 nose.SkipTest、nose 风格的函数/方法/生成器 setup/teardown,并尝试正确报告函数。
对 sys.stdout/err 的 unicode 写入或编码字符串的捕获效果更好,终端写入也进行了调整,并在 Windows 和 Linux 之间统一了。
大大改进了文档布局和内容
添加了“–help-config”选项以显示所有 longopt 命令行选项的 conftest.py / ENV-var 名称,以及一些特殊的 conftest.py 变量。相应地将“conf_capture”conftest 设置重命名为“option_capture”。
修复 issue #27:更好地报告命令行上给定的不可收集项(例如 pyc 文件)
修复 issue #33:添加 –version 标志(感谢 Benjamin Peterson)
修复 issue #32:为 wcpath.status() 添加了对“不完整”路径的支持
如果“Test”前缀的类有 __init__ 方法,则默认不再收集它们
monkeypatch setenv() 现在接受“prepend”参数
改进了收集错误追溯的报告
简化了 multicall 机制和插件架构,重命名了一些内部方法和参数名
1.0.0 (2009-08-04)¶
更简洁的报告,尝试显示文件系统路径相对于当前目录
稍微改善 xfail 输出
1.0.0b9 (2009-07-31)¶
干净地处理和报告测试设置的最终拆卸
修复 svn-1.6 与 py.path.svnwc().versioned() 的兼容性问题(感谢 Wouter Vanden Hove)
设置/拆卸或收集问题现在显示为 ERROR 或进度行中的大“E”。它们被单独报告和计数。
分布式测试:正确处理在本地收集但在远程无法收集的测试项——通常是由于平台/依赖关系原因
简化的 py.test.mark API - 请参阅关键字插件文档
更好地与日志记录集成:捕获现在默认将测试函数及其直接的 setup/teardown 捕获到一个流中
capsys 和 capfd funcargs 现在有一个 readouterr() 和一个 close() 方法(底层使用了 py.io.StdCapture/FD 对象,它们也增加了一个 readouterr() 方法来返回捕获的 out/err 快照)
使断言重新解释更好地处理不返回布尔值的比较(来自 numpy,感谢 maciej fijalkowski 报告)
将每个测试的输出捕获重构到 pytest_iocapture.py 插件中,从而从配置对象中删除了捕获代码
item.repr_failure(excinfo) 而不是 item.repr_failure(excinfo, outerr)
1.0.0b8 (2009-07-22)¶
pytest_unittest 插件现在默认启用
引入了 pytest_keyboardinterrupt 钩子并完善了 pytest_sessionfinish 钩子,添加了测试。
解决了一个有问题的日志模块交互(“关闭已关闭的文件”)。感谢 Sridhar Ratnakumar 的触发。
如果插件使用“py.test.importorskip”导入依赖项,则只会发出警告,而不是退出测试过程。
文档的许多改进:- 完善了 funcargs 文档,使用术语“factory”代替“provider” - 添加了一个新的讲座/教程文档页面 - 更好的下载页面 - 更好的插件 docstrings - 添加了新的插件页面和自动文档生成脚本
修复了与部分失败的 funcarg 设置相关的拆卸问题(感谢 MrTopf 报告),现在即使“pytest_runtest_setup”失败,“pytest_runtest_teardown”也总是被调用。
调整了 py 模块中 docstrings 的 doctest 输出,感谢 Radomir。
1.0.0b7¶
将 py.test.xfail 重命名回 py.test.mark.xfail,以避免两种装饰 xfail 的方式
重新添加了 py.test.mark 装饰器用于在函数上设置关键字(它实际上有文档,所以移除它不太好)
从 request.addfinalizer() 中移除 scope 参数,因为 request.cached_setup 有 scope 参数。TOOWTDI。
在报告失败之前执行设置最终化
应用 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 对象,允许将函数的执行 fork 到子进程并获取结果。
XXX 此处缺少很多内容 XXX
0.9.2¶
完善了安装和元数据,创建了新的 setup.py,现在基于 setuptools/ez_setup(感谢 Ralf Schmitt 的支持)。
改进了在 Windows 环境中提供 py.* 脚本的方式,它们现在以“.cmd”文件的形式添加到 Scripts 目录中。
py.path.svnwc.status() 现在更完整,如果可用,使用“svn”命令的 xml 输出 (Guido Wesdorp)
修复 py.path.svn* 以与 svn 1.5 兼容 (Chris Lamb)
修复 Windows 上 path.relto(otherpath) 方法,使用 normcase 检查路径是否相对。
py.test 的追溯信息更容易从编辑器解析(遵循 filenames:LINENO: MSG 约定)(感谢 Osmo Salomaa)
修复 javascript-generation,“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 中对非版本化文件的 wcpath 调用 .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 中调用 atexit (py.execnet) [45548]
修复了 py.execnet 的 servemain 中线程连接的错误 [45549]
重构了 py.test.rsession 测试,使其不再依赖于精确的输出格式 [45646]
对测试结果使用 repr() [45647]
为 py.test.skip() 添加了“Reason”类 [45648, 45649]
移除了 py.test.collect 中一些不必要的健全性检查 [45655]
避免在 py.io.fdcapture 中使用 os.tmpfile(),因为在 Windows 上它只能由管理员使用 [45901]
在 py.path.svnwc 中添加了对锁定和非递归提交的支持 [45994]
在 py.execnet 中锁定文件以防止 CPython 出现段错误 [46010]
为 py.path.svnurl 添加了 export() 方法
修复了 py.test 中的 -d -x [47277]
修复了 py.path.svnwc 中的参数连接问题 [49423]
恢复 py.test 的行为,即当有失败时以代码 1 退出 [49974]
不对没有伴随 .txt 文件的 html 文件失败 [50606]
修复了“utestconvert.py < input” [50645]
py.code.source 中代码缩进的小修复 [50755]
修复 _docgen.py 文档构建 [51285]
改进了 py.test 中代码块源表示的检查 [51292]
添加了对将身份验证传递给 py.path.svn* 对象([52000, 52001])的支持
移除了 py.apigen 测试的 sorted() 调用,转而使用 [].sort() 以支持 Python 2.3 [52481]