Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
66ff8dffdf | ||
|
|
3ffcfd122c | ||
|
|
0b28313b46 | ||
|
|
f3dd93ad8d | ||
|
|
bb5a1257b0 | ||
|
|
f179bf252f | ||
|
|
2b671b5f92 | ||
|
|
65ab7cb96c | ||
|
|
4d5fb7d71c | ||
|
|
cbe5996cc6 | ||
|
|
c9e9315725 | ||
|
|
328001eab1 | ||
|
|
8fdb72947e | ||
|
|
5c1c73b961 | ||
|
|
a152c2cee4 | ||
|
|
69c3bcea36 | ||
|
|
6bd3f31344 | ||
|
|
9b6219b5e8 |
@@ -29,5 +29,3 @@ exclude_lines =
|
||||
|
||||
^\s*if TYPE_CHECKING:
|
||||
^\s*@overload( |$)
|
||||
|
||||
^\s*@pytest\.mark\.xfail
|
||||
|
||||
@@ -31,5 +31,3 @@ c9df77cbd6a365dcb73c39618e4842711817e871
|
||||
4546d5445aaefe6a03957db028c263521dfb5c4b
|
||||
# Migration to ruff / ruff format
|
||||
4588653b2497ed25976b7aaff225b889fb476756
|
||||
# Use format specifiers instead of percent format
|
||||
4788165e69d08e10fc6b9c0124083fb358e2e9b0
|
||||
|
||||
20
.github/chronographer.yml
vendored
20
.github/chronographer.yml
vendored
@@ -1,20 +0,0 @@
|
||||
---
|
||||
|
||||
branch-protection-check-name: Changelog entry
|
||||
action-hints:
|
||||
check-title-prefix: "Chronographer: "
|
||||
external-docs-url: >-
|
||||
https://docs.pytest.org/en/latest/contributing.html#preparing-pull-requests
|
||||
inline-markdown: >-
|
||||
See
|
||||
https://docs.pytest.org/en/latest/contributing.html#preparing-pull-requests
|
||||
for details.
|
||||
enforce-name:
|
||||
suffix: .rst
|
||||
exclude:
|
||||
humans:
|
||||
- pyup-bot
|
||||
labels:
|
||||
skip-changelog: skip news
|
||||
|
||||
...
|
||||
7
.github/patchback.yml
vendored
7
.github/patchback.yml
vendored
@@ -1,7 +0,0 @@
|
||||
---
|
||||
|
||||
backport_branch_prefix: patchback/backports/
|
||||
backport_label_prefix: 'backport ' # IMPORTANT: the labels are space-delimited
|
||||
# target_branch_prefix: '' # The project's backport branches are non-prefixed
|
||||
|
||||
...
|
||||
51
.github/workflows/backport.yml
vendored
Normal file
51
.github/workflows/backport.yml
vendored
Normal file
@@ -0,0 +1,51 @@
|
||||
name: backport
|
||||
|
||||
on:
|
||||
# Note that `pull_request_target` has security implications:
|
||||
# https://securitylab.github.com/research/github-actions-preventing-pwn-requests/
|
||||
# In particular:
|
||||
# - Only allow triggers that can be used only be trusted users
|
||||
# - Don't execute any code from the target branch
|
||||
# - Don't use cache
|
||||
pull_request_target:
|
||||
types: [labeled]
|
||||
|
||||
# Set permissions at the job level.
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
backport:
|
||||
if: startsWith(github.event.label.name, 'backport ') && github.event.pull_request.merged
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
persist-credentials: true
|
||||
|
||||
- name: Create backport PR
|
||||
run: |
|
||||
set -eux
|
||||
|
||||
git config --global user.name "pytest bot"
|
||||
git config --global user.email "pytestbot@gmail.com"
|
||||
|
||||
label='${{ github.event.label.name }}'
|
||||
target_branch="${label#backport }"
|
||||
backport_branch=backport-${{ github.event.number }}-to-"${target_branch}"
|
||||
subject="[$target_branch] $(gh pr view --json title -q .title ${{ github.event.number }})"
|
||||
|
||||
git checkout origin/"${target_branch}" -b "${backport_branch}"
|
||||
git cherry-pick -x --mainline 1 ${{ github.event.pull_request.merge_commit_sha }}
|
||||
git commit --amend --message "$subject"
|
||||
git push --set-upstream origin --force-with-lease "${backport_branch}"
|
||||
gh pr create \
|
||||
--base "${target_branch}" \
|
||||
--title "${subject}" \
|
||||
--body "Backport of PR #${{ github.event.number }} to $target_branch branch. PR created by backport workflow."
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
4
.github/workflows/deploy.yml
vendored
4
.github/workflows/deploy.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
persist-credentials: false
|
||||
|
||||
- name: Build and Check Package
|
||||
uses: hynek/build-and-inspect-python-package@v2.6.0
|
||||
uses: hynek/build-and-inspect-python-package@v2.5.0
|
||||
with:
|
||||
attest-build-provenance-github: 'true'
|
||||
|
||||
@@ -54,7 +54,7 @@ jobs:
|
||||
path: dist
|
||||
|
||||
- name: Publish package to PyPI
|
||||
uses: pypa/gh-action-pypi-publish@v1.9.0
|
||||
uses: pypa/gh-action-pypi-publish@v1.8.14
|
||||
|
||||
- name: Push tag
|
||||
run: |
|
||||
|
||||
44
.github/workflows/test.yml
vendored
44
.github/workflows/test.yml
vendored
@@ -14,11 +14,6 @@ on:
|
||||
branches:
|
||||
- main
|
||||
- "[0-9]+.[0-9]+.x"
|
||||
types:
|
||||
- opened # default
|
||||
- synchronize # default
|
||||
- reopened # default
|
||||
- ready_for_review # used in PRs created from the release workflow
|
||||
|
||||
env:
|
||||
PYTEST_ADDOPTS: "--color=yes"
|
||||
@@ -40,7 +35,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
persist-credentials: false
|
||||
- name: Build and Check Package
|
||||
uses: hynek/build-and-inspect-python-package@v2.6.0
|
||||
uses: hynek/build-and-inspect-python-package@v2.5.0
|
||||
|
||||
build:
|
||||
needs: [package]
|
||||
@@ -187,26 +182,6 @@ jobs:
|
||||
tox_env: "doctesting"
|
||||
use_coverage: true
|
||||
|
||||
continue-on-error: >-
|
||||
${{
|
||||
contains(
|
||||
fromJSON(
|
||||
'[
|
||||
"windows-py38-pluggy",
|
||||
"windows-py313",
|
||||
"ubuntu-py38-pluggy",
|
||||
"ubuntu-py38-freeze",
|
||||
"ubuntu-py313",
|
||||
"macos-py38",
|
||||
"macos-py313"
|
||||
]'
|
||||
),
|
||||
matrix.name
|
||||
)
|
||||
&& true
|
||||
|| false
|
||||
}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@@ -247,21 +222,8 @@ jobs:
|
||||
- name: Upload coverage to Codecov
|
||||
if: "matrix.use_coverage"
|
||||
uses: codecov/codecov-action@v4
|
||||
continue-on-error: true
|
||||
with:
|
||||
fail_ci_if_error: false
|
||||
fail_ci_if_error: true
|
||||
files: ./coverage.xml
|
||||
verbose: true
|
||||
|
||||
check: # This job does nothing and is only used for the branch protection
|
||||
if: always()
|
||||
|
||||
needs:
|
||||
- build
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Decide whether the needed jobs succeeded or failed
|
||||
uses: re-actors/alls-green@223e4bb7a751b91f43eda76992bcfbf23b8b0302
|
||||
with:
|
||||
jobs: ${{ toJSON(needs) }}
|
||||
|
||||
13
.github/workflows/update-plugin-list.yml
vendored
13
.github/workflows/update-plugin-list.yml
vendored
@@ -46,8 +46,7 @@ jobs:
|
||||
run: python scripts/update-plugin-list.py
|
||||
|
||||
- name: Create Pull Request
|
||||
id: pr
|
||||
uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c
|
||||
uses: peter-evans/create-pull-request@9153d834b60caba6d51c9b9510b087acf9f33f83
|
||||
with:
|
||||
commit-message: '[automated] Update plugin list'
|
||||
author: 'pytest bot <pytestbot@users.noreply.github.com>'
|
||||
@@ -56,13 +55,3 @@ jobs:
|
||||
branch-suffix: short-commit-hash
|
||||
title: '[automated] Update plugin list'
|
||||
body: '[automated] Update plugin list'
|
||||
draft: true
|
||||
|
||||
- name: Instruct the maintainers to trigger CI by undrafting the PR
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ github.token }}
|
||||
run: >-
|
||||
gh pr comment
|
||||
--body 'Please mark the PR as ready for review to trigger PR checks.'
|
||||
--repo '${{ github.repository }}'
|
||||
'${{ steps.pr.outputs.pull-request-number }}'
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -25,6 +25,7 @@ src/_pytest/_version.py
|
||||
|
||||
doc/*/_build
|
||||
doc/*/.doctrees
|
||||
doc/*/_changelog_towncrier_draft.rst
|
||||
build/
|
||||
dist/
|
||||
*.egg-info
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
repos:
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: "v0.4.10"
|
||||
rev: "v0.4.1"
|
||||
hooks:
|
||||
- id: ruff
|
||||
args: ["--fix"]
|
||||
@@ -10,7 +10,12 @@ repos:
|
||||
hooks:
|
||||
- id: trailing-whitespace
|
||||
- id: end-of-file-fixer
|
||||
- id: fix-encoding-pragma
|
||||
args: [--remove]
|
||||
- id: check-yaml
|
||||
- id: debug-statements
|
||||
exclude: _pytest/(debugging|hookspec).py
|
||||
language_version: python3
|
||||
- repo: https://github.com/adamchainz/blacken-docs
|
||||
rev: 1.16.0
|
||||
hooks:
|
||||
@@ -21,7 +26,7 @@ repos:
|
||||
hooks:
|
||||
- id: python-use-type-annotations
|
||||
- repo: https://github.com/pre-commit/mirrors-mypy
|
||||
rev: v1.10.0
|
||||
rev: v1.9.0
|
||||
hooks:
|
||||
- id: mypy
|
||||
files: ^(src/|testing/|scripts/)
|
||||
@@ -38,25 +43,20 @@ repos:
|
||||
# on <3.11
|
||||
- exceptiongroup>=1.0.0rc8
|
||||
- repo: https://github.com/tox-dev/pyproject-fmt
|
||||
rev: "2.1.3"
|
||||
rev: "1.8.0"
|
||||
hooks:
|
||||
- id: pyproject-fmt
|
||||
# https://pyproject-fmt.readthedocs.io/en/latest/#calculating-max-supported-python-version
|
||||
additional_dependencies: ["tox>=4.9"]
|
||||
- repo: https://github.com/asottile/pyupgrade
|
||||
rev: v3.16.0
|
||||
hooks:
|
||||
- id: pyupgrade
|
||||
stages: [manual]
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: pylint
|
||||
name: pylint
|
||||
entry: pylint
|
||||
language: system
|
||||
types: [python]
|
||||
args: ["-rn", "-sn", "--fail-on=I"]
|
||||
stages: [manual]
|
||||
- id: pylint
|
||||
name: pylint
|
||||
entry: pylint
|
||||
language: system
|
||||
types: [python]
|
||||
args: ["-rn", "-sn", "--fail-on=I"]
|
||||
stages: [manual]
|
||||
- id: rst
|
||||
name: rst
|
||||
entry: rst-lint --encoding utf-8
|
||||
@@ -66,50 +66,9 @@ repos:
|
||||
- id: changelogs-rst
|
||||
name: changelog filenames
|
||||
language: fail
|
||||
entry: >-
|
||||
changelog files must be named
|
||||
####.(
|
||||
breaking
|
||||
| deprecation
|
||||
| feature
|
||||
| improvement
|
||||
| bugfix
|
||||
| vendor
|
||||
| doc
|
||||
| packaging
|
||||
| contrib
|
||||
| misc
|
||||
)(.#)?(.rst)?
|
||||
exclude: >-
|
||||
(?x)
|
||||
^
|
||||
changelog/(
|
||||
\.gitignore
|
||||
|\d+\.(
|
||||
breaking
|
||||
|deprecation
|
||||
|feature
|
||||
|improvement
|
||||
|bugfix
|
||||
|vendor
|
||||
|doc
|
||||
|packaging
|
||||
|contrib
|
||||
|misc
|
||||
)(\.\d+)?(\.rst)?
|
||||
|README\.rst
|
||||
|_template\.rst
|
||||
)
|
||||
$
|
||||
entry: 'changelog files must be named ####.(breaking|bugfix|deprecation|doc|feature|improvement|trivial|vendor).rst'
|
||||
exclude: changelog/(\d+\.(breaking|bugfix|deprecation|doc|feature|improvement|trivial|vendor).rst|README.rst|_template.rst)
|
||||
files: ^changelog/
|
||||
- id: changelogs-user-role
|
||||
name: Changelog files should use a non-broken :user:`name` role
|
||||
language: pygrep
|
||||
entry: :user:([^`]+`?|`[^`]+[\s,])
|
||||
pass_filenames: true
|
||||
types:
|
||||
- file
|
||||
- rst
|
||||
- id: py-deprecated
|
||||
name: py library is deprecated
|
||||
language: pygrep
|
||||
|
||||
@@ -14,16 +14,11 @@ sphinx:
|
||||
fail_on_warning: true
|
||||
|
||||
build:
|
||||
os: ubuntu-24.04
|
||||
os: ubuntu-20.04
|
||||
tools:
|
||||
python: >-
|
||||
3.12
|
||||
python: "3.9"
|
||||
apt_packages:
|
||||
- inkscape
|
||||
jobs:
|
||||
post_checkout:
|
||||
- git fetch --unshallow || true
|
||||
- git fetch --tags || true
|
||||
|
||||
formats:
|
||||
- epub
|
||||
12
AUTHORS
12
AUTHORS
@@ -149,7 +149,6 @@ Evgeny Seliverstov
|
||||
Fabian Sturm
|
||||
Fabien Zarifian
|
||||
Fabio Zadrozny
|
||||
Farbod Ahmadian
|
||||
faph
|
||||
Felix Hofstätter
|
||||
Felix Nieuwenhuizen
|
||||
@@ -193,7 +192,6 @@ Jake VanderPlas
|
||||
Jakob van Santen
|
||||
Jakub Mitoraj
|
||||
James Bourbeau
|
||||
James Frost
|
||||
Jan Balster
|
||||
Janne Vanhala
|
||||
Jason R. Coombs
|
||||
@@ -213,7 +211,6 @@ Jordan Guymon
|
||||
Jordan Moldow
|
||||
Jordan Speicher
|
||||
Joseph Hunkeler
|
||||
Joseph Sawaya
|
||||
Josh Karpel
|
||||
Joshua Bronson
|
||||
Jurko Gospodnetić
|
||||
@@ -246,7 +243,6 @@ Levon Saldamli
|
||||
Lewis Cowles
|
||||
Llandy Riveron Del Risco
|
||||
Loic Esteve
|
||||
lovetheguitar
|
||||
Lukas Bednar
|
||||
Luke Murphy
|
||||
Maciek Fijalkowski
|
||||
@@ -262,7 +258,6 @@ Marc Bresson
|
||||
Marco Gorelli
|
||||
Mark Abramowitz
|
||||
Mark Dickinson
|
||||
Mark Vong
|
||||
Marko Pacak
|
||||
Markus Unterwaditzer
|
||||
Martijn Faassen
|
||||
@@ -283,7 +278,6 @@ Michael Droettboom
|
||||
Michael Goerz
|
||||
Michael Krebs
|
||||
Michael Seifert
|
||||
Michael Vogt
|
||||
Michal Wajszczuk
|
||||
Michał Górny
|
||||
Michał Zięba
|
||||
@@ -295,7 +289,6 @@ Mike Lundy
|
||||
Milan Lesnek
|
||||
Miro Hrončok
|
||||
mrbean-bremen
|
||||
Nathan Goldbaum
|
||||
Nathaniel Compton
|
||||
Nathaniel Waisbrot
|
||||
Ned Batchelder
|
||||
@@ -305,7 +298,6 @@ Nicholas Devenish
|
||||
Nicholas Murphy
|
||||
Niclas Olofsson
|
||||
Nicolas Delaby
|
||||
Nico Vidal
|
||||
Nikolay Kondratyev
|
||||
Nipunn Koorapati
|
||||
Oleg Pidsadnyi
|
||||
@@ -366,7 +358,6 @@ Sadra Barikbin
|
||||
Saiprasad Kale
|
||||
Samuel Colvin
|
||||
Samuel Dion-Girardeau
|
||||
Samuel Jirovec
|
||||
Samuel Searles-Bryant
|
||||
Samuel Therrien (Avasam)
|
||||
Samuele Pedroni
|
||||
@@ -395,7 +386,6 @@ Stefano Taschini
|
||||
Steffen Allner
|
||||
Stephan Obermann
|
||||
Sven-Hendrik Haase
|
||||
Sviatoslav Sydorenko
|
||||
Sylvain Marié
|
||||
Tadek Teleżyński
|
||||
Takafumi Arakaki
|
||||
@@ -430,7 +420,6 @@ Victor Rodriguez
|
||||
Victor Uriarte
|
||||
Vidar T. Fauske
|
||||
Vijay Arora
|
||||
Virendra Patil
|
||||
Virgil Dupras
|
||||
Vitaly Lashmanov
|
||||
Vivaan Verma
|
||||
@@ -455,7 +444,6 @@ Yusuke Kadowaki
|
||||
Yutian Li
|
||||
Yuval Shimon
|
||||
Zac Hatfield-Dodds
|
||||
Zach Snicker
|
||||
Zachary Kneupper
|
||||
Zachary OBrien
|
||||
Zhouxin Qiu
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
============================
|
||||
Contributing
|
||||
Contribution getting started
|
||||
============================
|
||||
|
||||
Contributions are highly welcomed and appreciated. Every little bit of help counts,
|
||||
so do not hesitate!
|
||||
|
||||
.. contents::
|
||||
:depth: 2
|
||||
:backlinks: none
|
||||
|
||||
|
||||
.. _submitfeedback:
|
||||
|
||||
@@ -124,7 +128,7 @@ For example:
|
||||
Submitting Plugins to pytest-dev
|
||||
--------------------------------
|
||||
|
||||
Development of the pytest core, support code, and some plugins happens
|
||||
Pytest development of the core, some plugins and support code happens
|
||||
in repositories living under the ``pytest-dev`` organisations:
|
||||
|
||||
- `pytest-dev on GitHub <https://github.com/pytest-dev>`_
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
|
||||
|
||||
@@ -10,7 +8,7 @@ if __name__ == "__main__":
|
||||
import pytest # noqa: F401
|
||||
|
||||
script = sys.argv[1:] if len(sys.argv) > 1 else ["empty.py"]
|
||||
cProfile.run(f"pytest.cmdline.main({script!r})", "prof")
|
||||
cProfile.run("pytest.cmdline.main(%r)" % script, "prof")
|
||||
p = pstats.Stats("prof")
|
||||
p.strip_dirs()
|
||||
p.sort_stats("cumulative")
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
# 2.7.5 3.3.2
|
||||
# FilesCompleter 75.1109 69.2116
|
||||
# FastFilesCompleter 0.7383 1.0760
|
||||
from __future__ import annotations
|
||||
|
||||
import timeit
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,2 @@
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
for i in range(1000):
|
||||
exec("def test_func_%d(): pass" % i)
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from unittest import TestCase # noqa: F401
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
for i in range(5000):
|
||||
exec(
|
||||
f"""
|
||||
|
||||
34
changelog/.gitignore
vendored
34
changelog/.gitignore
vendored
@@ -1,34 +0,0 @@
|
||||
*
|
||||
!.gitignore
|
||||
!_template.rst
|
||||
!README.rst
|
||||
!*.bugfix
|
||||
!*.bugfix.rst
|
||||
!*.bugfix.*.rst
|
||||
!*.breaking
|
||||
!*.breaking.rst
|
||||
!*.breaking.*.rst
|
||||
!*.contrib
|
||||
!*.contrib.rst
|
||||
!*.contrib.*.rst
|
||||
!*.deprecation
|
||||
!*.deprecation.rst
|
||||
!*.deprecation.*.rst
|
||||
!*.doc
|
||||
!*.doc.rst
|
||||
!*.doc.*.rst
|
||||
!*.feature
|
||||
!*.feature.rst
|
||||
!*.feature.*.rst
|
||||
!*.improvement
|
||||
!*.improvement.rst
|
||||
!*.improvement.*.rst
|
||||
!*.misc
|
||||
!*.misc.rst
|
||||
!*.misc.*.rst
|
||||
!*.packaging
|
||||
!*.packaging.rst
|
||||
!*.packaging.*.rst
|
||||
!*.vendor
|
||||
!*.vendor.rst
|
||||
!*.vendor.*.rst
|
||||
@@ -1,4 +0,0 @@
|
||||
Fix reporting of teardown errors in higher-scoped fixtures when using `--maxfail` or `--stepwise`.
|
||||
|
||||
Originally added in pytest 8.0.0, but reverted in 8.0.2 due to a regression in pytest-xdist.
|
||||
This regression was fixed in pytest-xdist 3.6.1.
|
||||
@@ -1 +0,0 @@
|
||||
:func:`pytest.approx` now correctly handles :class:`Sequence <collections.abc.Sequence>`-like objects.
|
||||
@@ -1 +0,0 @@
|
||||
Documented using :envvar:`PYTEST_VERSION` to detect if code is running from within a pytest run.
|
||||
@@ -1,11 +0,0 @@
|
||||
Fixed a regression in pytest 8.0 where tracebacks get longer and longer when multiple
|
||||
tests fail due to a shared higher-scope fixture which raised -- by :user:`bluetech`.
|
||||
|
||||
Also fixed a similar regression in pytest 5.4 for collectors which raise during setup.
|
||||
|
||||
The fix necessitated internal changes which may affect some plugins:
|
||||
|
||||
* ``FixtureDef.cached_result[2]`` is now a tuple ``(exc, tb)``
|
||||
instead of ``exc``.
|
||||
* ``SetupState.stack`` failures are now a tuple ``(exc, tb)``
|
||||
instead of ``exc``.
|
||||
@@ -1,11 +0,0 @@
|
||||
Added `--xfail-tb` flag, which turns on traceback output for XFAIL results.
|
||||
|
||||
* If the `--xfail-tb` flag is not sent, tracebacks for XFAIL results are NOT shown.
|
||||
* The style of traceback for XFAIL is set with `--tb`, and can be `auto|long|short|line|native|no`.
|
||||
* Note: Even if you have `--xfail-tb` set, you won't see them if `--tb=no`.
|
||||
|
||||
Some history:
|
||||
|
||||
With pytest 8.0, `-rx` or `-ra` would not only turn on summary reports for xfail, but also report the tracebacks for xfail results. This caused issues with some projects that utilize xfail, but don't want to see all of the xfail tracebacks.
|
||||
|
||||
This change detaches xfail tracebacks from `-rx`, and now we turn on xfail tracebacks with `--xfail-tb`. With this, the default `-rx`/ `-ra` behavior is identical to pre-8.0 with respect to xfail tracebacks. While this is a behavior change, it brings default behavior back to pre-8.0.0 behavior, which ultimately was considered the better course of action.
|
||||
@@ -1 +0,0 @@
|
||||
12204.bugfix.rst
|
||||
@@ -1 +0,0 @@
|
||||
Fix collection error upon encountering an :mod:`abstract <abc>` class, including abstract `unittest.TestCase` subclasses.
|
||||
@@ -1,8 +0,0 @@
|
||||
Added support for keyword matching in marker expressions.
|
||||
|
||||
Now tests can be selected by marker keyword arguments.
|
||||
Supported values are :class:`int`, (unescaped) :class:`str`, :class:`bool` & :data:`None`.
|
||||
|
||||
See :ref:`marker examples <marker_keyword_expression_example>` for more information.
|
||||
|
||||
-- by :user:`lovetheguitar`
|
||||
@@ -1 +0,0 @@
|
||||
Fix a regression in pytest 8.0.0 where package-scoped parameterized items were not correctly reordered to minimize setups/teardowns in some cases.
|
||||
@@ -1 +0,0 @@
|
||||
Fix crash with `assert testcase is not None` assertion failure when re-running unittest tests using plugins like pytest-rerunfailures. Regressed in 8.2.2.
|
||||
@@ -1,3 +0,0 @@
|
||||
Migrated all internal type-annotations to the python3.10+ style by using the `annotations` future import.
|
||||
|
||||
-- by :user:`RonnyPfannschmidt`
|
||||
@@ -1,6 +0,0 @@
|
||||
The external plugin mentions in the documentation now avoid mentioning
|
||||
:std:doc:`setuptools entry-points <setuptools:index>` as the concept is
|
||||
much more generic nowadays. Instead, the terminology of "external",
|
||||
"installed", or "third-party" plugins (or packages) replaces that.
|
||||
|
||||
-- by :user:`webknjaz`
|
||||
@@ -1,4 +0,0 @@
|
||||
The console output now uses the "third-party plugins" terminology,
|
||||
replacing the previously established but confusing and outdated
|
||||
reference to :std:doc:`setuptools <setuptools:index>`
|
||||
-- by :user:`webknjaz`.
|
||||
@@ -1 +0,0 @@
|
||||
Fixed a crash when returning category ``"error"`` or ``"failed"`` with a custom test status from :hook:`pytest_report_teststatus` hook -- :user:`pbrezina`.
|
||||
@@ -1,13 +0,0 @@
|
||||
The change log draft preview integration has been refactored to use a
|
||||
third party extension ``sphinxcontib-towncrier``. The previous in-repo
|
||||
script was putting the change log preview file at
|
||||
:file:`doc/en/_changelog_towncrier_draft.rst`. Said file is no longer
|
||||
ignored in Git and might show up among untracked files in the
|
||||
development environments of the contributors. To address that, the
|
||||
contributors can run the following command that will clean it up:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ git clean -x -i -- doc/en/_changelog_towncrier_draft.rst
|
||||
|
||||
-- by :user:`webknjaz`
|
||||
@@ -1,5 +0,0 @@
|
||||
All the undocumented ``tox`` environments now have descriptions.
|
||||
They can be listed in one's development environment by invoking
|
||||
``tox -av`` in a terminal.
|
||||
|
||||
-- by :user:`webknjaz`
|
||||
@@ -1,11 +0,0 @@
|
||||
The changelog configuration has been updated to introduce more accurate
|
||||
audience-tailored categories. Previously, there was a ``trivial``
|
||||
change log fragment type with an unclear and broad meaning. It was
|
||||
removed and we now have ``contrib``, ``misc`` and ``packaging`` in
|
||||
place of it.
|
||||
|
||||
The new change note types target the readers who are downstream
|
||||
packagers and project contributors. Additionally, the miscellaneous
|
||||
section is kept for unspecified updates that do not fit anywhere else.
|
||||
|
||||
-- by :user:`webknjaz`
|
||||
@@ -1,7 +0,0 @@
|
||||
The UX of the GitHub automation making pull requests to update the
|
||||
plugin list has been updated. Previously, the maintainers had to close
|
||||
the automatically created pull requests and re-open them to trigger the
|
||||
CI runs. From now on, they only need to click the `Ready for review`
|
||||
button instead.
|
||||
|
||||
-- by :user:`webknjaz`
|
||||
@@ -1 +0,0 @@
|
||||
Improve handling of invalid regex patterns in :func:`pytest.raises(match=r'...') <pytest.raises>` by providing a clear error message.
|
||||
@@ -1,4 +0,0 @@
|
||||
The ``:pull:`` RST role has been replaced with a shorter
|
||||
``:pr:`` due to starting to use the implementation from
|
||||
the third-party :pypi:`sphinx-issues` Sphinx extension
|
||||
-- by :user:`webknjaz`.
|
||||
@@ -1,6 +0,0 @@
|
||||
The coverage reporting configuration has been updated to exclude
|
||||
pytest's own tests marked as expected to fail from the coverage
|
||||
report. This has an effect of reducing the influence of flaky
|
||||
tests on the resulting number.
|
||||
|
||||
-- by :user:`webknjaz`
|
||||
@@ -1,7 +0,0 @@
|
||||
The ``extlinks`` Sphinx extension is no longer enabled. The ``:bpo:``
|
||||
role it used to declare has been removed with that. BPO itself has
|
||||
migrated to GitHub some years ago and it is possible to link the
|
||||
respective issues by using their GitHub issue numbers and the
|
||||
``:issue:`` role that the ``sphinx-issues`` extension implements.
|
||||
|
||||
-- by :user:`webknjaz`
|
||||
@@ -1,3 +0,0 @@
|
||||
The ``_in_venv()`` function now detects Python virtual environments by
|
||||
checking for a :file:`pyvenv.cfg` file, ensuring reliable detection on
|
||||
various platforms -- by :user:`zachsnickers`.
|
||||
@@ -1 +0,0 @@
|
||||
12544.improvement.rst
|
||||
@@ -1,2 +0,0 @@
|
||||
Possible typos in using the ``:user:`` RST role is now being linted
|
||||
through the pre-commit tool integration -- by :user:`webknjaz`.
|
||||
@@ -1 +0,0 @@
|
||||
Do not truncate arguments to functions in output when running with `-vvv`.
|
||||
@@ -1,38 +0,0 @@
|
||||
The readability of assertion introspection of bound methods has been enhanced
|
||||
-- by :user:`farbodahm`, :user:`webknjaz`, :user:`obestwalter`, :user:`flub`
|
||||
and :user:`glyphack`.
|
||||
|
||||
Earlier, it was like:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
=================================== 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 ===========================
|
||||
|
||||
|
||||
And now it's like:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
=================================== 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 ===========================
|
||||
@@ -1 +0,0 @@
|
||||
Fixed progress percentages (the ``[ 87%]`` at the edge of the screen) sometimes not aligning correctly when running with pytest-xdist ``-n``.
|
||||
@@ -1 +0,0 @@
|
||||
Added timezone information to the testsuite timestamp in the JUnit XML report.
|
||||
@@ -20,22 +20,10 @@ Each file should be named like ``<ISSUE>.<TYPE>.rst``, where
|
||||
* ``deprecation``: feature deprecation.
|
||||
* ``breaking``: a change which may break existing suites, such as feature removal or behavior change.
|
||||
* ``vendor``: changes in packages vendored in pytest.
|
||||
* ``packaging``: notes for downstreams about unobvious side effects
|
||||
and tooling. changes in the test invocation considerations and
|
||||
runtime assumptions.
|
||||
* ``contrib``: stuff that affects the contributor experience. e.g.
|
||||
Running tests, building the docs, setting up the development
|
||||
environment.
|
||||
* ``misc``: changes that are hard to assign to any of the above
|
||||
categories.
|
||||
* ``trivial``: fixing a small typo or internal change that might be noteworthy.
|
||||
|
||||
So for example: ``123.feature.rst``, ``456.bugfix.rst``.
|
||||
|
||||
.. tip::
|
||||
|
||||
See :file:`pyproject.toml` for all available categories
|
||||
(``tool.towncrier.type``).
|
||||
|
||||
If your PR fixes an issue, use that number here. If there is no issue,
|
||||
then after you submit the PR and get the PR number you can add a
|
||||
changelog using that instead.
|
||||
|
||||
@@ -1,9 +1,4 @@
|
||||
# reference: https://docs.codecov.io/docs/codecovyml-reference
|
||||
---
|
||||
|
||||
codecov:
|
||||
token: 1eca3b1f-31a2-4fb8-a8c3-138b441b50a7 #repo token
|
||||
|
||||
coverage:
|
||||
status:
|
||||
patch: true
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
<style>
|
||||
.logo {text-align: center;}
|
||||
</style>
|
||||
|
||||
<a class="logo" href="{{ pathto('contents') }}">
|
||||
<img src="{{ pathto('_static/pytest1.png', 1) }}" width="70%" height="70%" text="Pytest Logo"/>
|
||||
</a>
|
||||
14
doc/en/_templates/slim_searchbox.html
Normal file
14
doc/en/_templates/slim_searchbox.html
Normal file
@@ -0,0 +1,14 @@
|
||||
{#
|
||||
basic/searchbox.html with heading removed.
|
||||
#}
|
||||
{%- if pagename != "search" and builder != "singlehtml" %}
|
||||
<div id="searchbox" style="display: none" role="search">
|
||||
<div class="searchformwrapper">
|
||||
<form class="search" action="{{ pathto('search') }}" method="get">
|
||||
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
||||
<input type="submit" value="{{ _('Go') }}" />
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<script>document.getElementById('searchbox').style.display = "block"</script>
|
||||
{%- endif %}
|
||||
@@ -1,7 +0,0 @@
|
||||
<style>
|
||||
ul {list-style: none;}
|
||||
li {margin: 0.4em 0;}
|
||||
@media (min-width: 46em) {
|
||||
#features {width: 50%;}
|
||||
}
|
||||
</style>
|
||||
@@ -6,7 +6,6 @@ Release announcements
|
||||
:maxdepth: 2
|
||||
|
||||
|
||||
release-8.2.2
|
||||
release-8.2.1
|
||||
release-8.2.0
|
||||
release-8.1.2
|
||||
|
||||
@@ -45,7 +45,7 @@ The py.test Development Team
|
||||
**New Features**
|
||||
|
||||
* New ``pytest.mark.skip`` mark, which unconditionally skips marked tests.
|
||||
Thanks :user:`MichaelAquilina` for the complete PR (:pr:`1040`).
|
||||
Thanks :user:`MichaelAquilina` for the complete PR (:pull:`1040`).
|
||||
|
||||
* ``--doctest-glob`` may now be passed multiple times in the command-line.
|
||||
Thanks :user:`jab` and :user:`nicoddemus` for the PR.
|
||||
|
||||
@@ -44,7 +44,7 @@ The py.test Development Team
|
||||
Thanks :user:`nicoddemus` for the PR.
|
||||
|
||||
* Fix (:issue:`469`): junit parses report.nodeid incorrectly, when params IDs
|
||||
contain ``::``. Thanks :user:`tomviner` for the PR (:pr:`1431`).
|
||||
contain ``::``. Thanks :user:`tomviner` for the PR (:pull:`1431`).
|
||||
|
||||
* Fix (:issue:`578`): SyntaxErrors
|
||||
containing non-ascii lines at the point of failure generated an internal
|
||||
|
||||
@@ -44,14 +44,14 @@ The py.test Development Team
|
||||
|
||||
* Fix Xfail does not work with condition keyword argument.
|
||||
Thanks :user:`astraw38` for reporting the issue (:issue:`1496`) and :user:`tomviner`
|
||||
for PR the (:pr:`1524`).
|
||||
for PR the (:pull:`1524`).
|
||||
|
||||
* Fix win32 path issue when putting custom config file with absolute path
|
||||
in ``pytest.main("-c your_absolute_path")``.
|
||||
|
||||
* Fix maximum recursion depth detection when raised error class is not aware
|
||||
of unicode/encoded bytes.
|
||||
Thanks :user:`prusse-martin` for the PR (:pr:`1506`).
|
||||
Thanks :user:`prusse-martin` for the PR (:pull:`1506`).
|
||||
|
||||
* Fix ``pytest.mark.skip`` mark when used in strict mode.
|
||||
Thanks :user:`pquentin` for the PR and :user:`RonnyPfannschmidt` for
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
pytest-8.2.2
|
||||
=======================================
|
||||
|
||||
pytest 8.2.2 has just been released to PyPI.
|
||||
|
||||
This is a bug-fix release, being a drop-in replacement. To upgrade::
|
||||
|
||||
pip install --upgrade pytest
|
||||
|
||||
The full changelog is available at https://docs.pytest.org/en/stable/changelog.html.
|
||||
|
||||
Thanks to all of the contributors to this release:
|
||||
|
||||
* Bruno Oliveira
|
||||
* Ran Benita
|
||||
|
||||
|
||||
Happy testing,
|
||||
The pytest Development Team
|
||||
@@ -5,26 +5,30 @@ Backwards Compatibility Policy
|
||||
|
||||
.. versionadded: 6.0
|
||||
|
||||
Pytest is an actively evolving project that has been decades in the making.
|
||||
We keep learning about new and better structures to express different details about testing.
|
||||
pytest is actively evolving and is a project that has been decades in the making,
|
||||
we keep learning about new and better structures to express different details about testing.
|
||||
|
||||
While we implement those modifications, we try to ensure an easy transition and don't want to impose unnecessary churn on our users and community/plugin authors.
|
||||
While we implement those modifications we try to ensure an easy transition and don't want to impose unnecessary churn on our users and community/plugin authors.
|
||||
|
||||
As of now, pytest considers multiple types of backward compatibility transitions:
|
||||
|
||||
a) trivial: APIs that trivially translate to the new mechanism and do not cause problematic changes.
|
||||
a) trivial: APIs which trivially translate to the new mechanism,
|
||||
and do not cause problematic changes.
|
||||
|
||||
We try to support those indefinitely while encouraging users to switch to newer or better mechanisms through documentation.
|
||||
We try to support those indefinitely while encouraging users to switch to newer/better mechanisms through documentation.
|
||||
|
||||
b) transitional: the old and new APIs don't conflict, and we can help users transition by using warnings while supporting both for a prolonged period of time.
|
||||
b) transitional: the old and new API don't conflict
|
||||
and we can help users transition by using warnings, while supporting both for a prolonged time.
|
||||
|
||||
We will only start the removal of deprecated functionality in major releases (e.g., if we deprecate something in 3.0, we will start to remove it in 4.0), and keep it around for at least two minor releases (e.g., if we deprecate something in 3.9 and 4.0 is the next release, we start to remove it in 5.0, not in 4.0).
|
||||
We will only start the removal of deprecated functionality in major releases (e.g. if we deprecate something in 3.0 we will start to remove it in 4.0), and keep it around for at least two minor releases (e.g. if we deprecate something in 3.9 and 4.0 is the next release, we start to remove it in 5.0, not in 4.0).
|
||||
|
||||
A deprecated feature scheduled to be removed in major version X will use the warning class `PytestRemovedInXWarning` (a subclass of :class:`~pytest.PytestDeprecationWarning`).
|
||||
|
||||
When the deprecation expires (e.g., 4.0 is released), we won't remove the deprecated functionality immediately but will use the standard warning filters to turn `PytestRemovedInXWarning` (e.g., `PytestRemovedIn4Warning`) into **errors** by default. This approach makes it explicit that removal is imminent and still gives you time to turn the deprecated feature into a warning instead of an error so it can be dealt with in your own time. In the next minor release (e.g., 4.1), the feature will be effectively removed.
|
||||
When the deprecation expires (e.g. 4.0 is released), we won't remove the deprecated functionality immediately, but will use the standard warning filters to turn `PytestRemovedInXWarning` (e.g. `PytestRemovedIn4Warning`) into **errors** by default. This approach makes it explicit that removal is imminent, and still gives you time to turn the deprecated feature into a warning instead of an error so it can be dealt with in your own time. In the next minor release (e.g. 4.1), the feature will be effectively removed.
|
||||
|
||||
c) True breakage should only be considered when a normal transition is unreasonably unsustainable and would offset important developments or features by years. In addition, they should be limited to APIs where the number of actual users is very small (for example, only impacting some plugins) and can be coordinated with the community in advance.
|
||||
|
||||
c) true breakage: should only be considered when normal transition is unreasonably unsustainable and would offset important development/features by years.
|
||||
In addition, they should be limited to APIs where the number of actual users is very small (for example only impacting some plugins), and can be coordinated with the community in advance.
|
||||
|
||||
Examples for such upcoming changes:
|
||||
|
||||
@@ -58,11 +62,11 @@ Focus primary on smooth transition - stance (pre 6.0)
|
||||
|
||||
Keeping backwards compatibility has a very high priority in the pytest project. Although we have deprecated functionality over the years, most of it is still supported. All deprecations in pytest were done because simpler or more efficient ways of accomplishing the same tasks have emerged, making the old way of doing things unnecessary.
|
||||
|
||||
With the pytest 3.0 release, we introduced a clear communication scheme for when we will actually remove the old busted joint and politely ask you to use the new hotness instead, while giving you enough time to adjust your tests or raise concerns if there are valid reasons to keep deprecated functionality around.
|
||||
With the pytest 3.0 release we introduced a clear communication scheme for when we will actually remove the old busted joint and politely ask you to use the new hotness instead, while giving you enough time to adjust your tests or raise concerns if there are valid reasons to keep deprecated functionality around.
|
||||
|
||||
To communicate changes, we issue deprecation warnings using a custom warning hierarchy (see :ref:`internal-warnings`). These warnings may be suppressed using the standard means: ``-W`` command-line flag or ``filterwarnings`` ini options (see :ref:`warnings`), but we suggest to use these sparingly and temporarily, and heed the warnings when possible.
|
||||
To communicate changes we issue deprecation warnings using a custom warning hierarchy (see :ref:`internal-warnings`). These warnings may be suppressed using the standard means: ``-W`` command-line flag or ``filterwarnings`` ini options (see :ref:`warnings`), but we suggest to use these sparingly and temporarily, and heed the warnings when possible.
|
||||
|
||||
We will only start the removal of deprecated functionality in major releases (e.g. if we deprecate something in 3.0, we will start to remove it in 4.0), and keep it around for at least two minor releases (e.g. if we deprecate something in 3.9 and 4.0 is the next release, we start to remove it in 5.0, not in 4.0).
|
||||
We will only start the removal of deprecated functionality in major releases (e.g. if we deprecate something in 3.0 we will start to remove it in 4.0), and keep it around for at least two minor releases (e.g. if we deprecate something in 3.9 and 4.0 is the next release, we start to remove it in 5.0, not in 4.0).
|
||||
|
||||
When the deprecation expires (e.g. 4.0 is released), we won't remove the deprecated functionality immediately, but will use the standard warning filters to turn them into **errors** by default. This approach makes it explicit that removal is imminent, and still gives you time to turn the deprecated feature into a warning instead of an error so it can be dealt with in your own time. In the next minor release (e.g. 4.1), the feature will be effectively removed.
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ For information about fixtures, see :ref:`fixtures`. To see a complete list of a
|
||||
cachedir: .pytest_cache
|
||||
rootdir: /home/sweet/project
|
||||
collected 0 items
|
||||
cache -- .../_pytest/cacheprovider.py:560
|
||||
cache -- .../_pytest/cacheprovider.py:549
|
||||
Return a cache object that can persist state between testing sessions.
|
||||
|
||||
cache.get(key, default)
|
||||
@@ -115,7 +115,7 @@ For information about fixtures, see :ref:`fixtures`. To see a complete list of a
|
||||
|
||||
For more details: :ref:`doctest_namespace`.
|
||||
|
||||
pytestconfig [session scope] -- .../_pytest/fixtures.py:1338
|
||||
pytestconfig [session scope] -- .../_pytest/fixtures.py:1335
|
||||
Session-scoped fixture that returns the session's :class:`pytest.Config`
|
||||
object.
|
||||
|
||||
|
||||
@@ -19,47 +19,15 @@ with advance notice in the **Deprecations** section of releases.
|
||||
we named the news folder changelog
|
||||
|
||||
|
||||
.. only:: not is_release
|
||||
.. only:: changelog_towncrier_draft
|
||||
|
||||
To be included in v\ |release| (if present)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
.. The 'changelog_towncrier_draft' tag is included by our 'tox -e docs',
|
||||
but not on readthedocs.
|
||||
|
||||
.. towncrier-draft-entries:: |release| [UNRELEASED DRAFT]
|
||||
|
||||
Released versions
|
||||
^^^^^^^^^^^^^^^^^
|
||||
.. include:: _changelog_towncrier_draft.rst
|
||||
|
||||
.. towncrier release notes start
|
||||
|
||||
pytest 8.2.2 (2024-06-04)
|
||||
=========================
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
- `#12355 <https://github.com/pytest-dev/pytest/issues/12355>`_: Fix possible catastrophic performance slowdown on a certain parametrization pattern involving many higher-scoped parameters.
|
||||
|
||||
|
||||
- `#12367 <https://github.com/pytest-dev/pytest/issues/12367>`_: Fix a regression in pytest 8.2.0 where unittest class instances (a fresh one is created for each test) were not released promptly on test teardown but only on session teardown.
|
||||
|
||||
|
||||
- `#12381 <https://github.com/pytest-dev/pytest/issues/12381>`_: Fix possible "Directory not empty" crashes arising from concurent cache dir (``.pytest_cache``) creation. Regressed in pytest 8.2.0.
|
||||
|
||||
|
||||
|
||||
Improved Documentation
|
||||
----------------------
|
||||
|
||||
- `#12290 <https://github.com/pytest-dev/pytest/issues/12290>`_: Updated Sphinx theme to use Furo instead of Flask, enabling Dark mode theme.
|
||||
|
||||
|
||||
- `#12356 <https://github.com/pytest-dev/pytest/issues/12356>`_: Added a subsection to the documentation for debugging flaky tests to mention
|
||||
lack of thread safety in pytest as a possible source of flakyness.
|
||||
|
||||
|
||||
- `#12363 <https://github.com/pytest-dev/pytest/issues/12363>`_: The documentation webpages now links to a canonical version to reduce outdated documentation in search engine results.
|
||||
|
||||
|
||||
pytest 8.2.1 (2024-05-19)
|
||||
=========================
|
||||
|
||||
@@ -89,7 +57,7 @@ Bug Fixes
|
||||
Trivial/Internal Changes
|
||||
------------------------
|
||||
|
||||
- `#12333 <https://github.com/pytest-dev/pytest/issues/12333>`_: pytest releases are now attested using the recent `Artifact Attestation <https://github.blog/2024-05-02-introducing-artifact-attestations-now-in-public-beta/>`_ support from GitHub, allowing users to verify the provenance of pytest's sdist and wheel artifacts.
|
||||
- `#12333 <https://github.com/pytest-dev/pytest/issues/12333>`_: pytest releases are now attested using the recent `Artifact Attestation <https://github.blog/2024-05-02-introducing-artifact-attestations-now-in-public-beta/>` support from GitHub, allowing users to verify the provenance of pytest's sdist and wheel artifacts.
|
||||
|
||||
|
||||
pytest 8.2.0 (2024-04-27)
|
||||
@@ -268,7 +236,7 @@ Bug Fixes
|
||||
|
||||
- `#11904 <https://github.com/pytest-dev/pytest/issues/11904>`_: Fixed a regression in pytest 8.0.0 that would cause test collection to fail due to permission errors when using ``--pyargs``.
|
||||
|
||||
This change improves the collection tree for tests specified using ``--pyargs``, see :pr:`12043` for a comparison with pytest 8.0 and <8.
|
||||
This change improves the collection tree for tests specified using ``--pyargs``, see :pull:`12043` for a comparison with pytest 8.0 and <8.
|
||||
|
||||
|
||||
- `#12011 <https://github.com/pytest-dev/pytest/issues/12011>`_: Fixed a regression in 8.0.1 whereby ``setup_module`` xunit-style fixtures are not executed when ``--doctest-modules`` is passed.
|
||||
@@ -1422,7 +1390,7 @@ Bug Fixes
|
||||
tests/link -> tests/real
|
||||
|
||||
running ``pytest tests`` now imports the conftest twice, once as ``tests/real/conftest.py`` and once as ``tests/link/conftest.py``.
|
||||
This is a fix to match a similar change made to test collection itself in pytest 6.0 (see :pr:`6523` for details).
|
||||
This is a fix to match a similar change made to test collection itself in pytest 6.0 (see :pull:`6523` for details).
|
||||
|
||||
|
||||
- `#9626 <https://github.com/pytest-dev/pytest/issues/9626>`_: Fixed count of selected tests on terminal collection summary when there were errors or skipped modules.
|
||||
@@ -2591,7 +2559,7 @@ Breaking Changes
|
||||
Resolving symlinks for the current directory and during collection was introduced as a bugfix in 3.9.0, but it actually is a new feature which had unfortunate consequences in Windows and surprising results in other platforms.
|
||||
|
||||
The team decided to step back on resolving symlinks at all, planning to review this in the future with a more solid solution (see discussion in
|
||||
:pr:`6523` for details).
|
||||
:pull:`6523` for details).
|
||||
|
||||
This might break test suites which made use of this feature; the fix is to create a symlink
|
||||
for the entire test tree, and not only to partial files/tress as it was possible previously.
|
||||
@@ -2874,7 +2842,7 @@ Bug Fixes
|
||||
- :issue:`6871`: Fix crash with captured output when using :fixture:`capsysbinary`.
|
||||
|
||||
|
||||
- :issue:`6909`: Revert the change introduced by :pr:`6330`, which required all arguments to ``@pytest.mark.parametrize`` to be explicitly defined in the function signature.
|
||||
- :issue:`6909`: Revert the change introduced by :pull:`6330`, which required all arguments to ``@pytest.mark.parametrize`` to be explicitly defined in the function signature.
|
||||
|
||||
The intention of the original change was to remove what was expected to be an unintended/surprising behavior, but it turns out many people relied on it, so the restriction has been reverted.
|
||||
|
||||
@@ -3044,7 +3012,7 @@ pytest 5.4.1 (2020-03-13)
|
||||
Bug Fixes
|
||||
---------
|
||||
|
||||
- :issue:`6909`: Revert the change introduced by :pr:`6330`, which required all arguments to ``@pytest.mark.parametrize`` to be explicitly defined in the function signature.
|
||||
- :issue:`6909`: Revert the change introduced by :pull:`6330`, which required all arguments to ``@pytest.mark.parametrize`` to be explicitly defined in the function signature.
|
||||
|
||||
The intention of the original change was to remove what was expected to be an unintended/surprising behavior, but it turns out many people relied on it, so the restriction has been reverted.
|
||||
|
||||
@@ -3360,9 +3328,7 @@ Bug Fixes
|
||||
- :issue:`5914`: pytester: fix :py:func:`~pytest.LineMatcher.no_fnmatch_line` when used after positive matching.
|
||||
|
||||
|
||||
- :issue:`6082`: Fix line detection for doctest samples inside
|
||||
:py:class:`python:property` docstrings, as a workaround to
|
||||
:issue:`python/cpython#61648`.
|
||||
- :issue:`6082`: Fix line detection for doctest samples inside :py:class:`python:property` docstrings, as a workaround to :bpo:`17446`.
|
||||
|
||||
|
||||
- :issue:`6254`: Fix compatibility with pytest-parallel (regression in pytest 5.3.0).
|
||||
@@ -4069,7 +4035,7 @@ Bug Fixes
|
||||
(``--collect-only``) when ``--log-cli-level`` is used.
|
||||
|
||||
|
||||
- :issue:`5389`: Fix regressions of :pr:`5063` for ``importlib_metadata.PathDistribution`` which have their ``files`` attribute being ``None``.
|
||||
- :issue:`5389`: Fix regressions of :pull:`5063` for ``importlib_metadata.PathDistribution`` which have their ``files`` attribute being ``None``.
|
||||
|
||||
|
||||
- :issue:`5390`: Fix regression where the ``obj`` attribute of ``TestCase`` items was no longer bound to methods.
|
||||
@@ -4270,7 +4236,7 @@ Bug Fixes
|
||||
(``--collect-only``) when ``--log-cli-level`` is used.
|
||||
|
||||
|
||||
- :issue:`5389`: Fix regressions of :pr:`5063` for ``importlib_metadata.PathDistribution`` which have their ``files`` attribute being ``None``.
|
||||
- :issue:`5389`: Fix regressions of :pull:`5063` for ``importlib_metadata.PathDistribution`` which have their ``files`` attribute being ``None``.
|
||||
|
||||
|
||||
- :issue:`5390`: Fix regression where the ``obj`` attribute of ``TestCase`` items was no longer bound to methods.
|
||||
@@ -7231,10 +7197,10 @@ New Features
|
||||
* Added ``junit_suite_name`` ini option to specify root ``<testsuite>`` name for JUnit XML reports (:issue:`533`).
|
||||
|
||||
* Added an ini option ``doctest_encoding`` to specify which encoding to use for doctest files.
|
||||
Thanks :user:`wheerd` for the PR (:pr:`2101`).
|
||||
Thanks :user:`wheerd` for the PR (:pull:`2101`).
|
||||
|
||||
* ``pytest.warns`` now checks for subclass relationship rather than
|
||||
class equality. Thanks :user:`lesteve` for the PR (:pr:`2166`)
|
||||
class equality. Thanks :user:`lesteve` for the PR (:pull:`2166`)
|
||||
|
||||
* ``pytest.raises`` now asserts that the error message matches a text or regex
|
||||
with the ``match`` keyword argument. Thanks :user:`Kriechi` for the PR.
|
||||
@@ -7262,7 +7228,7 @@ Changes
|
||||
the failure. (:issue:`2228`) Thanks to :user:`kkoukiou` for the PR.
|
||||
|
||||
* Testcase reports with a ``url`` attribute will now properly write this to junitxml.
|
||||
Thanks :user:`fushi` for the PR (:pr:`1874`).
|
||||
Thanks :user:`fushi` for the PR (:pull:`1874`).
|
||||
|
||||
* Remove common items from dict comparison output when verbosity=1. Also update
|
||||
the truncation message to make it clearer that pytest truncates all
|
||||
@@ -7271,7 +7237,7 @@ Changes
|
||||
|
||||
* ``--pdbcls`` no longer implies ``--pdb``. This makes it possible to use
|
||||
``addopts=--pdbcls=module.SomeClass`` on ``pytest.ini``. Thanks :user:`davidszotten` for
|
||||
the PR (:pr:`1952`).
|
||||
the PR (:pull:`1952`).
|
||||
|
||||
* fix :issue:`2013`: turn RecordedWarning into ``namedtuple``,
|
||||
to give it a comprehensible repr while preventing unwarranted modification.
|
||||
@@ -7525,7 +7491,7 @@ Bug Fixes
|
||||
a sequence of strings) when modules are considered for assertion rewriting.
|
||||
Due to this bug, much more modules were being rewritten than necessary
|
||||
if a test suite uses ``pytest_plugins`` to load internal plugins (:issue:`1888`).
|
||||
Thanks :user:`jaraco` for the report and :user:`nicoddemus` for the PR (:pr:`1891`).
|
||||
Thanks :user:`jaraco` for the report and :user:`nicoddemus` for the PR (:pull:`1891`).
|
||||
|
||||
* Do not call tearDown and cleanups when running tests from
|
||||
``unittest.TestCase`` subclasses with ``--pdb``
|
||||
@@ -7580,12 +7546,12 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
* ``--nomagic``: use ``--assert=plain`` instead;
|
||||
* ``--report``: use ``-r`` instead;
|
||||
|
||||
Thanks to :user:`RedBeardCode` for the PR (:pr:`1664`).
|
||||
Thanks to :user:`RedBeardCode` for the PR (:pull:`1664`).
|
||||
|
||||
* ImportErrors in plugins now are a fatal error instead of issuing a
|
||||
pytest warning (:issue:`1479`). Thanks to :user:`The-Compiler` for the PR.
|
||||
|
||||
* Removed support code for Python 3 versions < 3.3 (:pr:`1627`).
|
||||
* Removed support code for Python 3 versions < 3.3 (:pull:`1627`).
|
||||
|
||||
* Removed all ``py.test-X*`` entry points. The versioned, suffixed entry points
|
||||
were never documented and a leftover from a pre-virtualenv era. These entry
|
||||
@@ -7596,19 +7562,19 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
* ``pytest.skip()`` now raises an error when used to decorate a test function,
|
||||
as opposed to its original intent (to imperatively skip a test inside a test function). Previously
|
||||
this usage would cause the entire module to be skipped (:issue:`607`).
|
||||
Thanks :user:`omarkohl` for the complete PR (:pr:`1519`).
|
||||
Thanks :user:`omarkohl` for the complete PR (:pull:`1519`).
|
||||
|
||||
* Exit tests if a collection error occurs. A poll indicated most users will hit CTRL-C
|
||||
anyway as soon as they see collection errors, so pytest might as well make that the default behavior (:issue:`1421`).
|
||||
A ``--continue-on-collection-errors`` option has been added to restore the previous behaviour.
|
||||
Thanks :user:`olegpidsadnyi` and :user:`omarkohl` for the complete PR (:pr:`1628`).
|
||||
Thanks :user:`olegpidsadnyi` and :user:`omarkohl` for the complete PR (:pull:`1628`).
|
||||
|
||||
* Renamed the pytest ``pdb`` module (plugin) into ``debugging`` to avoid clashes with the builtin ``pdb`` module.
|
||||
|
||||
* Raise a helpful failure message when requesting a parametrized fixture at runtime,
|
||||
e.g. with ``request.getfixturevalue``. Previously these parameters were simply
|
||||
never defined, so a fixture decorated like ``@pytest.fixture(params=[0, 1, 2])``
|
||||
only ran once (:pr:`460`).
|
||||
only ran once (:pull:`460`).
|
||||
Thanks to :user:`nikratio` for the bug report, :user:`RedBeardCode` and :user:`tomviner` for the PR.
|
||||
|
||||
* ``_pytest.monkeypatch.monkeypatch`` class has been renamed to ``_pytest.monkeypatch.MonkeyPatch``
|
||||
@@ -7626,7 +7592,7 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
|
||||
* New ``doctest_namespace`` fixture for injecting names into the
|
||||
namespace in which doctests run.
|
||||
Thanks :user:`milliams` for the complete PR (:pr:`1428`).
|
||||
Thanks :user:`milliams` for the complete PR (:pull:`1428`).
|
||||
|
||||
* New ``--doctest-report`` option available to change the output format of diffs
|
||||
when running (failing) doctests (implements :issue:`1749`).
|
||||
@@ -7634,23 +7600,23 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
|
||||
* New ``name`` argument to ``pytest.fixture`` decorator which allows a custom name
|
||||
for a fixture (to solve the funcarg-shadowing-fixture problem).
|
||||
Thanks :user:`novas0x2a` for the complete PR (:pr:`1444`).
|
||||
Thanks :user:`novas0x2a` for the complete PR (:pull:`1444`).
|
||||
|
||||
* New ``approx()`` function for easily comparing floating-point numbers in
|
||||
tests.
|
||||
Thanks :user:`kalekundert` for the complete PR (:pr:`1441`).
|
||||
Thanks :user:`kalekundert` for the complete PR (:pull:`1441`).
|
||||
|
||||
* Ability to add global properties in the final xunit output file by accessing
|
||||
the internal ``junitxml`` plugin (experimental).
|
||||
Thanks :user:`tareqalayan` for the complete PR :pr:`1454`).
|
||||
Thanks :user:`tareqalayan` for the complete PR :pull:`1454`).
|
||||
|
||||
* New ``ExceptionInfo.match()`` method to match a regular expression on the
|
||||
string representation of an exception (:issue:`372`).
|
||||
Thanks :user:`omarkohl` for the complete PR (:pr:`1502`).
|
||||
Thanks :user:`omarkohl` for the complete PR (:pull:`1502`).
|
||||
|
||||
* ``__tracebackhide__`` can now also be set to a callable which then can decide
|
||||
whether to filter the traceback based on the ``ExceptionInfo`` object passed
|
||||
to it. Thanks :user:`The-Compiler` for the complete PR (:pr:`1526`).
|
||||
to it. Thanks :user:`The-Compiler` for the complete PR (:pull:`1526`).
|
||||
|
||||
* New ``pytest_make_parametrize_id(config, val)`` hook which can be used by plugins to provide
|
||||
friendly strings for custom types.
|
||||
@@ -7668,7 +7634,7 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
* Introduce ``pytest`` command as recommended entry point. Note that ``py.test``
|
||||
still works and is not scheduled for removal. Closes proposal
|
||||
:issue:`1629`. Thanks :user:`obestwalter` and :user:`davehunt` for the complete PR
|
||||
(:pr:`1633`).
|
||||
(:pull:`1633`).
|
||||
|
||||
* New cli flags:
|
||||
|
||||
@@ -7712,19 +7678,19 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
|
||||
* Change ``report.outcome`` for ``xpassed`` tests to ``"passed"`` in non-strict
|
||||
mode and ``"failed"`` in strict mode. Thanks to :user:`hackebrot` for the PR
|
||||
(:pr:`1795`) and :user:`gprasad84` for report (:issue:`1546`).
|
||||
(:pull:`1795`) and :user:`gprasad84` for report (:issue:`1546`).
|
||||
|
||||
* Tests marked with ``xfail(strict=False)`` (the default) now appear in
|
||||
JUnitXML reports as passing tests instead of skipped.
|
||||
Thanks to :user:`hackebrot` for the PR (:pr:`1795`).
|
||||
Thanks to :user:`hackebrot` for the PR (:pull:`1795`).
|
||||
|
||||
* Highlight path of the file location in the error report to make it easier to copy/paste.
|
||||
Thanks :user:`suzaku` for the PR (:pr:`1778`).
|
||||
Thanks :user:`suzaku` for the PR (:pull:`1778`).
|
||||
|
||||
* Fixtures marked with ``@pytest.fixture`` can now use ``yield`` statements exactly like
|
||||
those marked with the ``@pytest.yield_fixture`` decorator. This change renders
|
||||
``@pytest.yield_fixture`` deprecated and makes ``@pytest.fixture`` with ``yield`` statements
|
||||
the preferred way to write teardown code (:pr:`1461`).
|
||||
the preferred way to write teardown code (:pull:`1461`).
|
||||
Thanks :user:`csaftoiu` for bringing this to attention and :user:`nicoddemus` for the PR.
|
||||
|
||||
* Explicitly passed parametrize ids do not get escaped to ascii (:issue:`1351`).
|
||||
@@ -7735,11 +7701,11 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
Thanks :user:`nicoddemus` for the PR.
|
||||
|
||||
* ``pytest_terminal_summary`` hook now receives the ``exitstatus``
|
||||
of the test session as argument. Thanks :user:`blueyed` for the PR (:pr:`1809`).
|
||||
of the test session as argument. Thanks :user:`blueyed` for the PR (:pull:`1809`).
|
||||
|
||||
* Parametrize ids can accept ``None`` as specific test id, in which case the
|
||||
automatically generated id for that argument will be used.
|
||||
Thanks :user:`palaviv` for the complete PR (:pr:`1468`).
|
||||
Thanks :user:`palaviv` for the complete PR (:pull:`1468`).
|
||||
|
||||
* The parameter to xunit-style setup/teardown methods (``setup_method``,
|
||||
``setup_module``, etc.) is now optional and may be omitted.
|
||||
@@ -7747,32 +7713,32 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
|
||||
* Improved automatic id generation selection in case of duplicate ids in
|
||||
parametrize.
|
||||
Thanks :user:`palaviv` for the complete PR (:pr:`1474`).
|
||||
Thanks :user:`palaviv` for the complete PR (:pull:`1474`).
|
||||
|
||||
* Now pytest warnings summary is shown up by default. Added a new flag
|
||||
``--disable-pytest-warnings`` to explicitly disable the warnings summary (:issue:`1668`).
|
||||
|
||||
* Make ImportError during collection more explicit by reminding
|
||||
the user to check the name of the test module/package(s) (:issue:`1426`).
|
||||
Thanks :user:`omarkohl` for the complete PR (:pr:`1520`).
|
||||
Thanks :user:`omarkohl` for the complete PR (:pull:`1520`).
|
||||
|
||||
* Add ``build/`` and ``dist/`` to the default ``--norecursedirs`` list. Thanks
|
||||
:user:`mikofski` for the report and :user:`tomviner` for the PR (:issue:`1544`).
|
||||
|
||||
* ``pytest.raises`` in the context manager form accepts a custom
|
||||
``message`` to raise when no exception occurred.
|
||||
Thanks :user:`palaviv` for the complete PR (:pr:`1616`).
|
||||
Thanks :user:`palaviv` for the complete PR (:pull:`1616`).
|
||||
|
||||
* ``conftest.py`` files now benefit from assertion rewriting; previously it
|
||||
was only available for test modules. Thanks :user:`flub`, :user:`sober7` and
|
||||
:user:`nicoddemus` for the PR (:issue:`1619`).
|
||||
|
||||
* Text documents without any doctests no longer appear as "skipped".
|
||||
Thanks :user:`graingert` for reporting and providing a full PR (:pr:`1580`).
|
||||
Thanks :user:`graingert` for reporting and providing a full PR (:pull:`1580`).
|
||||
|
||||
* Ensure that a module within a namespace package can be found when it
|
||||
is specified on the command line together with the ``--pyargs``
|
||||
option. Thanks to :user:`taschini` for the PR (:pr:`1597`).
|
||||
option. Thanks to :user:`taschini` for the PR (:pull:`1597`).
|
||||
|
||||
* Always include full assertion explanation during assertion rewriting. The previous behaviour was hiding
|
||||
sub-expressions that happened to be ``False``, assuming this was redundant information.
|
||||
@@ -7788,20 +7754,20 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
Thanks :user:`nicoddemus` for the PR.
|
||||
|
||||
* ``[pytest]`` sections in ``setup.cfg`` files should now be named ``[tool:pytest]``
|
||||
to avoid conflicts with other distutils commands (see :pr:`567`). ``[pytest]`` sections in
|
||||
to avoid conflicts with other distutils commands (see :pull:`567`). ``[pytest]`` sections in
|
||||
``pytest.ini`` or ``tox.ini`` files are supported and unchanged.
|
||||
Thanks :user:`nicoddemus` for the PR.
|
||||
|
||||
* Using ``pytest_funcarg__`` prefix to declare fixtures is considered deprecated and will be
|
||||
removed in pytest-4.0 (:pr:`1684`).
|
||||
removed in pytest-4.0 (:pull:`1684`).
|
||||
Thanks :user:`nicoddemus` for the PR.
|
||||
|
||||
* Passing a command-line string to ``pytest.main()`` is considered deprecated and scheduled
|
||||
for removal in pytest-4.0. It is recommended to pass a list of arguments instead (:pr:`1723`).
|
||||
for removal in pytest-4.0. It is recommended to pass a list of arguments instead (:pull:`1723`).
|
||||
|
||||
* Rename ``getfuncargvalue`` to ``getfixturevalue``. ``getfuncargvalue`` is
|
||||
still present but is now considered deprecated. Thanks to :user:`RedBeardCode` and :user:`tomviner`
|
||||
for the PR (:pr:`1626`).
|
||||
for the PR (:pull:`1626`).
|
||||
|
||||
* ``optparse`` type usage now triggers DeprecationWarnings (:issue:`1740`).
|
||||
|
||||
@@ -7859,11 +7825,11 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
:user:`tomviner` for the PR.
|
||||
|
||||
* ``ConftestImportFailure`` now shows the traceback making it easier to
|
||||
identify bugs in ``conftest.py`` files (:pr:`1516`). Thanks :user:`txomon` for
|
||||
identify bugs in ``conftest.py`` files (:pull:`1516`). Thanks :user:`txomon` for
|
||||
the PR.
|
||||
|
||||
* Text documents without any doctests no longer appear as "skipped".
|
||||
Thanks :user:`graingert` for reporting and providing a full PR (:pr:`1580`).
|
||||
Thanks :user:`graingert` for reporting and providing a full PR (:pull:`1580`).
|
||||
|
||||
* Fixed collection of classes with custom ``__new__`` method.
|
||||
Fixes :issue:`1579`. Thanks to :user:`Stranger6667` for the PR.
|
||||
@@ -7871,7 +7837,7 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
* Fixed scope overriding inside metafunc.parametrize (:issue:`634`).
|
||||
Thanks to :user:`Stranger6667` for the PR.
|
||||
|
||||
* Fixed the total tests tally in junit xml output (:pr:`1798`).
|
||||
* Fixed the total tests tally in junit xml output (:pull:`1798`).
|
||||
Thanks to :user:`cboelsen` for the PR.
|
||||
|
||||
* Fixed off-by-one error with lines from ``request.node.warn``.
|
||||
@@ -7888,14 +7854,14 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
|
||||
* Fix Xfail does not work with condition keyword argument.
|
||||
Thanks :user:`astraw38` for reporting the issue (:issue:`1496`) and :user:`tomviner`
|
||||
for PR the (:pr:`1524`).
|
||||
for PR the (:pull:`1524`).
|
||||
|
||||
* Fix win32 path issue when putting custom config file with absolute path
|
||||
in ``pytest.main("-c your_absolute_path")``.
|
||||
|
||||
* Fix maximum recursion depth detection when raised error class is not aware
|
||||
of unicode/encoded bytes.
|
||||
Thanks :user:`prusse-martin` for the PR (:pr:`1506`).
|
||||
Thanks :user:`prusse-martin` for the PR (:pull:`1506`).
|
||||
|
||||
* Fix ``pytest.mark.skip`` mark when used in strict mode.
|
||||
Thanks :user:`pquentin` for the PR and :user:`RonnyPfannschmidt` for
|
||||
@@ -7922,7 +7888,7 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
Thanks :user:`nicoddemus` for the PR.
|
||||
|
||||
* Fix (:issue:`469`): junit parses report.nodeid incorrectly, when params IDs
|
||||
contain ``::``. Thanks :user:`tomviner` for the PR (:pr:`1431`).
|
||||
contain ``::``. Thanks :user:`tomviner` for the PR (:pull:`1431`).
|
||||
|
||||
* Fix (:issue:`578`): SyntaxErrors
|
||||
containing non-ascii lines at the point of failure generated an internal
|
||||
@@ -7943,7 +7909,7 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
**New Features**
|
||||
|
||||
* New ``pytest.mark.skip`` mark, which unconditionally skips marked tests.
|
||||
Thanks :user:`MichaelAquilina` for the complete PR (:pr:`1040`).
|
||||
Thanks :user:`MichaelAquilina` for the complete PR (:pull:`1040`).
|
||||
|
||||
* ``--doctest-glob`` may now be passed multiple times in the command-line.
|
||||
Thanks :user:`jab` and :user:`nicoddemus` for the PR.
|
||||
@@ -7954,14 +7920,14 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
* ``pytest.mark.xfail`` now has a ``strict`` option, which makes ``XPASS``
|
||||
tests to fail the test suite (defaulting to ``False``). There's also a
|
||||
``xfail_strict`` ini option that can be used to configure it project-wise.
|
||||
Thanks :user:`rabbbit` for the request and :user:`nicoddemus` for the PR (:pr:`1355`).
|
||||
Thanks :user:`rabbbit` for the request and :user:`nicoddemus` for the PR (:pull:`1355`).
|
||||
|
||||
* ``Parser.addini`` now supports options of type ``bool``.
|
||||
Thanks :user:`nicoddemus` for the PR.
|
||||
|
||||
* New ``ALLOW_BYTES`` doctest option. This strips ``b`` prefixes from byte strings
|
||||
in doctest output (similar to ``ALLOW_UNICODE``).
|
||||
Thanks :user:`jaraco` for the request and :user:`nicoddemus` for the PR (:pr:`1287`).
|
||||
Thanks :user:`jaraco` for the request and :user:`nicoddemus` for the PR (:pull:`1287`).
|
||||
|
||||
* Give a hint on ``KeyboardInterrupt`` to use the ``--fulltrace`` option to show the errors.
|
||||
Fixes :issue:`1366`.
|
||||
@@ -7993,7 +7959,7 @@ time or change existing behaviors in order to make them less surprising/more use
|
||||
|
||||
* Removed code and documentation for Python 2.5 or lower versions,
|
||||
including removal of the obsolete ``_pytest.assertion.oldinterpret`` module.
|
||||
Thanks :user:`nicoddemus` for the PR (:pr:`1226`).
|
||||
Thanks :user:`nicoddemus` for the PR (:pull:`1226`).
|
||||
|
||||
* Comparisons now always show up in full when ``CI`` or ``BUILD_NUMBER`` is
|
||||
found in the environment, even when ``-vv`` isn't used.
|
||||
|
||||
108
doc/en/conf.py
108
doc/en/conf.py
@@ -15,33 +15,19 @@
|
||||
#
|
||||
# The full version, including alpha/beta/rc tags.
|
||||
# The short X.Y version.
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
from pathlib import Path
|
||||
import shutil
|
||||
import sys
|
||||
from textwrap import dedent
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from _pytest import __version__ as full_version
|
||||
from _pytest import __version__ as version
|
||||
|
||||
|
||||
version = full_version.split("+")[0]
|
||||
|
||||
if TYPE_CHECKING:
|
||||
import sphinx.application
|
||||
|
||||
|
||||
PROJECT_ROOT_DIR = Path(__file__).parents[2].resolve()
|
||||
IS_RELEASE_ON_RTD = (
|
||||
os.getenv("READTHEDOCS", "False") == "True"
|
||||
and os.environ["READTHEDOCS_VERSION_TYPE"] == "tag"
|
||||
)
|
||||
if IS_RELEASE_ON_RTD:
|
||||
tags: set[str]
|
||||
# pylint: disable-next=used-before-assignment
|
||||
tags.add("is_release") # noqa: F821
|
||||
|
||||
release = ".".join(version.split(".")[:2])
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
@@ -79,16 +65,16 @@ latex_elements = {
|
||||
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||
extensions = [
|
||||
"pallets_sphinx_themes",
|
||||
"pygments_pytest",
|
||||
"sphinx.ext.autodoc",
|
||||
"sphinx.ext.autosummary",
|
||||
"sphinx.ext.extlinks",
|
||||
"sphinx.ext.intersphinx",
|
||||
"sphinx.ext.todo",
|
||||
"sphinx.ext.viewcode",
|
||||
"sphinx_removed_in",
|
||||
"sphinxcontrib_trio",
|
||||
"sphinxcontrib.towncrier.ext", # provides `towncrier-draft-entries` directive
|
||||
"sphinx_issues", # implements `:issue:`, `:pr:` and other GH-related roles
|
||||
]
|
||||
|
||||
# Building PDF docs on readthedocs requires inkscape for svg to pdf
|
||||
@@ -154,6 +140,10 @@ add_module_names = False
|
||||
# output. They are ignored by default.
|
||||
# show_authors = False
|
||||
|
||||
# The name of the Pygments (syntax highlighting) style to use.
|
||||
pygments_style = "sphinx"
|
||||
|
||||
|
||||
# A list of ignored prefixes for module index sorting.
|
||||
# modindex_common_prefix = []
|
||||
|
||||
@@ -170,6 +160,16 @@ linkcheck_ignore = [
|
||||
linkcheck_workers = 5
|
||||
|
||||
|
||||
_repo = "https://github.com/pytest-dev/pytest"
|
||||
extlinks = {
|
||||
"bpo": ("https://bugs.python.org/issue%s", "bpo-%s"),
|
||||
"pypi": ("https://pypi.org/project/%s/", "%s"),
|
||||
"issue": (f"{_repo}/issues/%s", "issue #%s"),
|
||||
"pull": (f"{_repo}/pull/%s", "pull request #%s"),
|
||||
"user": ("https://github.com/%s", "@%s"),
|
||||
}
|
||||
|
||||
|
||||
nitpicky = True
|
||||
nitpick_ignore = [
|
||||
# TODO (fix in pluggy?)
|
||||
@@ -183,7 +183,6 @@ nitpick_ignore = [
|
||||
("py:class", "SubRequest"),
|
||||
("py:class", "TerminalReporter"),
|
||||
("py:class", "_pytest._code.code.TerminalRepr"),
|
||||
("py:class", "TerminalRepr"),
|
||||
("py:class", "_pytest.fixtures.FixtureFunctionMarker"),
|
||||
("py:class", "_pytest.logging.LogCaptureHandler"),
|
||||
("py:class", "_pytest.mark.structures.ParameterSet"),
|
||||
@@ -205,24 +204,24 @@ nitpick_ignore = [
|
||||
("py:class", "_PluggyPlugin"),
|
||||
# TypeVars
|
||||
("py:class", "_pytest._code.code.E"),
|
||||
("py:class", "E"), # due to delayed annotation
|
||||
("py:class", "_pytest.fixtures.FixtureFunction"),
|
||||
("py:class", "_pytest.nodes._NodeType"),
|
||||
("py:class", "_NodeType"), # due to delayed annotation
|
||||
("py:class", "_pytest.python_api.E"),
|
||||
("py:class", "_pytest.recwarn.T"),
|
||||
("py:class", "_pytest.runner.TResult"),
|
||||
("py:obj", "_pytest.fixtures.FixtureValue"),
|
||||
("py:obj", "_pytest.stash.T"),
|
||||
("py:class", "_ScopeName"),
|
||||
]
|
||||
|
||||
|
||||
# -- Options for HTML output ---------------------------------------------------
|
||||
|
||||
sys.path.append(os.path.abspath("_themes"))
|
||||
html_theme_path = ["_themes"]
|
||||
|
||||
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||
# a list of builtin themes.
|
||||
html_theme = "furo"
|
||||
html_theme = "flask"
|
||||
|
||||
# Theme options are theme-specific and customize the look and feel of a theme
|
||||
# further. For a list of options available for each theme, see the
|
||||
@@ -237,7 +236,7 @@ html_theme = "furo"
|
||||
html_title = "pytest documentation"
|
||||
|
||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||
html_short_title = f"pytest-{release}"
|
||||
html_short_title = "pytest-%s" % release
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top
|
||||
# of the sidebar.
|
||||
@@ -267,24 +266,18 @@ html_favicon = "img/favicon.png"
|
||||
|
||||
html_sidebars = {
|
||||
"index": [
|
||||
"sidebar/brand.html",
|
||||
"sidebar/search.html",
|
||||
"sidebar/scroll-start.html",
|
||||
"slim_searchbox.html",
|
||||
"sidebarintro.html",
|
||||
"globaltoc.html",
|
||||
"links.html",
|
||||
"sidebar/scroll-end.html",
|
||||
"style.html",
|
||||
"sourcelink.html",
|
||||
],
|
||||
"**": [
|
||||
"sidebar/brand.html",
|
||||
"sidebar/search.html",
|
||||
"sidebar/scroll-start.html",
|
||||
"slim_searchbox.html",
|
||||
"globaltoc.html",
|
||||
"relations.html",
|
||||
"links.html",
|
||||
"sidebar/scroll-end.html",
|
||||
"style.html",
|
||||
"sourcelink.html",
|
||||
],
|
||||
}
|
||||
|
||||
@@ -323,9 +316,6 @@ html_show_sourcelink = False
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = "pytestdoc"
|
||||
|
||||
# The base URL which points to the root of the HTML documentation. It is used
|
||||
# to indicate the location of document using the canonical link relation (#12363).
|
||||
html_baseurl = "https://docs.pytest.org/en/stable/"
|
||||
|
||||
# -- Options for LaTeX output --------------------------------------------------
|
||||
|
||||
@@ -347,6 +337,10 @@ latex_documents = [
|
||||
)
|
||||
]
|
||||
|
||||
# The name of an image file (relative to this directory) to place at the top of
|
||||
# the title page.
|
||||
latex_logo = "img/pytest1.png"
|
||||
|
||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||
# not chapters.
|
||||
# latex_use_parts = False
|
||||
@@ -433,18 +427,6 @@ texinfo_documents = [
|
||||
)
|
||||
]
|
||||
|
||||
# -- Options for towncrier_draft extension -----------------------------------
|
||||
|
||||
towncrier_draft_autoversion_mode = "draft" # or: 'sphinx-version', 'sphinx-release'
|
||||
towncrier_draft_include_empty = True
|
||||
towncrier_draft_working_directory = PROJECT_ROOT_DIR
|
||||
towncrier_draft_config_path = "pyproject.toml" # relative to cwd
|
||||
|
||||
|
||||
# -- Options for sphinx_issues extension -----------------------------------
|
||||
|
||||
issues_github_path = "pytest-dev/pytest"
|
||||
|
||||
|
||||
intersphinx_mapping = {
|
||||
"pluggy": ("https://pluggy.readthedocs.io/en/stable", None),
|
||||
@@ -458,7 +440,31 @@ intersphinx_mapping = {
|
||||
}
|
||||
|
||||
|
||||
def setup(app: sphinx.application.Sphinx) -> None:
|
||||
def configure_logging(app: "sphinx.application.Sphinx") -> None:
|
||||
"""Configure Sphinx's WarningHandler to handle (expected) missing include."""
|
||||
import logging
|
||||
|
||||
import sphinx.util.logging
|
||||
|
||||
class WarnLogFilter(logging.Filter):
|
||||
def filter(self, record: logging.LogRecord) -> bool:
|
||||
"""Ignore warnings about missing include with "only" directive.
|
||||
|
||||
Ref: https://github.com/sphinx-doc/sphinx/issues/2150."""
|
||||
if (
|
||||
record.msg.startswith('Problems with "include" directive path:')
|
||||
and "_changelog_towncrier_draft.rst" in record.msg
|
||||
):
|
||||
return False
|
||||
return True
|
||||
|
||||
logger = logging.getLogger(sphinx.util.logging.NAMESPACE)
|
||||
warn_handler = [x for x in logger.handlers if x.level == logging.WARNING]
|
||||
assert len(warn_handler) == 1, warn_handler
|
||||
warn_handler[0].filters.insert(0, WarnLogFilter())
|
||||
|
||||
|
||||
def setup(app: "sphinx.application.Sphinx") -> None:
|
||||
app.add_crossref_type(
|
||||
"fixture",
|
||||
"fixture",
|
||||
@@ -487,6 +493,8 @@ def setup(app: sphinx.application.Sphinx) -> None:
|
||||
indextemplate="pair: %s; hook",
|
||||
)
|
||||
|
||||
configure_logging(app)
|
||||
|
||||
# legacypath.py monkey-patches pytest.Testdir in. Import the file so
|
||||
# that autodoc can discover references to it.
|
||||
import _pytest.legacypath # noqa: F401
|
||||
|
||||
@@ -1,4 +1 @@
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
collect_ignore = ["conf.py"]
|
||||
|
||||
@@ -22,16 +22,23 @@ Contact channels
|
||||
requests to GitHub.
|
||||
|
||||
- ``#pytest`` `on irc.libera.chat <ircs://irc.libera.chat:6697/#pytest>`_ IRC
|
||||
channel for random questions (using an IRC client, or `via webchat
|
||||
<https://web.libera.chat/#pytest>`)
|
||||
- ``#pytest`` `on Matrix https://matrix.to/#/#pytest:matrix.org>`.
|
||||
channel for random questions (using an IRC client, `via webchat
|
||||
<https://web.libera.chat/#pytest>`_, or `via Matrix
|
||||
<https://matrix.to/#/%23pytest:libera.chat>`_).
|
||||
|
||||
- private mail to Holger.Krekel at gmail com if you want to communicate sensitive issues
|
||||
|
||||
|
||||
- `merlinux.eu`_ offers pytest and tox-related professional teaching and
|
||||
consulting.
|
||||
|
||||
.. _`pytest issue tracker`: https://github.com/pytest-dev/pytest/issues
|
||||
.. _`old issue tracker`: https://bitbucket.org/hpk42/py-trunk/issues/
|
||||
|
||||
.. _`pytest discussions`: https://github.com/pytest-dev/pytest/discussions
|
||||
|
||||
.. _`merlinux.eu`: https://merlinux.eu/
|
||||
|
||||
.. _`get an account`:
|
||||
|
||||
.. _tetamap: https://tetamap.wordpress.com/
|
||||
|
||||
@@ -7,6 +7,10 @@ This page lists all pytest features that are currently deprecated or have been r
|
||||
The objective is to give users a clear rationale why a certain feature has been removed, and what alternatives
|
||||
should be used instead.
|
||||
|
||||
.. contents::
|
||||
:depth: 3
|
||||
:local:
|
||||
|
||||
|
||||
Deprecated Features
|
||||
-------------------
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
from pytest import raises
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import os.path
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
hello = "world"
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import os.path
|
||||
import shutil
|
||||
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
def setup_module(module):
|
||||
module.TestStateFullThing.classcount = 0
|
||||
|
||||
|
||||
@@ -1,4 +1 @@
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
collect_ignore = ["nonpython", "customdirectory"]
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
# content of conftest.py
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
|
||||
import pytest
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
# content of test_first.py
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
def test_1():
|
||||
pass
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
# content of test_second.py
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
def test_2():
|
||||
pass
|
||||
|
||||
@@ -1,6 +1,3 @@
|
||||
# content of test_third.py
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
def test_3():
|
||||
pass
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
|
||||
@@ -25,12 +25,10 @@ You can "mark" a test function with custom metadata like this:
|
||||
pass # perform some webtest test for your app
|
||||
|
||||
|
||||
@pytest.mark.device(serial="123")
|
||||
def test_something_quick():
|
||||
pass
|
||||
|
||||
|
||||
@pytest.mark.device(serial="abc")
|
||||
def test_another():
|
||||
pass
|
||||
|
||||
@@ -73,28 +71,6 @@ Or the inverse, running all tests except the webtest ones:
|
||||
|
||||
===================== 3 passed, 1 deselected in 0.12s ======================
|
||||
|
||||
.. _`marker_keyword_expression_example`:
|
||||
|
||||
Additionally, you can restrict a test run to only run tests matching one or multiple marker
|
||||
keyword arguments, e.g. to run only tests marked with ``device`` and the specific ``serial="123"``:
|
||||
|
||||
.. code-block:: pytest
|
||||
|
||||
$ pytest -v -m "device(serial='123')"
|
||||
=========================== test session starts ============================
|
||||
platform linux -- Python 3.x.y, pytest-8.x.y, pluggy-1.x.y -- $PYTHON_PREFIX/bin/python
|
||||
cachedir: .pytest_cache
|
||||
rootdir: /home/sweet/project
|
||||
collecting ... collected 4 items / 3 deselected / 1 selected
|
||||
|
||||
test_server.py::test_something_quick PASSED [100%]
|
||||
|
||||
===================== 1 passed, 3 deselected in 0.12s ======================
|
||||
|
||||
.. note:: Only keyword argument matching is supported in marker expressions.
|
||||
|
||||
.. note:: Only :class:`int`, (unescaped) :class:`str`, :class:`bool` & :data:`None` values are supported in marker expressions.
|
||||
|
||||
Selecting tests based on their node ID
|
||||
--------------------------------------
|
||||
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
"""Module containing a parametrized tests testing cross-python serialization
|
||||
via the pickle module."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import shutil
|
||||
import subprocess
|
||||
import textwrap
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
# content of conftest.py
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
|
||||
@@ -162,7 +162,7 @@ objects, they are still using the default pytest representation:
|
||||
rootdir: /home/sweet/project
|
||||
collected 8 items
|
||||
|
||||
<Dir parametrize.rst-200>
|
||||
<Dir parametrize.rst-199>
|
||||
<Module test_time.py>
|
||||
<Function test_timedistance_v0[a0-b0-expected0]>
|
||||
<Function test_timedistance_v0[a1-b1-expected1]>
|
||||
@@ -239,7 +239,7 @@ If you just collect tests you'll also nicely see 'advanced' and 'basic' as varia
|
||||
rootdir: /home/sweet/project
|
||||
collected 4 items
|
||||
|
||||
<Dir parametrize.rst-200>
|
||||
<Dir parametrize.rst-199>
|
||||
<Module test_scenarios.py>
|
||||
<Class TestSampleWithScenarios>
|
||||
<Function test_demo1[basic]>
|
||||
@@ -318,7 +318,7 @@ Let's first see how it looks like at collection time:
|
||||
rootdir: /home/sweet/project
|
||||
collected 2 items
|
||||
|
||||
<Dir parametrize.rst-200>
|
||||
<Dir parametrize.rst-199>
|
||||
<Module test_backends.py>
|
||||
<Function test_db_initialized[d1]>
|
||||
<Function test_db_initialized[d2]>
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# run this with $ pytest --collect-only test_collectonly.py
|
||||
#
|
||||
from __future__ import annotations
|
||||
|
||||
|
||||
def test_function():
|
||||
|
||||
@@ -152,7 +152,7 @@ The test collection would look like this:
|
||||
configfile: pytest.ini
|
||||
collected 2 items
|
||||
|
||||
<Dir pythoncollection.rst-201>
|
||||
<Dir pythoncollection.rst-200>
|
||||
<Module check_myapp.py>
|
||||
<Class CheckMyApp>
|
||||
<Function simple_check>
|
||||
@@ -215,7 +215,7 @@ You can always peek at the collection tree without running tests like this:
|
||||
configfile: pytest.ini
|
||||
collected 3 items
|
||||
|
||||
<Dir pythoncollection.rst-201>
|
||||
<Dir pythoncollection.rst-200>
|
||||
<Dir CWD>
|
||||
<Module pythoncollection.py>
|
||||
<Function test_function>
|
||||
|
||||
@@ -212,7 +212,7 @@ the command line arguments before they get processed:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# installable external plugin
|
||||
# setuptools plugin
|
||||
import sys
|
||||
|
||||
|
||||
@@ -405,20 +405,35 @@ Detect if running from within a pytest run
|
||||
Usually it is a bad idea to make application code
|
||||
behave differently if called from a test. But if you
|
||||
absolutely must find out if your application code is
|
||||
running from a test you can do this:
|
||||
running from a test you can do something like this:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
import os
|
||||
# content of your_module.py
|
||||
|
||||
|
||||
if os.environ.get("PYTEST_VERSION") is not None:
|
||||
# Things you want to to do if your code is called by pytest.
|
||||
_called_from_test = False
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
# content of conftest.py
|
||||
|
||||
|
||||
def pytest_configure(config):
|
||||
your_module._called_from_test = True
|
||||
|
||||
and then check for the ``your_module._called_from_test`` flag:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
if your_module._called_from_test:
|
||||
# called from within a test run
|
||||
...
|
||||
else:
|
||||
# Things you want to to do if your code is not called by pytest.
|
||||
# called "normally"
|
||||
...
|
||||
|
||||
accordingly in your application.
|
||||
|
||||
Adding info to test report header
|
||||
--------------------------------------------------------------
|
||||
@@ -1073,8 +1088,8 @@ Instead of freezing the pytest runner as a separate executable, you can make
|
||||
your frozen program work as the pytest runner by some clever
|
||||
argument handling during program startup. This allows you to
|
||||
have a single executable, which is usually more convenient.
|
||||
Please note that the mechanism for plugin discovery used by pytest (:ref:`entry
|
||||
points <pip-installable plugins>`) doesn't work with frozen executables so pytest
|
||||
Please note that the mechanism for plugin discovery used by pytest
|
||||
(setuptools entry points) doesn't work with frozen executables so pytest
|
||||
can't find any third party plugins automatically. To include third party plugins
|
||||
like ``pytest-timeout`` they must be imported explicitly and passed on to pytest.main.
|
||||
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ System state
|
||||
|
||||
Broadly speaking, a flaky test indicates that the test relies on some system state that is not being appropriately controlled - the test environment is not sufficiently isolated. Higher level tests are more likely to be flaky as they rely on more state.
|
||||
|
||||
Flaky tests sometimes appear when a test suite is run in parallel (such as use of `pytest-xdist`_). This can indicate a test is reliant on test ordering.
|
||||
Flaky tests sometimes appear when a test suite is run in parallel (such as use of pytest-xdist). This can indicate a test is reliant on test ordering.
|
||||
|
||||
- Perhaps a different test is failing to clean up after itself and leaving behind data which causes the flaky test to fail.
|
||||
- The flaky test is reliant on data from a previous test that doesn't clean up after itself, and in parallel runs that previous test is not always present
|
||||
@@ -30,22 +30,9 @@ Overly strict assertion
|
||||
|
||||
Overly strict assertions can cause problems with floating point comparison as well as timing issues. :func:`pytest.approx` is useful here.
|
||||
|
||||
Thread safety
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
pytest is single-threaded, executing its tests always in the same thread, sequentially, never spawning any threads itself.
|
||||
|
||||
Even in case of plugins which run tests in parallel, for example `pytest-xdist`_, usually work by spawning multiple *processes* and running tests in batches, without using multiple threads.
|
||||
|
||||
It is of course possible (and common) for tests and fixtures to spawn threads themselves as part of their testing workflow (for example, a fixture that starts a server thread in the background, or a test which executes production code that spawns threads), but some care must be taken:
|
||||
|
||||
* Make sure to eventually wait on any spawned threads -- for example at the end of a test, or during the teardown of a fixture.
|
||||
* Avoid using primitives provided by pytest (:func:`pytest.warns`, :func:`pytest.raises`, etc) from multiple threads, as they are not thread-safe.
|
||||
|
||||
If your test suite uses threads and your are seeing flaky test results, do not discount the possibility that the test is implicitly using global state in pytest itself.
|
||||
|
||||
Related features
|
||||
^^^^^^^^^^^^^^^^
|
||||
Pytest features
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
Xfail strict
|
||||
~~~~~~~~~~~~
|
||||
@@ -136,6 +123,3 @@ Resources
|
||||
|
||||
* `Flaky Tests at Google and How We Mitigate Them <https://testing.googleblog.com/2016/05/flaky-tests-at-google-and-how-we.html>`_ by John Micco, 2016
|
||||
* `Where do Google's flaky tests come from? <https://testing.googleblog.com/2017/04/where-do-our-flaky-tests-come-from.html>`_ by Jeff Listfield, 2017
|
||||
|
||||
|
||||
.. _pytest-xdist: https://github.com/pytest-dev/pytest-xdist
|
||||
|
||||
@@ -8,15 +8,15 @@ pytest import mechanisms and ``sys.path``/``PYTHONPATH``
|
||||
Import modes
|
||||
------------
|
||||
|
||||
pytest as a testing framework that needs to import test modules and ``conftest.py`` files for execution.
|
||||
pytest as a testing framework needs to import test modules and ``conftest.py`` files for execution.
|
||||
|
||||
Importing files in Python is a non-trivial process, so aspects of the
|
||||
Importing files in Python is a non-trivial processes, so aspects of the
|
||||
import process can be controlled through the ``--import-mode`` command-line flag, which can assume
|
||||
these values:
|
||||
|
||||
.. _`import-mode-prepend`:
|
||||
|
||||
* ``prepend`` (default): The directory path containing each module will be inserted into the *beginning*
|
||||
* ``prepend`` (default): the directory path containing each module will be inserted into the *beginning*
|
||||
of :py:data:`sys.path` if not already there, and then imported with
|
||||
the :func:`importlib.import_module <importlib.import_module>` function.
|
||||
|
||||
@@ -34,7 +34,7 @@ these values:
|
||||
* ``append``: the directory containing each module is appended to the end of :py:data:`sys.path` if not already
|
||||
there, and imported with :func:`importlib.import_module <importlib.import_module>`.
|
||||
|
||||
This better allows users to run test modules against installed versions of a package even if the
|
||||
This better allows to run test modules against installed versions of a package even if the
|
||||
package under test has the same import root. For example:
|
||||
|
||||
::
|
||||
@@ -45,7 +45,7 @@ these values:
|
||||
|
||||
the tests will run against the installed version
|
||||
of ``pkg_under_test`` when ``--import-mode=append`` is used whereas
|
||||
with ``prepend``, they would pick up the local version. This kind of confusion is why
|
||||
with ``prepend`` they would pick up the local version. This kind of confusion is why
|
||||
we advocate for using :ref:`src-layouts <src-layout>`.
|
||||
|
||||
Same as ``prepend``, requires test module names to be unique when the test directory tree is
|
||||
@@ -67,7 +67,7 @@ these values:
|
||||
are not importable. The recommendation in this case it to place testing utility modules together with the application/library
|
||||
code, for example ``app.testing.helpers``.
|
||||
|
||||
Important: by "test utility modules", we mean functions/classes which are imported by
|
||||
Important: by "test utility modules" we mean functions/classes which are imported by
|
||||
other tests directly; this does not include fixtures, which should be placed in ``conftest.py`` files, along
|
||||
with the test modules, and are discovered automatically by pytest.
|
||||
|
||||
@@ -76,8 +76,8 @@ these values:
|
||||
1. Given a certain module path, for example ``tests/core/test_models.py``, derives a canonical name
|
||||
like ``tests.core.test_models`` and tries to import it.
|
||||
|
||||
For non-test modules, this will work if they are accessible via :py:data:`sys.path`. So
|
||||
for example, ``.env/lib/site-packages/app/core.py`` will be importable as ``app.core``.
|
||||
For non-test modules this will work if they are accessible via :py:data:`sys.path`, so
|
||||
for example ``.env/lib/site-packages/app/core.py`` will be importable as ``app.core``.
|
||||
This is happens when plugins import non-test modules (for example doctesting).
|
||||
|
||||
If this step succeeds, the module is returned.
|
||||
|
||||
@@ -22,7 +22,7 @@ Install ``pytest``
|
||||
.. code-block:: bash
|
||||
|
||||
$ pytest --version
|
||||
pytest 8.2.2
|
||||
pytest 8.2.1
|
||||
|
||||
.. _`simpletest`:
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@ Here is a non-exhaustive list of issues fixed by the new implementation:
|
||||
|
||||
* Marker transfer incompatible with inheritance (:issue:`535`).
|
||||
|
||||
More details can be found in the :pr:`original PR <3317>`.
|
||||
More details can be found in the :pull:`original PR <3317>`.
|
||||
|
||||
.. note::
|
||||
|
||||
|
||||
@@ -1418,7 +1418,7 @@ Running the above tests results in the following test IDs being used:
|
||||
rootdir: /home/sweet/project
|
||||
collected 12 items
|
||||
|
||||
<Dir fixtures.rst-219>
|
||||
<Dir fixtures.rst-218>
|
||||
<Module test_anothersmtp.py>
|
||||
<Function test_showhelo[smtp.gmail.com]>
|
||||
<Function test_showhelo[mail.python.org]>
|
||||
@@ -1931,7 +1931,7 @@ The same applies for the test folder level obviously.
|
||||
Using fixtures from other projects
|
||||
----------------------------------
|
||||
|
||||
Usually projects that provide pytest support will use :ref:`entry points <pip-installable plugins>`,
|
||||
Usually projects that provide pytest support will use :ref:`entry points <setuptools entry points>`,
|
||||
so just installing those projects into an environment will make those fixtures available for use.
|
||||
|
||||
In case you want to use fixtures from a project that does not use entry points, you can
|
||||
|
||||
@@ -76,19 +76,11 @@ Specifying a specific parametrization of a test:
|
||||
|
||||
**Run tests by marker expressions**
|
||||
|
||||
To run all tests which are decorated with the ``@pytest.mark.slow`` decorator:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
pytest -m slow
|
||||
|
||||
|
||||
To run all tests which are decorated with the annotated ``@pytest.mark.slow(phase=1)`` decorator,
|
||||
with the ``phase`` keyword argument set to ``1``:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
pytest -m "slow(phase=1)"
|
||||
Will run all tests which are decorated with the ``@pytest.mark.slow`` decorator.
|
||||
|
||||
For more information see :ref:`marks <mark>`.
|
||||
|
||||
@@ -162,7 +154,7 @@ You can early-load plugins (internal and external) explicitly in the command-lin
|
||||
The option receives a ``name`` parameter, which can be:
|
||||
|
||||
* A full module dotted name, for example ``myproject.plugins``. This dotted name must be importable.
|
||||
* The entry-point name of a plugin. This is the name passed to ``importlib`` when the plugin is
|
||||
* The entry-point name of a plugin. This is the name passed to ``setuptools`` when the plugin is
|
||||
registered. For example to early-load the :pypi:`pytest-cov` plugin you can use::
|
||||
|
||||
pytest -p pytest_cov
|
||||
|
||||
@@ -16,8 +16,8 @@ reporting by calling :ref:`well specified hooks <hook-reference>` of the followi
|
||||
|
||||
* builtin plugins: loaded from pytest's internal ``_pytest`` directory.
|
||||
|
||||
* :ref:`external plugins <extplugins>`: installed third-party modules discovered
|
||||
through :ref:`entry points <pip-installable plugins>` in their packaging metadata
|
||||
* :ref:`external plugins <extplugins>`: modules discovered through
|
||||
`setuptools entry points`_
|
||||
|
||||
* `conftest.py plugins`_: modules auto-discovered in test directories
|
||||
|
||||
@@ -42,8 +42,7 @@ Plugin discovery order at tool startup
|
||||
3. by scanning the command line for the ``-p name`` option
|
||||
and loading the specified plugin. This happens before normal command-line parsing.
|
||||
|
||||
4. by loading all plugins registered through installed third-party package
|
||||
:ref:`entry points <pip-installable plugins>`.
|
||||
4. by loading all plugins registered through `setuptools entry points`_.
|
||||
|
||||
5. by loading all plugins specified through the :envvar:`PYTEST_PLUGINS` environment variable.
|
||||
|
||||
@@ -143,8 +142,7 @@ Making your plugin installable by others
|
||||
If you want to make your plugin externally available, you
|
||||
may define a so-called entry point for your distribution so
|
||||
that ``pytest`` finds your plugin module. Entry points are
|
||||
a feature that is provided by :std:doc:`packaging tools
|
||||
<packaging:specifications/entry-points>`.
|
||||
a feature that is provided by :std:doc:`setuptools <setuptools:index>`.
|
||||
|
||||
pytest looks up the ``pytest11`` entrypoint to discover its
|
||||
plugins, thus you can make your plugin available by defining
|
||||
@@ -267,9 +265,8 @@ of the variable will also be loaded as plugins, and so on.
|
||||
tests root directory is deprecated, and will raise a warning.
|
||||
|
||||
This mechanism makes it easy to share fixtures within applications or even
|
||||
external applications without the need to create external plugins using the
|
||||
:std:doc:`entry point packaging metadata
|
||||
<packaging:guides/creating-and-discovering-plugins>` technique.
|
||||
external applications without the need to create external plugins using
|
||||
the ``setuptools``'s entry point technique.
|
||||
|
||||
Plugins imported by :globalvar:`pytest_plugins` will also automatically be marked
|
||||
for assertion rewriting (see :func:`pytest.register_assert_rewrite`).
|
||||
|
||||
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
@@ -1,15 +1,17 @@
|
||||
:orphan:
|
||||
|
||||
.. sidebar:: Next Open Trainings and Events
|
||||
|
||||
- `Professional Testing with Python <https://python-academy.com/courses/python_course_testing.html>`_, via `Python Academy <https://www.python-academy.com/>`_ (3 day in-depth training):
|
||||
* **June 11th to 13th 2024**, Remote
|
||||
* **March 4th to 6th 2025**, Leipzig, Germany / Remote
|
||||
- `pytest development sprint <https://github.com/pytest-dev/sprint>`_, **June 17th -- 22nd 2024**
|
||||
- pytest tips and tricks for a better testsuite, `Europython 2024 <https://ep2024.europython.eu/>`_, **July 8th -- 14th 2024** (3h), Prague
|
||||
|
||||
Also see :doc:`previous talks and blogposts <talks>`.
|
||||
|
||||
.. _features:
|
||||
|
||||
.. sidebar:: **Next Open Trainings and Events**
|
||||
|
||||
- `pytest tips and tricks for a better testsuite <https://ep2024.europython.eu/session/pytest-tips-and-tricks-for-a-better-testsuite>`_, at `Europython 2024 <https://ep2024.europython.eu/>`_, **July 9th 2024** (3h), Prague (CZ)
|
||||
- `pytest: Professionelles Testen (nicht nur) für Python <https://pretalx.com/workshoptage-2024/talk/9VUHYB/>`_, at `CH Open Workshoptage <https://workshoptage.ch/>`_, **September 2nd 2024**, HSLU Rotkreuz (CH)
|
||||
- `Professional Testing with Python <https://python-academy.com/courses/python_course_testing.html>`_, via `Python Academy <https://www.python-academy.com/>`_ (3 day in-depth training), **March 4th -- 6th 2025**, Leipzig (DE) / Remote
|
||||
|
||||
Also see :doc:`previous talks and blogposts <talks>`
|
||||
|
||||
pytest: helps you write better programs
|
||||
=======================================
|
||||
|
||||
@@ -23,6 +25,7 @@ scale to support complex functional testing for applications and libraries.
|
||||
|
||||
**PyPI package name**: :pypi:`pytest`
|
||||
|
||||
|
||||
A quick example
|
||||
---------------
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user