diff --git a/AUTHORS b/AUTHORS index 7ebf19c9c..a43fd69a3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -74,3 +74,4 @@ Eric Hunsberger Simon Gomizelj Russel Winder Ben Webb +Alexei Kozlenok diff --git a/CHANGELOG b/CHANGELOG index e52ce71e8..d719e6a9b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -15,9 +15,16 @@ of passing tests, respectively. Thanks to David Vierra for the PR. -2.8.5.dev0 +2.8.6.dev1 ---------- + +2.8.5 +----- + +- fix #1243: fixed issue where class attributes injected during collection could break pytest. + PR by Alexei Kozlenok, thanks Ronny Pfannschmidt and Bruno Oliveira for the review and help. + - fix #1074: precompute junitxml chunks instead of storing the whole tree in objects Thanks Bruno Oliveira for the report and Ronny Pfannschmidt for the PR diff --git a/HOWTORELEASE.rst b/HOWTORELEASE.rst index ddc89eb42..fd104722a 100644 --- a/HOWTORELEASE.rst +++ b/HOWTORELEASE.rst @@ -41,8 +41,7 @@ Note: this assumes you have already registered on pypi. 8. Build the docs, you need a virtualenv with py and sphinx installed:: - cd doc/en - python plugins_index/plugins_index.py + cd doc/en make html Commit any changes before tagging the release. diff --git a/_pytest/python.py b/_pytest/python.py index 4ff3f4fc0..926f503be 100644 --- a/_pytest/python.py +++ b/_pytest/python.py @@ -451,7 +451,7 @@ class PyCollector(PyobjMixin, pytest.Collector): seen = {} l = [] for dic in dicts: - for name, obj in dic.items(): + for name, obj in list(dic.items()): if name in seen: continue seen[name] = True diff --git a/appveyor.yml b/appveyor.yml index 63495ec9c..73948b5b6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,98 +1,19 @@ -environment: - matrix: - - # Pre-installed Python versions, which Appveyor may upgrade to - # a later point release. - - - PYTHON: "C:\\Python27" - PYTHON_VERSION: "2.7.x" # currently 2.7.9 - PYTHON_ARCH: "32" - TESTENV: "py27" - - - PYTHON: "C:\\Python27-x64" - PYTHON_VERSION: "2.7.x" # currently 2.7.9 - PYTHON_ARCH: "64" - TESTENV: "py27" - - - PYTHON: "C:\\Python33" - PYTHON_VERSION: "3.3.x" # currently 3.3.5 - PYTHON_ARCH: "32" - TESTENV: "py33" - - - PYTHON: "C:\\Python33-x64" - PYTHON_VERSION: "3.3.x" # currently 3.3.5 - PYTHON_ARCH: "64" - TESTENV: "py33" - - - PYTHON: "C:\\Python34" - PYTHON_VERSION: "3.4.x" # currently 3.4.3 - PYTHON_ARCH: "32" - TESTENV: "py34" - - - PYTHON: "C:\\Python34-x64" - PYTHON_VERSION: "3.4.x" # currently 3.4.3 - PYTHON_ARCH: "64" - TESTENV: "py34" - - - PYTHON: "C:\\Python35" - PYTHON_VERSION: "3.5.x" # currently 3.5.0 - PYTHON_ARCH: "32" - TESTENV: "py35" - - - PYTHON: "C:\\Python35-x64" - PYTHON_VERSION: "3.5.x" # currently 3.5.0 - PYTHON_ARCH: "64" - TESTENV: "py35" - - # Also test a Python version not pre-installed - # See: https://github.com/ogrisel/python-appveyor-demo/issues/10 - - - PYTHON: "C:\\Python266" - PYTHON_VERSION: "2.6.6" - PYTHON_ARCH: "32" - TESTENV: "py26" - - # xdist testing - - - PYTHON: "C:\\Python27" - PYTHON_VERSION: "2.7.x" # currently 2.7.9 - PYTHON_ARCH: "32" - TESTENV: "py27-xdist" - - - PYTHON: "C:\\Python35" - PYTHON_VERSION: "3.5.x" # currently 3.5.0 - PYTHON_ARCH: "32" - TESTENV: "py35-xdist" - - install: - - ECHO "Filesystem root:" - - ps: "ls \"C:/\"" + - echo Installed Pythons + - dir c:\Python* - - ECHO "Installed SDKs:" - - ps: "ls \"C:/Program Files/Microsoft SDKs/Windows\"" - - # Install Python (from the official .msi of http://python.org) and pip when - # not already installed. - - ps: if (-not(Test-Path($env:PYTHON))) { & appveyor\install.ps1 } - - # Prepend newly installed Python to the PATH of this build (this cannot be - # done from inside the powershell script as it would require to restart - # the parent CMD process). - - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%" - - # Check that we have the expected version and architecture for Python - - "python --version" - - "python -c \"import struct; print(struct.calcsize('P') * 8)\"" - - # Install the build dependencies of the project. If some dependencies contain - # compiled extensions and are not provided as pre-built wheel packages, - # pip will build them from source using the MSVC compiler matching the - # target Python version and architecture - - C:\Python27\python -m pip install tox + - C:\Python35\python -m pip install tox build: false # Not a C# project, build stuff at the test step instead. test_script: - # Build the compiled extension and run the project tests - - C:\Python27\python -m tox -e %TESTENV% + - 'set TESTENVS= + flakes, + py26, + py27, + py33, + py34, + py27-xdist, + py35-xdist + ' + - C:\Python35\python -m tox -e "%TESTENVS%" diff --git a/appveyor/install.ps1 b/appveyor/install.ps1 deleted file mode 100644 index 0f165d8bd..000000000 --- a/appveyor/install.ps1 +++ /dev/null @@ -1,180 +0,0 @@ -# Sample script to install Python and pip under Windows -# Authors: Olivier Grisel, Jonathan Helmus and Kyle Kastner -# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/ - -$MINICONDA_URL = "http://repo.continuum.io/miniconda/" -$BASE_URL = "https://www.python.org/ftp/python/" -$GET_PIP_URL = "https://bootstrap.pypa.io/get-pip.py" -$GET_PIP_PATH = "C:\get-pip.py" - - -function DownloadPython ($python_version, $platform_suffix) { - $webclient = New-Object System.Net.WebClient - $filename = "python-" + $python_version + $platform_suffix + ".msi" - $url = $BASE_URL + $python_version + "/" + $filename - - $basedir = $pwd.Path + "\" - $filepath = $basedir + $filename - if (Test-Path $filename) { - Write-Host "Reusing" $filepath - return $filepath - } - - # Download and retry up to 3 times in case of network transient errors. - Write-Host "Downloading" $filename "from" $url - $retry_attempts = 2 - for($i=0; $i -lt $retry_attempts; $i++){ - try { - $webclient.DownloadFile($url, $filepath) - break - } - Catch [Exception]{ - Start-Sleep 1 - } - } - if (Test-Path $filepath) { - Write-Host "File saved at" $filepath - } else { - # Retry once to get the error message if any at the last try - $webclient.DownloadFile($url, $filepath) - } - return $filepath -} - - -function InstallPython ($python_version, $architecture, $python_home) { - Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home - if (Test-Path $python_home) { - Write-Host $python_home "already exists, skipping." - return $false - } - if ($architecture -eq "32") { - $platform_suffix = "" - } else { - $platform_suffix = ".amd64" - } - $msipath = DownloadPython $python_version $platform_suffix - Write-Host "Installing" $msipath "to" $python_home - $install_log = $python_home + ".log" - $install_args = "/qn /log $install_log /i $msipath TARGETDIR=$python_home" - $uninstall_args = "/qn /x $msipath" - RunCommand "msiexec.exe" $install_args - if (-not(Test-Path $python_home)) { - Write-Host "Python seems to be installed else-where, reinstalling." - RunCommand "msiexec.exe" $uninstall_args - RunCommand "msiexec.exe" $install_args - } - if (Test-Path $python_home) { - Write-Host "Python $python_version ($architecture) installation complete" - } else { - Write-Host "Failed to install Python in $python_home" - Get-Content -Path $install_log - Exit 1 - } -} - -function RunCommand ($command, $command_args) { - Write-Host $command $command_args - Start-Process -FilePath $command -ArgumentList $command_args -Wait -Passthru -} - - -function InstallPip ($python_home) { - $pip_path = $python_home + "\Scripts\pip.exe" - $python_path = $python_home + "\python.exe" - if (-not(Test-Path $pip_path)) { - Write-Host "Installing pip..." - $webclient = New-Object System.Net.WebClient - $webclient.DownloadFile($GET_PIP_URL, $GET_PIP_PATH) - Write-Host "Executing:" $python_path $GET_PIP_PATH - Start-Process -FilePath "$python_path" -ArgumentList "$GET_PIP_PATH" -Wait -Passthru - } else { - Write-Host "pip already installed." - } -} - - -function DownloadMiniconda ($python_version, $platform_suffix) { - $webclient = New-Object System.Net.WebClient - if ($python_version -eq "3.4") { - $filename = "Miniconda3-3.5.5-Windows-" + $platform_suffix + ".exe" - } else { - $filename = "Miniconda-3.5.5-Windows-" + $platform_suffix + ".exe" - } - $url = $MINICONDA_URL + $filename - - $basedir = $pwd.Path + "\" - $filepath = $basedir + $filename - if (Test-Path $filename) { - Write-Host "Reusing" $filepath - return $filepath - } - - # Download and retry up to 3 times in case of network transient errors. - Write-Host "Downloading" $filename "from" $url - $retry_attempts = 2 - for($i=0; $i -lt $retry_attempts; $i++){ - try { - $webclient.DownloadFile($url, $filepath) - break - } - Catch [Exception]{ - Start-Sleep 1 - } - } - if (Test-Path $filepath) { - Write-Host "File saved at" $filepath - } else { - # Retry once to get the error message if any at the last try - $webclient.DownloadFile($url, $filepath) - } - return $filepath -} - - -function InstallMiniconda ($python_version, $architecture, $python_home) { - Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home - if (Test-Path $python_home) { - Write-Host $python_home "already exists, skipping." - return $false - } - if ($architecture -eq "32") { - $platform_suffix = "x86" - } else { - $platform_suffix = "x86_64" - } - $filepath = DownloadMiniconda $python_version $platform_suffix - Write-Host "Installing" $filepath "to" $python_home - $install_log = $python_home + ".log" - $args = "/S /D=$python_home" - Write-Host $filepath $args - Start-Process -FilePath $filepath -ArgumentList $args -Wait -Passthru - if (Test-Path $python_home) { - Write-Host "Python $python_version ($architecture) installation complete" - } else { - Write-Host "Failed to install Python in $python_home" - Get-Content -Path $install_log - Exit 1 - } -} - - -function InstallMinicondaPip ($python_home) { - $pip_path = $python_home + "\Scripts\pip.exe" - $conda_path = $python_home + "\Scripts\conda.exe" - if (-not(Test-Path $pip_path)) { - Write-Host "Installing pip..." - $args = "install --yes pip" - Write-Host $conda_path $args - Start-Process -FilePath "$conda_path" -ArgumentList $args -Wait -Passthru - } else { - Write-Host "pip already installed." - } -} - -function main () { - InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON - InstallPip $env:PYTHON -} - -main diff --git a/doc/en/announce/index.rst b/doc/en/announce/index.rst index 90da44dee..c0c6fbeca 100644 --- a/doc/en/announce/index.rst +++ b/doc/en/announce/index.rst @@ -6,6 +6,7 @@ Release announcements :maxdepth: 2 + release-2.8.5 release-2.8.4 release-2.8.3 release-2.8.2 diff --git a/doc/en/announce/release-2.8.5.rst b/doc/en/announce/release-2.8.5.rst new file mode 100644 index 000000000..7409022a1 --- /dev/null +++ b/doc/en/announce/release-2.8.5.rst @@ -0,0 +1,39 @@ +pytest-2.8.5 +============ + +pytest is a mature Python testing tool with more than a 1100 tests +against itself, passing on many different interpreters and platforms. +This release is supposed to be drop-in compatible to 2.8.4. + +See below for the changes and see docs at: + + http://pytest.org + +As usual, you can upgrade from pypi via:: + + pip install -U pytest + +Thanks to all who contributed to this release, among them: + + Alex Gaynor + aselus-hub + Bruno Oliveira + Ronny Pfannschmidt + + +Happy testing, +The py.test Development Team + + +2.8.5 (compared to 2.8.4) +------------------------- + +- fix #1243: fixed issue where class attributes injected during collection could break pytest. + PR by Alexei Kozlenok, thanks Ronny Pfannschmidt and Bruno Oliveira for the review and help. + +- fix #1074: precompute junitxml chunks instead of storing the whole tree in objects + Thanks Bruno Oliveira for the report and Ronny Pfannschmidt for the PR + +- fix #1238: fix ``pytest.deprecated_call()`` receiving multiple arguments + (Regression introduced in 2.8.4). Thanks Alex Gaynor for the report and + Bruno Oliveira for the PR. diff --git a/doc/en/assert.rst b/doc/en/assert.rst index dcf579c21..795f52586 100644 --- a/doc/en/assert.rst +++ b/doc/en/assert.rst @@ -26,7 +26,7 @@ you will see the return value of the function call:: $ py.test test_assert1.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -146,7 +146,7 @@ if you run this module:: $ py.test test_assert2.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items diff --git a/doc/en/cache.rst b/doc/en/cache.rst index e032c5e90..3c3b5eb22 100644 --- a/doc/en/cache.rst +++ b/doc/en/cache.rst @@ -80,7 +80,7 @@ If you then run it with ``--lf``:: $ py.test --lf ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 run-last-failure: rerun last 2 failures rootdir: $REGENDOC_TMPDIR, inifile: collected 50 items @@ -121,7 +121,7 @@ of ``FF`` and dots):: $ py.test --ff ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 run-last-failure: rerun last 2 failures first rootdir: $REGENDOC_TMPDIR, inifile: collected 50 items @@ -226,7 +226,7 @@ You can always peek at the content of the cache using the $ py.test --cache-clear ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items diff --git a/doc/en/capture.rst b/doc/en/capture.rst index 23380fb73..3a246f5a5 100644 --- a/doc/en/capture.rst +++ b/doc/en/capture.rst @@ -64,7 +64,7 @@ of the failing function and hide the other one:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items diff --git a/doc/en/doctest.rst b/doc/en/doctest.rst index 47a027cb0..0befa6702 100644 --- a/doc/en/doctest.rst +++ b/doc/en/doctest.rst @@ -46,7 +46,7 @@ then you can just invoke ``py.test`` without command line options:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini collected 1 items diff --git a/doc/en/example/markers.rst b/doc/en/example/markers.rst index 2d5985b2f..aaca80fb2 100644 --- a/doc/en/example/markers.rst +++ b/doc/en/example/markers.rst @@ -31,7 +31,7 @@ You can then restrict a test run to only run tests marked with ``webtest``:: $ py.test -v -m webtest ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -45,7 +45,7 @@ Or the inverse, running all tests except the webtest ones:: $ py.test -v -m "not webtest" ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -66,7 +66,7 @@ tests based on their module, class, method, or function name:: $ py.test -v test_server.py::TestClass::test_method ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 5 items @@ -79,7 +79,7 @@ You can also select on the class:: $ py.test -v test_server.py::TestClass ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -92,7 +92,7 @@ Or select multiple nodes:: $ py.test -v test_server.py::TestClass test_server.py::test_send_http ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 8 items @@ -130,7 +130,7 @@ select tests based on their names:: $ py.test -v -k http # running with the above defined example module ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -144,7 +144,7 @@ And you can also run all tests except the ones that match the keyword:: $ py.test -k "not send_http" -v ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -160,7 +160,7 @@ Or to select "http" and "quick" tests:: $ py.test -k "http or quick" -v ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 4 items @@ -350,7 +350,7 @@ the test needs:: $ py.test -E stage2 ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -362,7 +362,7 @@ and here is one that specifies exactly the environment needed:: $ py.test -E stage1 ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -481,7 +481,7 @@ then you will see two test skipped and two executed tests as expected:: $ py.test -rs # this option reports skip reasons ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -495,7 +495,7 @@ Note that if you specify a platform via the marker-command line option like this $ py.test -m linux2 ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -547,7 +547,7 @@ We can now use the ``-m option`` to select one set:: $ py.test -m interface --tb=short ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -569,7 +569,7 @@ or to select both "event" and "interface" tests:: $ py.test -m "interface or event" --tb=short ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items diff --git a/doc/en/example/nonpython.rst b/doc/en/example/nonpython.rst index 679f026e5..d2b15ab69 100644 --- a/doc/en/example/nonpython.rst +++ b/doc/en/example/nonpython.rst @@ -27,11 +27,11 @@ now execute the test specification:: nonpython $ py.test test_simple.yml ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR/nonpython, inifile: collected 2 items - test_simple.yml .F + test_simple.yml F. ======= FAILURES ======== _______ usecase: hello ________ @@ -59,13 +59,13 @@ consulted when reporting in ``verbose`` mode:: nonpython $ py.test -v ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR/nonpython, inifile: collecting ... collected 2 items - test_simple.yml::ok PASSED test_simple.yml::hello FAILED + test_simple.yml::ok PASSED ======= FAILURES ======== _______ usecase: hello ________ @@ -81,11 +81,11 @@ interesting to just look at the collection tree:: nonpython $ py.test --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR/nonpython, inifile: collected 2 items - + ======= no tests ran in 0.12 seconds ======== diff --git a/doc/en/example/parametrize.rst b/doc/en/example/parametrize.rst index f69ac6dd8..0a9afe58e 100644 --- a/doc/en/example/parametrize.rst +++ b/doc/en/example/parametrize.rst @@ -130,7 +130,7 @@ objects, they are still using the default pytest representation:: $ py.test test_time.py --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 6 items @@ -181,7 +181,7 @@ this is a fully self-contained example which you can run with:: $ py.test test_scenarios.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -194,7 +194,7 @@ If you just collect tests you'll also nicely see 'advanced' and 'basic' as varia $ py.test --collect-only test_scenarios.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -259,7 +259,7 @@ Let's first see how it looks like at collection time:: $ py.test test_backends.py --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -320,7 +320,7 @@ The result of this test will be successful:: $ py.test test_indirect_list.py --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -448,7 +448,7 @@ If you run this with reporting for skips enabled:: $ py.test -rs test_module.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items diff --git a/doc/en/example/pythoncollection.rst b/doc/en/example/pythoncollection.rst index 386c3cc2c..e7166e6e9 100644 --- a/doc/en/example/pythoncollection.rst +++ b/doc/en/example/pythoncollection.rst @@ -82,7 +82,7 @@ then the test collection looks like this:: $ py.test --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: setup.cfg collected 2 items @@ -128,7 +128,7 @@ You can always peek at the collection tree without running tests like this:: . $ py.test --collect-only pythoncollection.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini collected 3 items @@ -182,7 +182,7 @@ interpreters and will leave out the setup.py file:: $ py.test --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: pytest.ini collected 0 items diff --git a/doc/en/example/reportingdemo.rst b/doc/en/example/reportingdemo.rst index 9fa220a1d..824fd7598 100644 --- a/doc/en/example/reportingdemo.rst +++ b/doc/en/example/reportingdemo.rst @@ -13,7 +13,7 @@ get on the terminal - we are working on that): assertion $ py.test failure_demo.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR/assertion, inifile: collected 42 items diff --git a/doc/en/example/simple.rst b/doc/en/example/simple.rst index 51008781f..627fb19ab 100644 --- a/doc/en/example/simple.rst +++ b/doc/en/example/simple.rst @@ -108,7 +108,7 @@ directory with the above conftest.py:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 0 items @@ -156,7 +156,7 @@ and when running it will see a skipped "slow" test:: $ py.test -rs # "-rs" means report details on the little 's' ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -170,7 +170,7 @@ Or run it including the ``slow`` marked test:: $ py.test --runslow ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -262,7 +262,7 @@ which will add the string to the test header accordingly:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 project deps: mylib-1.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 0 items @@ -286,7 +286,7 @@ which will add info only when run with "--v":: $ py.test -v ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache info1: did you know that ... did you? @@ -299,7 +299,7 @@ and nothing when run plainly:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 0 items @@ -332,7 +332,7 @@ Now we can profile which test functions execute the slowest:: $ py.test --durations=3 ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 3 items @@ -341,7 +341,7 @@ Now we can profile which test functions execute the slowest:: ======= slowest 3 test durations ======== 0.20s call test_some_are_slow.py::test_funcslow2 0.10s call test_some_are_slow.py::test_funcslow1 - 0.00s teardown test_some_are_slow.py::test_funcslow2 + 0.00s setup test_some_are_slow.py::test_funcslow2 ======= 3 passed in 0.12 seconds ======== incremental testing - test steps @@ -394,7 +394,7 @@ If we run this:: $ py.test -rx ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 4 items @@ -465,7 +465,7 @@ We can run this:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 7 items @@ -479,7 +479,7 @@ We can run this:: file $REGENDOC_TMPDIR/b/test_error.py, line 1 def test_root(db): # no db here, will error out fixture 'db' not found - available fixtures: tmpdir, record_xml_property, cache, capsys, monkeypatch, recwarn, pytestconfig, tmpdir_factory, capfd + available fixtures: capsys, capfd, pytestconfig, tmpdir_factory, monkeypatch, record_xml_property, cache, tmpdir, recwarn use 'py.test --fixtures [testpath]' for help on them. $REGENDOC_TMPDIR/b/test_error.py:1 @@ -569,7 +569,7 @@ and run them:: $ py.test test_module.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -660,7 +660,7 @@ and run it:: $ py.test -s test_module.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 3 items diff --git a/doc/en/fixture.rst b/doc/en/fixture.rst index 39fb18668..54d2eda18 100644 --- a/doc/en/fixture.rst +++ b/doc/en/fixture.rst @@ -75,7 +75,7 @@ marked ``smtp`` fixture function. Running the test looks like this:: $ py.test test_smtpsimple.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items @@ -193,7 +193,7 @@ inspect what is going on and can now run the tests:: $ py.test test_module.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items @@ -480,7 +480,7 @@ Running the above tests results in the following test IDs being used:: $ py.test --collect-only ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 10 items @@ -531,7 +531,7 @@ Here we declare an ``app`` fixture which receives the previously defined $ py.test -v test_appsetup.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 2 items @@ -597,7 +597,7 @@ Let's run the tests in verbose mode and with looking at the print-output:: $ py.test -v -s test_module.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 -- $PYTHON_PREFIX/bin/python3.4 cachedir: .cache rootdir: $REGENDOC_TMPDIR, inifile: collecting ... collected 8 items diff --git a/doc/en/getting-started.rst b/doc/en/getting-started.rst index 14ff4684f..f91c38de9 100644 --- a/doc/en/getting-started.rst +++ b/doc/en/getting-started.rst @@ -27,7 +27,7 @@ Installation options:: To check your installation has installed the correct version:: $ py.test --version - This is pytest version 2.8.4, imported from $PYTHON_PREFIX/lib/python3.4/site-packages/pytest.py + This is pytest version 2.8.5, imported from $PYTHON_PREFIX/lib/python3.4/site-packages/pytest.py If you get an error checkout :ref:`installation issues`. @@ -49,7 +49,7 @@ That's it. You can execute the test function now:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items diff --git a/doc/en/parametrize.rst b/doc/en/parametrize.rst index d3df49b0d..c769d6f53 100644 --- a/doc/en/parametrize.rst +++ b/doc/en/parametrize.rst @@ -55,7 +55,7 @@ them in turn:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 3 items @@ -103,7 +103,7 @@ Let's run this:: $ py.test ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 3 items diff --git a/doc/en/skipping.rst b/doc/en/skipping.rst index 216a34cdc..7464758f5 100644 --- a/doc/en/skipping.rst +++ b/doc/en/skipping.rst @@ -175,7 +175,7 @@ Running it with the report-on-xfail option gives this output:: example $ py.test -rx xfail_demo.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR/example, inifile: collected 7 items diff --git a/doc/en/tmpdir.rst b/doc/en/tmpdir.rst index 076c8642b..db776932b 100644 --- a/doc/en/tmpdir.rst +++ b/doc/en/tmpdir.rst @@ -29,7 +29,7 @@ Running this would result in a passed test except for the last $ py.test test_tmpdir.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 1 items diff --git a/doc/en/unittest.rst b/doc/en/unittest.rst index 9940b13b6..f06e97c7f 100644 --- a/doc/en/unittest.rst +++ b/doc/en/unittest.rst @@ -88,7 +88,7 @@ the ``self.db`` values in the traceback:: $ py.test test_unittest_db.py ======= test session starts ======== - platform linux -- Python 3.4.3, pytest-2.8.4, py-1.4.30, pluggy-0.3.1 + platform linux -- Python 3.4.3, pytest-2.8.5, py-1.4.31, pluggy-0.3.1 rootdir: $REGENDOC_TMPDIR, inifile: collected 2 items diff --git a/testing/python/collect.py b/testing/python/collect.py index 1a85faf9c..bebc13318 100644 --- a/testing/python/collect.py +++ b/testing/python/collect.py @@ -1076,3 +1076,26 @@ def test_dont_collect_non_function_callable(testdir): 'WC2 *', '*1 passed, 1 pytest-warnings in *', ]) + + +def test_class_injection_does_not_break_collection(testdir): + """Tests whether injection during collection time will terminate testing. + + In this case the error should not occur if the TestClass itself + is modified during collection time, and the original method list + is still used for collection. + """ + testdir.makeconftest(""" + from test_inject import TestClass + def pytest_generate_tests(metafunc): + TestClass.changed_var = {} + """) + testdir.makepyfile(test_inject=''' + class TestClass(object): + def test_injection(self): + """Test being parametrized.""" + pass + ''') + result = testdir.runpytest() + assert "RuntimeError: dictionary changed size during iteration" not in result.stdout.str() + result.stdout.fnmatch_lines(['*1 passed*'])