commit
4b2cb3acbe
3
.hgtags
3
.hgtags
|
@ -28,3 +28,6 @@ d5eacf390af74553227122b85e20345d47b2f9e6 1.3.1
|
||||||
8b8e7c25a13cf863f01b2dd955978285ae9daf6a 1.3.1
|
8b8e7c25a13cf863f01b2dd955978285ae9daf6a 1.3.1
|
||||||
3bff44b188a7ec1af328d977b9d39b6757bb38df 1.3.2
|
3bff44b188a7ec1af328d977b9d39b6757bb38df 1.3.2
|
||||||
c59d3fa8681a5b5966b8375b16fccd64a3a8dbeb 1.3.3
|
c59d3fa8681a5b5966b8375b16fccd64a3a8dbeb 1.3.3
|
||||||
|
79ef6377705184c55633d456832eea318fedcf61 1.3.4
|
||||||
|
79ef6377705184c55633d456832eea318fedcf61 1.3.4
|
||||||
|
90fffd35373e9f125af233f78b19416f0938d841 1.3.4
|
||||||
|
|
|
@ -1,7 +1,11 @@
|
||||||
Changes between 1.3.3 and XXX
|
Changes between 1.3.3 and 1.3.4
|
||||||
==================================================
|
==================================================
|
||||||
|
|
||||||
- fix issue116: --doctestmodules works in the presence of __init__.py files as well
|
- fix issue111: improve install documentation for windows
|
||||||
|
- fix issue119: fix custom collectability of __init__.py as a module
|
||||||
|
- fix issue116: --doctestmodules work with __init__.py files as well
|
||||||
|
- fix issue115: unify internal exception passthrough/catching/GeneratorExit
|
||||||
|
- fix issue118: new --tb=native for presenting cpython-standard exceptions
|
||||||
|
|
||||||
Changes between 1.3.2 and 1.3.3
|
Changes between 1.3.2 and 1.3.3
|
||||||
==================================================
|
==================================================
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
py.test/pylib 1.3.4: fixes and new native traceback option
|
||||||
|
===========================================================================
|
||||||
|
|
||||||
|
pylib/py.test 1.3.4 is a minor maintenance release mostly containing bug fixes
|
||||||
|
and a new "--tb=native" traceback option to show "normal" Python standard
|
||||||
|
tracebacks instead of the py.test enhanced tracebacks. See below for more
|
||||||
|
change info and http://pytest.org for more general information on features
|
||||||
|
and configuration of the testing tool.
|
||||||
|
|
||||||
|
Thanks to the issue reporters and generally to Ronny Pfannschmidt for help.
|
||||||
|
|
||||||
|
cheers,
|
||||||
|
holger krekel
|
||||||
|
|
||||||
|
Changes between 1.3.3 and 1.3.4
|
||||||
|
==================================================
|
||||||
|
|
||||||
|
- fix issue111: improve install documentation for windows
|
||||||
|
- fix issue119: fix custom collectability of __init__.py as a module
|
||||||
|
- fix issue116: --doctestmodules work with __init__.py files as well
|
||||||
|
- fix issue115: unify internal exception passthrough/catching/GeneratorExit
|
||||||
|
- fix issue118: new --tb=native for presenting cpython-standard exceptions
|
|
@ -26,7 +26,47 @@ py.test/pylib installation info in a nutshell
|
||||||
.. _`bin`: bin.html
|
.. _`bin`: bin.html
|
||||||
|
|
||||||
|
|
||||||
Best practise: install tool and dependencies virtually
|
.. _`easy_install`:
|
||||||
|
|
||||||
|
Installation using easy_install
|
||||||
|
===================================================
|
||||||
|
|
||||||
|
Both `Distribute`_ and setuptools_ provide the ``easy_install``
|
||||||
|
installation tool with which you can type into a command line window::
|
||||||
|
|
||||||
|
easy_install -U py
|
||||||
|
|
||||||
|
to install the latest release of the py lib and py.test. The ``-U`` switch
|
||||||
|
will trigger an upgrade if you already have an older version installed.
|
||||||
|
Note that setuptools works ok with Python2 interpreters while `Distribute`_
|
||||||
|
additionally works with Python3 and also avoid some issues on Windows.
|
||||||
|
|
||||||
|
Known issues:
|
||||||
|
|
||||||
|
- **Windows**: If "easy_install" or "py.test" are not found
|
||||||
|
please see here for preparing your environment for running
|
||||||
|
command line tools: `Python for Windows`_. You may alternatively
|
||||||
|
use an `ActivePython install`_ which makes command line tools
|
||||||
|
automatically available under Windows.
|
||||||
|
|
||||||
|
.. _`ActivePython install`: http://www.activestate.com/activepython/downloads
|
||||||
|
|
||||||
|
.. _`Jython does not create command line launchers`: http://bugs.jython.org/issue1491
|
||||||
|
|
||||||
|
- **Jython2.5.1 on Windows XP**: `Jython does not create command line launchers`_
|
||||||
|
so ``py.test`` will not work correctly. You may install py.test on
|
||||||
|
CPython and type ``py.test --genscript=mytest`` and then use
|
||||||
|
``jython mytest`` to run py.test for your tests to run in Jython.
|
||||||
|
|
||||||
|
- **On Linux**: If ``easy_install`` fails because it needs to run
|
||||||
|
as the superuser you are trying to install things globally
|
||||||
|
and need to put ``sudo`` in front of the command.
|
||||||
|
|
||||||
|
|
||||||
|
.. _quickstart: test/quickstart.html
|
||||||
|
|
||||||
|
|
||||||
|
Recommendation: install tool and dependencies virtually
|
||||||
===========================================================
|
===========================================================
|
||||||
|
|
||||||
It is recommended to work with virtual environments
|
It is recommended to work with virtual environments
|
||||||
|
@ -36,34 +76,9 @@ you need to run your tests. Local virtual Python environments
|
||||||
(as opposed to system-wide "global" environments) make for a more
|
(as opposed to system-wide "global" environments) make for a more
|
||||||
reproducible and reliable test environment.
|
reproducible and reliable test environment.
|
||||||
|
|
||||||
|
|
||||||
.. _`virtualenv`: http://pypi.python.org/pypi/virtualenv
|
.. _`virtualenv`: http://pypi.python.org/pypi/virtualenv
|
||||||
.. _`buildout`: http://www.buildout.org/
|
.. _`buildout`: http://www.buildout.org/
|
||||||
.. _pip: http://pypi.python.org/pypi/pip
|
.. _pip: http://pypi.python.org/pypi/pip
|
||||||
.. _`easy_install`:
|
|
||||||
|
|
||||||
using easy_install (from setuptools or Distribute)
|
|
||||||
===================================================
|
|
||||||
|
|
||||||
Both `Distribute`_ and setuptools_ provide the ``easy_install``
|
|
||||||
installation tool. While setuptools should work ok with
|
|
||||||
Python2 interpreters, `Distribute`_ also works with Python3
|
|
||||||
and it avoids some issues on Windows. In both cases you
|
|
||||||
can open a command line window and then type::
|
|
||||||
|
|
||||||
easy_install -U py
|
|
||||||
|
|
||||||
to install the latest release of the py lib and py.test. The ``-U`` switch
|
|
||||||
will trigger an upgrade if you already have an older version installed.
|
|
||||||
|
|
||||||
If you now type::
|
|
||||||
|
|
||||||
py.test --version
|
|
||||||
|
|
||||||
you should see the version number and the import location of the tool.
|
|
||||||
Maybe you want to head on with the `quickstart`_ now?
|
|
||||||
|
|
||||||
.. _quickstart: test/quickstart.html
|
|
||||||
|
|
||||||
.. _standalone:
|
.. _standalone:
|
||||||
|
|
||||||
|
@ -84,24 +99,7 @@ disguise. You can tell people to download and then e.g. run it like this::
|
||||||
and ask them to send you the resulting URL. The resulting script has
|
and ask them to send you the resulting URL. The resulting script has
|
||||||
all core features and runs unchanged under Python2 and Python3 interpreters.
|
all core features and runs unchanged under Python2 and Python3 interpreters.
|
||||||
|
|
||||||
Troubleshooting / known issues
|
.. _`Python for Windows`: http://www.imladris.com/Scripts/PythonForWindows.html
|
||||||
===============================
|
|
||||||
|
|
||||||
.. _`Jython does not create command line launchers`: http://bugs.jython.org/issue1491
|
|
||||||
|
|
||||||
**Jython2.5.1 on XP**: `Jython does not create command line launchers`_
|
|
||||||
so ``py.test`` will not work correctly. You may install py.test on
|
|
||||||
CPython and type ``py.test --genscript=mytest`` and then use
|
|
||||||
``jython mytest`` to run py.test for your tests to run in Jython.
|
|
||||||
|
|
||||||
**On Linux**: If ``easy_install`` fails because it needs to run
|
|
||||||
as the superuser you are trying to install things globally
|
|
||||||
and need to put ``sudo`` in front of the command.
|
|
||||||
|
|
||||||
**On Windows**: If "easy_install" or "py.test" are not found
|
|
||||||
please see here: `How do i run a Python program under Windows?`_
|
|
||||||
|
|
||||||
.. _`How do i run a Python program under Windows?`: http://www.python.org/doc/faq/windows/#how-do-i-run-a-python-program-under-windows
|
|
||||||
|
|
||||||
.. _mercurial: http://mercurial.selenic.com/wiki/
|
.. _mercurial: http://mercurial.selenic.com/wiki/
|
||||||
.. _`Distribute`:
|
.. _`Distribute`:
|
||||||
|
|
|
@ -9,10 +9,10 @@ capture output of logging module.
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
|
|
||||||
You can install the `pytest-capturelog pypi`_ package
|
You can install the `pytest-capturelog pypi`_ package
|
||||||
with pip::
|
with pip::
|
||||||
|
|
||||||
pip install pytest-capturelog
|
pip install pytest-capturelog
|
||||||
|
|
||||||
or with easy install::
|
or with easy install::
|
||||||
|
|
||||||
|
|
|
@ -6,27 +6,39 @@ produce code coverage reports using the 'coverage' package, including support fo
|
||||||
.. contents::
|
.. contents::
|
||||||
:local:
|
:local:
|
||||||
|
|
||||||
This plugin produces coverage reports using the coverage package. It
|
This plugin produces coverage reports. It supports centralised testing and distributed testing in
|
||||||
supports centralised testing and distributed testing in both load and
|
both load and each modes. It also supports coverage of subprocesses.
|
||||||
each modes.
|
|
||||||
|
|
||||||
All features offered by the coverage package should be available,
|
All features offered by the coverage package should be available, either through pytest-cov or
|
||||||
either through this plugin or through coverage's own config file.
|
through coverage's config file.
|
||||||
|
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
------------
|
------------
|
||||||
|
|
||||||
The `pytest-cov pypi`_ package may be installed / uninstalled with pip::
|
The `pytest-cov`_ package may be installed with pip or easy_install::
|
||||||
|
|
||||||
pip install pytest-cov
|
pip install pytest-cov
|
||||||
pip uninstall pytest-cov
|
|
||||||
|
|
||||||
Alternatively easy_install can be used::
|
|
||||||
|
|
||||||
easy_install pytest-cov
|
easy_install pytest-cov
|
||||||
|
|
||||||
.. _`pytest-cov pypi`: http://pypi.python.org/pypi/pytest-cov/
|
.. _`pytest-cov`: http://pypi.python.org/pypi/pytest-cov/
|
||||||
|
|
||||||
|
|
||||||
|
Uninstallation
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Uninstalling packages is supported by pip::
|
||||||
|
|
||||||
|
pip uninstall pytest-cov
|
||||||
|
|
||||||
|
However easy_install does not provide an uninstall facility.
|
||||||
|
|
||||||
|
.. IMPORTANT::
|
||||||
|
|
||||||
|
Ensure that you manually delete the init_cov_core.pth file in your site-packages directory.
|
||||||
|
|
||||||
|
This file starts coverage collection of subprocesses if appropriate during site initialisation
|
||||||
|
at python startup.
|
||||||
|
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
|
@ -35,6 +47,9 @@ Usage
|
||||||
Centralised Testing
|
Centralised Testing
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Centralised testing will report on the combined coverage of the main process and all of it's
|
||||||
|
subprocesses.
|
||||||
|
|
||||||
Running centralised testing::
|
Running centralised testing::
|
||||||
|
|
||||||
py.test --cov myproj tests/
|
py.test --cov myproj tests/
|
||||||
|
@ -42,150 +57,149 @@ Running centralised testing::
|
||||||
Shows a terminal report::
|
Shows a terminal report::
|
||||||
|
|
||||||
-------------------- coverage: platform linux2, python 2.6.4-final-0 ---------------------
|
-------------------- coverage: platform linux2, python 2.6.4-final-0 ---------------------
|
||||||
Name Stmts Exec Cover Missing
|
Name Stmts Miss Cover
|
||||||
--------------------------------------------------
|
----------------------------------------
|
||||||
myproj/__init__ 2 2 100%
|
myproj/__init__ 2 0 100%
|
||||||
myproj/myproj 257 244 94% 24-26, 99, 149, 233-236, 297-298, 369-370
|
myproj/myproj 257 13 94%
|
||||||
myproj/feature4286 94 87 92% 183-188, 197
|
myproj/feature4286 94 7 92%
|
||||||
--------------------------------------------------
|
----------------------------------------
|
||||||
TOTAL 353 333 94%
|
TOTAL 353 20 94%
|
||||||
|
|
||||||
|
|
||||||
Distributed Testing
|
Distributed Testing: Load
|
||||||
~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Distributed testing with dist mode set to load::
|
Distributed testing with dist mode set to load will report on the combined coverage of all slaves.
|
||||||
|
The slaves may be spread out over any number of hosts and each slave may be located anywhere on the
|
||||||
|
file system. Each slave will have it's subprocesses measured.
|
||||||
|
|
||||||
|
Running distributed testing with dist mode set to load::
|
||||||
|
|
||||||
py.test --cov myproj -n 2 tests/
|
py.test --cov myproj -n 2 tests/
|
||||||
|
|
||||||
The results from the slaves will be combined like so::
|
Shows a terminal report::
|
||||||
|
|
||||||
-------------------- coverage: platform linux2, python 2.6.4-final-0 ---------------------
|
-------------------- coverage: platform linux2, python 2.6.4-final-0 ---------------------
|
||||||
Name Stmts Exec Cover Missing
|
Name Stmts Miss Cover
|
||||||
--------------------------------------------------
|
----------------------------------------
|
||||||
myproj/__init__ 2 2 100%
|
myproj/__init__ 2 0 100%
|
||||||
myproj/myproj 257 244 94% 24-26, 99, 149, 233-236, 297-298, 369-370
|
myproj/myproj 257 13 94%
|
||||||
myproj/feature4286 94 87 92% 183-188, 197
|
myproj/feature4286 94 7 92%
|
||||||
--------------------------------------------------
|
----------------------------------------
|
||||||
TOTAL 353 333 94%
|
TOTAL 353 20 94%
|
||||||
|
|
||||||
|
|
||||||
Distributed testing in each mode::
|
Again but spread over different hosts and different directories::
|
||||||
|
|
||||||
py.test --cov myproj --dist=each
|
py.test --cov myproj --dist load
|
||||||
--tx=popen//python=/usr/local/python265/bin/python
|
--tx ssh=memedough@host1//chdir=testenv1
|
||||||
--tx=popen//python=/usr/local/python27b1/bin/python
|
--tx ssh=memedough@host2//chdir=/tmp/testenv2//python=/tmp/env1/bin/python
|
||||||
|
--rsyncdir myproj --rsyncdir tests --rsync examples
|
||||||
tests/
|
tests/
|
||||||
|
|
||||||
Will produce a report for each slave::
|
Shows a terminal report::
|
||||||
|
|
||||||
-------------------- coverage: platform linux2, python 2.6.5-final-0 ---------------------
|
-------------------- coverage: platform linux2, python 2.6.4-final-0 ---------------------
|
||||||
Name Stmts Exec Cover Missing
|
Name Stmts Miss Cover
|
||||||
--------------------------------------------------
|
----------------------------------------
|
||||||
myproj/__init__ 2 2 100%
|
myproj/__init__ 2 0 100%
|
||||||
myproj/myproj 257 244 94% 24-26, 99, 149, 233-236, 297-298, 369-370
|
myproj/myproj 257 13 94%
|
||||||
myproj/feature4286 94 87 92% 183-188, 197
|
myproj/feature4286 94 7 92%
|
||||||
--------------------------------------------------
|
----------------------------------------
|
||||||
TOTAL 353 333 94%
|
TOTAL 353 20 94%
|
||||||
--------------------- coverage: platform linux2, python 2.7.0-beta-1 ---------------------
|
|
||||||
Name Stmts Exec Cover Missing
|
|
||||||
--------------------------------------------------
|
|
||||||
myproj/__init__ 2 2 100%
|
|
||||||
myproj/myproj 257 244 94% 24-26, 99, 149, 233-236, 297-298, 369-370
|
|
||||||
myproj/feature4286 94 87 92% 183-188, 197
|
|
||||||
--------------------------------------------------
|
|
||||||
TOTAL 353 333 94%
|
|
||||||
|
|
||||||
|
|
||||||
Distributed testing in each mode can also produce a single combined
|
Distributed Testing: Each
|
||||||
report. This is useful to get coverage information spanning things
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
such as all python versions::
|
|
||||||
|
|
||||||
py.test --cov myproj --cov-combine-each --dist=each
|
Distributed testing with dist mode set to each will report on the combined coverage of all slaves.
|
||||||
--tx=popen//python=/usr/local/python265/bin/python
|
Since each slave is running all tests this allows generating a combined coverage report for multiple
|
||||||
--tx=popen//python=/usr/local/python27b1/bin/python
|
environments.
|
||||||
|
|
||||||
|
Running distributed testing with dist mode set to each::
|
||||||
|
|
||||||
|
py.test --cov myproj --dist each
|
||||||
|
--tx popen//chdir=/tmp/testenv3//python=/usr/local/python27/bin/python
|
||||||
|
--tx ssh=memedough@host2//chdir=/tmp/testenv4//python=/tmp/env2/bin/python
|
||||||
|
--rsyncdir myproj --rsyncdir tests --rsync examples
|
||||||
tests/
|
tests/
|
||||||
|
|
||||||
Which looks like::
|
Shows a terminal report::
|
||||||
|
|
||||||
---------------------------------------- coverage ----------------------------------------
|
---------------------------------------- coverage ----------------------------------------
|
||||||
platform linux2, python 2.6.5-final-0
|
platform linux2, python 2.6.5-final-0
|
||||||
platform linux2, python 2.7.0-beta-1
|
platform linux2, python 2.7.0-final-0
|
||||||
Name Stmts Exec Cover Missing
|
Name Stmts Miss Cover
|
||||||
--------------------------------------------------
|
----------------------------------------
|
||||||
myproj/__init__ 2 2 100%
|
myproj/__init__ 2 0 100%
|
||||||
myproj/myproj 257 244 94% 24-26, 99, 149, 233-236, 297-298, 369-370
|
myproj/myproj 257 13 94%
|
||||||
myproj/feature4286 94 87 92% 183-188, 197
|
myproj/feature4286 94 7 92%
|
||||||
--------------------------------------------------
|
----------------------------------------
|
||||||
TOTAL 353 333 94%
|
TOTAL 353 20 94%
|
||||||
|
|
||||||
|
|
||||||
Reporting
|
Reporting
|
||||||
---------
|
---------
|
||||||
|
|
||||||
By default a terminal report is output. This report can be disabled
|
It is possible to generate any combination of the reports for a single test run.
|
||||||
if desired, such as when results are going to a continuous integration
|
|
||||||
system and the terminal output won't be seen.
|
|
||||||
|
|
||||||
In addition and without rerunning tests it is possible to generate
|
The available reports are terminal (with or without missing line numbers shown), HTML, XML and
|
||||||
annotated source code, a html report and an xml report.
|
annotated source code.
|
||||||
|
|
||||||
The directories for annotated source code and html reports can be
|
The terminal report without line numbers (default)::
|
||||||
specified as can the file name for the xml report.
|
|
||||||
|
|
||||||
Since testing often takes a non trivial amount of time at the end of
|
py.test --cov-report term --cov myproj tests/
|
||||||
testing any / all of the reports may be generated.
|
|
||||||
|
-------------------- coverage: platform linux2, python 2.6.4-final-0 ---------------------
|
||||||
|
Name Stmts Miss Cover
|
||||||
|
----------------------------------------
|
||||||
|
myproj/__init__ 2 0 100%
|
||||||
|
myproj/myproj 257 13 94%
|
||||||
|
myproj/feature4286 94 7 92%
|
||||||
|
----------------------------------------
|
||||||
|
TOTAL 353 20 94%
|
||||||
|
|
||||||
|
|
||||||
|
The terminal report with line numbers::
|
||||||
|
|
||||||
|
py.test --cov-report term-missing --cov myproj tests/
|
||||||
|
|
||||||
|
-------------------- coverage: platform linux2, python 2.6.4-final-0 ---------------------
|
||||||
|
Name Stmts Miss Cover Missing
|
||||||
|
--------------------------------------------------
|
||||||
|
myproj/__init__ 2 0 100%
|
||||||
|
myproj/myproj 257 13 94% 24-26, 99, 149, 233-236, 297-298, 369-370
|
||||||
|
myproj/feature4286 94 7 92% 183-188, 197
|
||||||
|
--------------------------------------------------
|
||||||
|
TOTAL 353 20 94%
|
||||||
|
|
||||||
|
|
||||||
|
The remaining three reports output to files without showing anything on the terminal (useful for
|
||||||
|
when the output is going to a continuous integration server)::
|
||||||
|
|
||||||
|
py.test --cov-report html --cov-report xml --cov-report annotate --cov myproj tests/
|
||||||
|
|
||||||
|
|
||||||
Coverage Data File
|
Coverage Data File
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
During testing there may be many data files with coverage data. These
|
The data file is erased at the beginning of testing to ensure clean data for each test run.
|
||||||
will have unique suffixes and will be combined at the end of testing.
|
|
||||||
|
|
||||||
Upon completion, for --dist=load (and also for --dist=each when the
|
The data file is left at the end of testing so that it is possible to use normal coverage tools to
|
||||||
--cov-combine-each option is used) there will only be one data file.
|
examine it.
|
||||||
|
|
||||||
For --dist=each there may be many data files where each one will have
|
|
||||||
the platform / python version info appended to the name.
|
|
||||||
|
|
||||||
These data files are left at the end of testing so that it is possible
|
|
||||||
to use normal coverage tools to examine them.
|
|
||||||
|
|
||||||
At the beginning of testing any data files that are about to be used
|
|
||||||
will first be erased so ensure the data is clean for each test run.
|
|
||||||
|
|
||||||
It is possible to set the name of the data file. If needed the
|
|
||||||
platform / python version will be appended automatically to this name.
|
|
||||||
|
|
||||||
|
|
||||||
Coverage Config File
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Coverage by default will read its own config file. An alternative
|
|
||||||
file name may be specified or reading config can be disabled entirely.
|
|
||||||
|
|
||||||
Care has been taken to ensure that the coverage env vars and config
|
|
||||||
file options work the same under this plugin as they do under coverage
|
|
||||||
itself.
|
|
||||||
|
|
||||||
Since options may be specified in different ways the order of
|
|
||||||
precedence between pytest-cov and coverage from highest to lowest is:
|
|
||||||
|
|
||||||
1. pytest command line
|
|
||||||
2. pytest env var
|
|
||||||
3. pytest conftest
|
|
||||||
4. coverage env var
|
|
||||||
5. coverage config file
|
|
||||||
6. coverage default
|
|
||||||
|
|
||||||
|
|
||||||
Limitations
|
Limitations
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
For distributed testing the slaves must have the pytest-cov package
|
For distributed testing the slaves must have the pytest-cov package installed. This is needed since
|
||||||
installed. This is needed since the plugin must be registered through
|
the plugin must be registered through setuptools / distribute for pytest to start the plugin on the
|
||||||
setuptools / distribute for pytest to start the plugin on the slave.
|
slave.
|
||||||
|
|
||||||
|
For subprocess measurement environment variables must make it from the main process to the
|
||||||
|
subprocess. The python used by the subprocess must have pytest-cov installed. The subprocess must
|
||||||
|
do normal site initialisation so that the environment variables can be detected and coverage
|
||||||
|
started.
|
||||||
|
|
||||||
|
|
||||||
Acknowledgements
|
Acknowledgements
|
||||||
|
@ -193,14 +207,11 @@ Acknowledgements
|
||||||
|
|
||||||
Holger Krekel for pytest with its distributed testing support.
|
Holger Krekel for pytest with its distributed testing support.
|
||||||
|
|
||||||
Ned Batchelder for coverage and its ability to combine the coverage
|
Ned Batchelder for coverage and its ability to combine the coverage results of parallel runs.
|
||||||
results of parallel runs.
|
|
||||||
|
|
||||||
Whilst this plugin has been built fresh from the ground up to support
|
Whilst this plugin has been built fresh from the ground up to support distributed testing it has
|
||||||
distributed testing it has been influenced by the work done on
|
been influenced by the work done on pytest-coverage (Ross Lawley, James Mills, Holger Krekel) and
|
||||||
pytest-coverage (Ross Lawley, James Mills, Holger Krekel) and
|
nose-cover (Jason Pellerin) which are other coverage plugins for pytest and nose respectively.
|
||||||
nose-cover (Jason Pellerin) which are other coverage plugins for
|
|
||||||
pytest and nose respectively.
|
|
||||||
|
|
||||||
No doubt others have contributed to these tools as well.
|
No doubt others have contributed to these tools as well.
|
||||||
|
|
||||||
|
@ -208,43 +219,11 @@ command line options
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
|
|
||||||
``--cov-on``
|
``--cov=path``
|
||||||
enable coverage, only needed if not specifying any --cov options
|
measure coverage for filesystem path (multi-allowed)
|
||||||
``--cov=package``
|
``--cov-report=type``
|
||||||
collect coverage for the specified package (multi-allowed)
|
type of report to generate: term, term-missing, annotate, html, xml (multi-allowed)
|
||||||
``--cov-no-terminal``
|
``--cov-config=path``
|
||||||
disable printing a report on the terminal
|
config file for coverage, default: .coveragerc
|
||||||
``--cov-annotate``
|
|
||||||
generate an annotated source code report
|
|
||||||
``--cov-html``
|
|
||||||
generate a html report
|
|
||||||
``--cov-xml``
|
|
||||||
generate an xml report
|
|
||||||
``--cov-annotate-dir=dir``
|
|
||||||
directory for the annotate report, default: %default
|
|
||||||
``--cov-html-dir=dir``
|
|
||||||
directory for the html report, default: coverage_html
|
|
||||||
``--cov-xml-file=path``
|
|
||||||
file for the xml report, default: coverage.xml
|
|
||||||
``--cov-data-file=path``
|
|
||||||
file containing coverage data, default: .coverage
|
|
||||||
``--cov-combine-each``
|
|
||||||
for dist=each mode produce a single combined report
|
|
||||||
``--cov-branch``
|
|
||||||
enable branch coverage
|
|
||||||
``--cov-pylib``
|
|
||||||
enable python library coverage
|
|
||||||
``--cov-timid``
|
|
||||||
enable slower and simpler tracing
|
|
||||||
``--cov-no-missing-lines``
|
|
||||||
disable showing missing lines, only relevant to the terminal report
|
|
||||||
``--cov-no-missing-files``
|
|
||||||
disable showing message about missing source files
|
|
||||||
``--cov-omit=prefix1,prefix2,...``
|
|
||||||
ignore files with these prefixes
|
|
||||||
``--cov-no-config``
|
|
||||||
disable coverage reading its config file
|
|
||||||
``--cov-config-file=path``
|
|
||||||
config file for coverage, default: %default
|
|
||||||
|
|
||||||
.. include:: links.txt
|
.. include:: links.txt
|
||||||
|
|
|
@ -6,10 +6,27 @@ Write and report coverage data with the 'coverage' package.
|
||||||
.. contents::
|
.. contents::
|
||||||
:local:
|
:local:
|
||||||
|
|
||||||
Original code by Ross Lawley.
|
Note: Original code by Ross Lawley.
|
||||||
|
|
||||||
Requires Ned Batchelder's excellent coverage:
|
Install
|
||||||
http://nedbatchelder.com/code/coverage/
|
--------------
|
||||||
|
|
||||||
|
Use pip to (un)install::
|
||||||
|
|
||||||
|
pip install pytest-coverage
|
||||||
|
pip uninstall pytest-coverage
|
||||||
|
|
||||||
|
or alternatively use easy_install to install::
|
||||||
|
|
||||||
|
easy_install pytest-coverage
|
||||||
|
|
||||||
|
|
||||||
|
Usage
|
||||||
|
-------------
|
||||||
|
|
||||||
|
To get full test coverage reports for a particular package type::
|
||||||
|
|
||||||
|
py.test --cover-report=report
|
||||||
|
|
||||||
command line options
|
command line options
|
||||||
--------------------
|
--------------------
|
||||||
|
@ -21,8 +38,11 @@ command line options
|
||||||
html: Directory for html output.
|
html: Directory for html output.
|
||||||
report: Output a text report.
|
report: Output a text report.
|
||||||
annotate: Annotate your source code for which lines were executed and which were not.
|
annotate: Annotate your source code for which lines were executed and which were not.
|
||||||
|
xml: Output an xml report compatible with the cobertura plugin for hudson.
|
||||||
``--cover-directory=DIRECTORY``
|
``--cover-directory=DIRECTORY``
|
||||||
Directory for the reports (html / annotate results) defaults to ./coverage
|
Directory for the reports (html / annotate results) defaults to ./coverage
|
||||||
|
``--cover-xml-file=XML_FILE``
|
||||||
|
File for the xml report defaults to ./coverage.xml
|
||||||
``--cover-show-missing``
|
``--cover-show-missing``
|
||||||
Show missing files
|
Show missing files
|
||||||
``--cover-ignore-errors=IGNORE_ERRORS``
|
``--cover-ignore-errors=IGNORE_ERRORS``
|
||||||
|
|
|
@ -6,16 +6,29 @@ report test coverage using the 'figleaf' package.
|
||||||
.. contents::
|
.. contents::
|
||||||
:local:
|
:local:
|
||||||
|
|
||||||
|
Install
|
||||||
|
---------------
|
||||||
|
|
||||||
|
To install the plugin issue::
|
||||||
|
|
||||||
|
easy_install pytest-figleaf # or
|
||||||
|
pip install pytest-figleaf
|
||||||
|
|
||||||
|
and if you are using pip you can also uninstall::
|
||||||
|
|
||||||
|
pip uninstall pytest-figleaf
|
||||||
|
|
||||||
|
|
||||||
Usage
|
Usage
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
after pip or easy_install mediated installation of ``pytest-figleaf`` you can type::
|
After installation you can simply type::
|
||||||
|
|
||||||
py.test --figleaf [...]
|
py.test --figleaf [...]
|
||||||
|
|
||||||
to enable figleaf coverage in your test run. A default ".figleaf" data file
|
to enable figleaf coverage in your test run. A default ".figleaf" data file
|
||||||
and "html" directory will be created. You can use ``--fig-data``
|
and "html" directory will be created. You can use command line options
|
||||||
and ``fig-html`` to modify the paths.
|
to control where data and html files are created.
|
||||||
|
|
||||||
command line options
|
command line options
|
||||||
--------------------
|
--------------------
|
||||||
|
|
|
@ -19,7 +19,7 @@ command line options
|
||||||
``--traceconfig``
|
``--traceconfig``
|
||||||
trace considerations of conftest.py files.
|
trace considerations of conftest.py files.
|
||||||
``--nomagic``
|
``--nomagic``
|
||||||
don't reinterpret asserts, no traceback cutting.
|
don't reinterpret asserts, no traceback cutting.
|
||||||
``--debug``
|
``--debug``
|
||||||
generate and show internal debugging information.
|
generate and show internal debugging information.
|
||||||
``--help-config``
|
``--help-config``
|
||||||
|
|
|
@ -7,67 +7,67 @@ hook specification sourcecode
|
||||||
"""
|
"""
|
||||||
hook specifications for py.test plugins
|
hook specifications for py.test plugins
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
# Command line and configuration
|
# Command line and configuration
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
def pytest_namespace():
|
def pytest_namespace():
|
||||||
"return dict of name->object which will get stored at py.test. namespace"
|
"return dict of name->object which will get stored at py.test. namespace"
|
||||||
|
|
||||||
def pytest_addoption(parser):
|
def pytest_addoption(parser):
|
||||||
"add optparse-style options via parser.addoption."
|
"add optparse-style options via parser.addoption."
|
||||||
|
|
||||||
def pytest_addhooks(pluginmanager):
|
def pytest_addhooks(pluginmanager):
|
||||||
"add hooks via pluginmanager.registerhooks(module)"
|
"add hooks via pluginmanager.registerhooks(module)"
|
||||||
|
|
||||||
def pytest_configure(config):
|
def pytest_configure(config):
|
||||||
""" called after command line options have been parsed.
|
""" called after command line options have been parsed.
|
||||||
and all plugins and initial conftest files been loaded.
|
and all plugins and initial conftest files been loaded.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def pytest_unconfigure(config):
|
def pytest_unconfigure(config):
|
||||||
""" called before test process is exited. """
|
""" called before test process is exited. """
|
||||||
|
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
# collection hooks
|
# collection hooks
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
def pytest_ignore_collect(path, config):
|
def pytest_ignore_collect(path, config):
|
||||||
""" return true value to prevent considering this path for collection.
|
""" return true value to prevent considering this path for collection.
|
||||||
This hook is consulted for all files and directories prior to considering
|
This hook is consulted for all files and directories prior to considering
|
||||||
collection hooks.
|
collection hooks.
|
||||||
"""
|
"""
|
||||||
pytest_ignore_collect.firstresult = True
|
pytest_ignore_collect.firstresult = True
|
||||||
|
|
||||||
def pytest_collect_directory(path, parent):
|
def pytest_collect_directory(path, parent):
|
||||||
""" return Collection node or None for the given path. """
|
""" return Collection node or None for the given path. """
|
||||||
pytest_collect_directory.firstresult = True
|
pytest_collect_directory.firstresult = True
|
||||||
|
|
||||||
def pytest_collect_file(path, parent):
|
def pytest_collect_file(path, parent):
|
||||||
""" return Collection node or None for the given path. """
|
""" return Collection node or None for the given path. """
|
||||||
|
|
||||||
def pytest_collectstart(collector):
|
def pytest_collectstart(collector):
|
||||||
""" collector starts collecting. """
|
""" collector starts collecting. """
|
||||||
|
|
||||||
def pytest_collectreport(report):
|
def pytest_collectreport(report):
|
||||||
""" collector finished collecting. """
|
""" collector finished collecting. """
|
||||||
|
|
||||||
def pytest_deselected(items):
|
def pytest_deselected(items):
|
||||||
""" called for test items deselected by keyword. """
|
""" called for test items deselected by keyword. """
|
||||||
|
|
||||||
def pytest_make_collect_report(collector):
|
def pytest_make_collect_report(collector):
|
||||||
""" perform a collection and return a collection. """
|
""" perform a collection and return a collection. """
|
||||||
pytest_make_collect_report.firstresult = True
|
pytest_make_collect_report.firstresult = True
|
||||||
|
|
||||||
# XXX rename to item_collected()? meaning in distribution context?
|
# XXX rename to item_collected()? meaning in distribution context?
|
||||||
def pytest_itemstart(item, node=None):
|
def pytest_itemstart(item, node=None):
|
||||||
""" test item gets collected. """
|
""" test item gets collected. """
|
||||||
|
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
# Python test function related hooks
|
# Python test function related hooks
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
def pytest_pycollect_makemodule(path, parent):
|
def pytest_pycollect_makemodule(path, parent):
|
||||||
""" return a Module collector or None for the given path.
|
""" return a Module collector or None for the given path.
|
||||||
This hook will be called for each matching test module path.
|
This hook will be called for each matching test module path.
|
||||||
|
@ -75,105 +75,105 @@ hook specification sourcecode
|
||||||
create test modules for files that do not match as a test module.
|
create test modules for files that do not match as a test module.
|
||||||
"""
|
"""
|
||||||
pytest_pycollect_makemodule.firstresult = True
|
pytest_pycollect_makemodule.firstresult = True
|
||||||
|
|
||||||
def pytest_pycollect_makeitem(collector, name, obj):
|
def pytest_pycollect_makeitem(collector, name, obj):
|
||||||
""" return custom item/collector for a python object in a module, or None. """
|
""" return custom item/collector for a python object in a module, or None. """
|
||||||
pytest_pycollect_makeitem.firstresult = True
|
pytest_pycollect_makeitem.firstresult = True
|
||||||
|
|
||||||
def pytest_pyfunc_call(pyfuncitem):
|
def pytest_pyfunc_call(pyfuncitem):
|
||||||
""" call underlying test function. """
|
""" call underlying test function. """
|
||||||
pytest_pyfunc_call.firstresult = True
|
pytest_pyfunc_call.firstresult = True
|
||||||
|
|
||||||
def pytest_generate_tests(metafunc):
|
def pytest_generate_tests(metafunc):
|
||||||
""" generate (multiple) parametrized calls to a test function."""
|
""" generate (multiple) parametrized calls to a test function."""
|
||||||
|
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
# generic runtest related hooks
|
# generic runtest related hooks
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
def pytest_runtest_protocol(item):
|
def pytest_runtest_protocol(item):
|
||||||
""" implement fixture, run and report about the given test item. """
|
""" implement fixture, run and report about the given test item. """
|
||||||
pytest_runtest_protocol.firstresult = True
|
pytest_runtest_protocol.firstresult = True
|
||||||
|
|
||||||
def pytest_runtest_setup(item):
|
def pytest_runtest_setup(item):
|
||||||
""" called before pytest_runtest_call(). """
|
""" called before pytest_runtest_call(). """
|
||||||
|
|
||||||
def pytest_runtest_call(item):
|
def pytest_runtest_call(item):
|
||||||
""" execute test item. """
|
""" execute test item. """
|
||||||
|
|
||||||
def pytest_runtest_teardown(item):
|
def pytest_runtest_teardown(item):
|
||||||
""" called after pytest_runtest_call(). """
|
""" called after pytest_runtest_call(). """
|
||||||
|
|
||||||
def pytest_runtest_makereport(item, call):
|
def pytest_runtest_makereport(item, call):
|
||||||
""" make a test report for the given item and call outcome. """
|
""" make a test report for the given item and call outcome. """
|
||||||
pytest_runtest_makereport.firstresult = True
|
pytest_runtest_makereport.firstresult = True
|
||||||
|
|
||||||
def pytest_runtest_logreport(report):
|
def pytest_runtest_logreport(report):
|
||||||
""" process item test report. """
|
""" process item test report. """
|
||||||
|
|
||||||
# special handling for final teardown - somewhat internal for now
|
# special handling for final teardown - somewhat internal for now
|
||||||
def pytest__teardown_final(session):
|
def pytest__teardown_final(session):
|
||||||
""" called before test session finishes. """
|
""" called before test session finishes. """
|
||||||
pytest__teardown_final.firstresult = True
|
pytest__teardown_final.firstresult = True
|
||||||
|
|
||||||
def pytest__teardown_final_logerror(report):
|
def pytest__teardown_final_logerror(report):
|
||||||
""" called if runtest_teardown_final failed. """
|
""" called if runtest_teardown_final failed. """
|
||||||
|
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
# test session related hooks
|
# test session related hooks
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
def pytest_sessionstart(session):
|
def pytest_sessionstart(session):
|
||||||
""" before session.main() is called. """
|
""" before session.main() is called. """
|
||||||
|
|
||||||
def pytest_sessionfinish(session, exitstatus):
|
def pytest_sessionfinish(session, exitstatus):
|
||||||
""" whole test run finishes. """
|
""" whole test run finishes. """
|
||||||
|
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
# hooks for influencing reporting (invoked from pytest_terminal)
|
# hooks for influencing reporting (invoked from pytest_terminal)
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
def pytest_report_header(config):
|
def pytest_report_header(config):
|
||||||
""" return a string to be displayed as header info for terminal reporting."""
|
""" return a string to be displayed as header info for terminal reporting."""
|
||||||
|
|
||||||
def pytest_report_teststatus(report):
|
def pytest_report_teststatus(report):
|
||||||
""" return result-category, shortletter and verbose word for reporting."""
|
""" return result-category, shortletter and verbose word for reporting."""
|
||||||
pytest_report_teststatus.firstresult = True
|
pytest_report_teststatus.firstresult = True
|
||||||
|
|
||||||
def pytest_terminal_summary(terminalreporter):
|
def pytest_terminal_summary(terminalreporter):
|
||||||
""" add additional section in terminal summary reporting. """
|
""" add additional section in terminal summary reporting. """
|
||||||
|
|
||||||
def pytest_report_iteminfo(item):
|
def pytest_report_iteminfo(item):
|
||||||
""" return (fspath, lineno, name) for the item.
|
""" return (fspath, lineno, name) for the item.
|
||||||
the information is used for result display and to sort tests
|
the information is used for result display and to sort tests
|
||||||
"""
|
"""
|
||||||
pytest_report_iteminfo.firstresult = True
|
pytest_report_iteminfo.firstresult = True
|
||||||
|
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
# doctest hooks
|
# doctest hooks
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
def pytest_doctest_prepare_content(content):
|
def pytest_doctest_prepare_content(content):
|
||||||
""" return processed content for a given doctest"""
|
""" return processed content for a given doctest"""
|
||||||
pytest_doctest_prepare_content.firstresult = True
|
pytest_doctest_prepare_content.firstresult = True
|
||||||
|
|
||||||
|
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
# error handling and internal debugging hooks
|
# error handling and internal debugging hooks
|
||||||
# -------------------------------------------------------------------------
|
# -------------------------------------------------------------------------
|
||||||
|
|
||||||
def pytest_plugin_registered(plugin, manager):
|
def pytest_plugin_registered(plugin, manager):
|
||||||
""" a new py lib plugin got registered. """
|
""" a new py lib plugin got registered. """
|
||||||
|
|
||||||
def pytest_plugin_unregistered(plugin):
|
def pytest_plugin_unregistered(plugin):
|
||||||
""" a py lib plugin got unregistered. """
|
""" a py lib plugin got unregistered. """
|
||||||
|
|
||||||
def pytest_internalerror(excrepr):
|
def pytest_internalerror(excrepr):
|
||||||
""" called for internal errors. """
|
""" called for internal errors. """
|
||||||
|
|
||||||
def pytest_keyboard_interrupt(excinfo):
|
def pytest_keyboard_interrupt(excinfo):
|
||||||
""" called for keyboard interrupt. """
|
""" called for keyboard interrupt. """
|
||||||
|
|
||||||
def pytest_trace(category, msg):
|
def pytest_trace(category, msg):
|
||||||
""" called for debug info. """
|
""" called for debug info. """
|
||||||
|
|
||||||
|
@ -182,25 +182,25 @@ hook specification sourcecode
|
||||||
|
|
||||||
.. sourcecode:: python
|
.. sourcecode:: python
|
||||||
|
|
||||||
|
|
||||||
def pytest_gwmanage_newgateway(gateway, platinfo):
|
def pytest_gwmanage_newgateway(gateway, platinfo):
|
||||||
""" called on new raw gateway creation. """
|
""" called on new raw gateway creation. """
|
||||||
|
|
||||||
def pytest_gwmanage_rsyncstart(source, gateways):
|
def pytest_gwmanage_rsyncstart(source, gateways):
|
||||||
""" called before rsyncing a directory to remote gateways takes place. """
|
""" called before rsyncing a directory to remote gateways takes place. """
|
||||||
|
|
||||||
def pytest_gwmanage_rsyncfinish(source, gateways):
|
def pytest_gwmanage_rsyncfinish(source, gateways):
|
||||||
""" called after rsyncing a directory to remote gateways takes place. """
|
""" called after rsyncing a directory to remote gateways takes place. """
|
||||||
|
|
||||||
def pytest_configure_node(node):
|
def pytest_configure_node(node):
|
||||||
""" configure node information before it gets instantiated. """
|
""" configure node information before it gets instantiated. """
|
||||||
|
|
||||||
def pytest_testnodeready(node):
|
def pytest_testnodeready(node):
|
||||||
""" Test Node is ready to operate. """
|
""" Test Node is ready to operate. """
|
||||||
|
|
||||||
def pytest_testnodedown(node, error):
|
def pytest_testnodedown(node, error):
|
||||||
""" Test Node is down. """
|
""" Test Node is down. """
|
||||||
|
|
||||||
def pytest_rescheduleitems(items):
|
def pytest_rescheduleitems(items):
|
||||||
""" reschedule Items from a node that went down. """
|
""" reschedule Items from a node that went down. """
|
||||||
|
|
||||||
|
|
|
@ -1,47 +1,47 @@
|
||||||
.. _`helpconfig`: helpconfig.html
|
.. _`helpconfig`: helpconfig.html
|
||||||
.. _`pytest_recwarn.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_recwarn.py
|
.. _`pytest_recwarn.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_recwarn.py
|
||||||
.. _`unittest`: unittest.html
|
.. _`unittest`: unittest.html
|
||||||
.. _`pytest_monkeypatch.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_monkeypatch.py
|
.. _`pytest_monkeypatch.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_monkeypatch.py
|
||||||
.. _`pytest_genscript.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_genscript.py
|
.. _`pytest_genscript.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_genscript.py
|
||||||
.. _`pastebin`: pastebin.html
|
.. _`pastebin`: pastebin.html
|
||||||
.. _`skipping`: skipping.html
|
.. _`skipping`: skipping.html
|
||||||
.. _`genscript`: genscript.html
|
.. _`genscript`: genscript.html
|
||||||
.. _`plugins`: index.html
|
.. _`plugins`: index.html
|
||||||
.. _`mark`: mark.html
|
.. _`mark`: mark.html
|
||||||
.. _`tmpdir`: tmpdir.html
|
.. _`tmpdir`: tmpdir.html
|
||||||
.. _`pytest_doctest.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_doctest.py
|
.. _`pytest_doctest.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_doctest.py
|
||||||
.. _`capture`: capture.html
|
.. _`capture`: capture.html
|
||||||
.. _`pytest_nose.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_nose.py
|
.. _`pytest_nose.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_nose.py
|
||||||
.. _`pytest_restdoc.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_restdoc.py
|
.. _`pytest_restdoc.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_restdoc.py
|
||||||
.. _`restdoc`: restdoc.html
|
.. _`restdoc`: restdoc.html
|
||||||
.. _`xdist`: xdist.html
|
.. _`xdist`: xdist.html
|
||||||
.. _`pytest_pastebin.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_pastebin.py
|
.. _`pytest_pastebin.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_pastebin.py
|
||||||
.. _`pytest_tmpdir.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_tmpdir.py
|
.. _`pytest_tmpdir.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_tmpdir.py
|
||||||
.. _`terminal`: terminal.html
|
.. _`terminal`: terminal.html
|
||||||
.. _`pytest_hooklog.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_hooklog.py
|
.. _`pytest_hooklog.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_hooklog.py
|
||||||
.. _`capturelog`: capturelog.html
|
.. _`capturelog`: capturelog.html
|
||||||
.. _`junitxml`: junitxml.html
|
.. _`junitxml`: junitxml.html
|
||||||
.. _`pytest_skipping.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_skipping.py
|
.. _`pytest_skipping.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_skipping.py
|
||||||
.. _`checkout the py.test development version`: ../../install.html#checkout
|
.. _`checkout the py.test development version`: ../../install.html#checkout
|
||||||
.. _`pytest_helpconfig.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_helpconfig.py
|
.. _`pytest_helpconfig.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_helpconfig.py
|
||||||
.. _`oejskit`: oejskit.html
|
.. _`oejskit`: oejskit.html
|
||||||
.. _`doctest`: doctest.html
|
.. _`doctest`: doctest.html
|
||||||
.. _`pytest_mark.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_mark.py
|
.. _`pytest_mark.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_mark.py
|
||||||
.. _`get in contact`: ../../contact.html
|
.. _`get in contact`: ../../contact.html
|
||||||
.. _`pytest_capture.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_capture.py
|
.. _`pytest_capture.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_capture.py
|
||||||
.. _`figleaf`: figleaf.html
|
.. _`figleaf`: figleaf.html
|
||||||
.. _`customize`: ../customize.html
|
.. _`customize`: ../customize.html
|
||||||
.. _`hooklog`: hooklog.html
|
.. _`hooklog`: hooklog.html
|
||||||
.. _`pytest_terminal.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_terminal.py
|
.. _`pytest_terminal.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_terminal.py
|
||||||
.. _`recwarn`: recwarn.html
|
.. _`recwarn`: recwarn.html
|
||||||
.. _`pytest_pdb.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_pdb.py
|
.. _`pytest_pdb.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_pdb.py
|
||||||
.. _`monkeypatch`: monkeypatch.html
|
.. _`monkeypatch`: monkeypatch.html
|
||||||
.. _`coverage`: coverage.html
|
.. _`coverage`: coverage.html
|
||||||
.. _`resultlog`: resultlog.html
|
.. _`resultlog`: resultlog.html
|
||||||
.. _`cov`: cov.html
|
.. _`cov`: cov.html
|
||||||
.. _`pytest_junitxml.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_junitxml.py
|
.. _`pytest_junitxml.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_junitxml.py
|
||||||
.. _`django`: django.html
|
.. _`django`: django.html
|
||||||
.. _`pytest_unittest.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_unittest.py
|
.. _`pytest_unittest.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_unittest.py
|
||||||
.. _`nose`: nose.html
|
.. _`nose`: nose.html
|
||||||
.. _`pytest_resultlog.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_resultlog.py
|
.. _`pytest_resultlog.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.4/py/_plugin/pytest_resultlog.py
|
||||||
.. _`pdb`: pdb.html
|
.. _`pdb`: pdb.html
|
||||||
|
|
|
@ -156,11 +156,11 @@ command line options
|
||||||
box each test run in a separate process (unix)
|
box each test run in a separate process (unix)
|
||||||
``--dist=distmode``
|
``--dist=distmode``
|
||||||
set mode for distributing tests to exec environments.
|
set mode for distributing tests to exec environments.
|
||||||
|
|
||||||
each: send each test to each available environment.
|
each: send each test to each available environment.
|
||||||
|
|
||||||
load: send each test to available environment.
|
load: send each test to available environment.
|
||||||
|
|
||||||
(default) no: run tests inprocess, don't distribute.
|
(default) no: run tests inprocess, don't distribute.
|
||||||
``--tx=xspec``
|
``--tx=xspec``
|
||||||
add a test execution environment. some examples: --tx popen//python=python2.5 --tx socket=192.168.1.102:8888 --tx ssh=user@codespeak.net//chdir=testcache
|
add a test execution environment. some examples: --tx popen//python=python2.5 --tx socket=192.168.1.102:8888 --tx ssh=user@codespeak.net//chdir=testcache
|
||||||
|
|
|
@ -8,7 +8,7 @@ dictionary or an import path.
|
||||||
|
|
||||||
(c) Holger Krekel and others, 2004-2010
|
(c) Holger Krekel and others, 2004-2010
|
||||||
"""
|
"""
|
||||||
__version__ = version = "1.3.4a1"
|
__version__ = version = "1.3.4"
|
||||||
|
|
||||||
import py.apipkg
|
import py.apipkg
|
||||||
|
|
||||||
|
@ -111,6 +111,7 @@ py.apipkg.initpkg(__name__, dict(
|
||||||
'frozenset' : '._builtin:frozenset',
|
'frozenset' : '._builtin:frozenset',
|
||||||
'BaseException' : '._builtin:BaseException',
|
'BaseException' : '._builtin:BaseException',
|
||||||
'GeneratorExit' : '._builtin:GeneratorExit',
|
'GeneratorExit' : '._builtin:GeneratorExit',
|
||||||
|
'_sysex' : '._builtin:_sysex',
|
||||||
'print_' : '._builtin:print_',
|
'print_' : '._builtin:print_',
|
||||||
'_reraise' : '._builtin:_reraise',
|
'_reraise' : '._builtin:_reraise',
|
||||||
'_tryimport' : '._builtin:_tryimport',
|
'_tryimport' : '._builtin:_tryimport',
|
||||||
|
|
|
@ -87,6 +87,8 @@ except NameError:
|
||||||
pass
|
pass
|
||||||
GeneratorExit.__module__ = 'exceptions'
|
GeneratorExit.__module__ = 'exceptions'
|
||||||
|
|
||||||
|
_sysex = (KeyboardInterrupt, SystemExit, MemoryError, GeneratorExit)
|
||||||
|
|
||||||
if sys.version_info >= (3, 0):
|
if sys.version_info >= (3, 0):
|
||||||
exec ("print_ = print ; exec_=exec")
|
exec ("print_ = print ; exec_=exec")
|
||||||
import builtins
|
import builtins
|
||||||
|
|
|
@ -3,7 +3,7 @@ import sys, inspect
|
||||||
from compiler import parse, ast, pycodegen
|
from compiler import parse, ast, pycodegen
|
||||||
from py._code.assertion import BuiltinAssertionError, _format_explanation
|
from py._code.assertion import BuiltinAssertionError, _format_explanation
|
||||||
|
|
||||||
passthroughex = (KeyboardInterrupt, SystemExit, MemoryError)
|
passthroughex = py.builtin._sysex
|
||||||
|
|
||||||
class Failure:
|
class Failure:
|
||||||
def __init__(self, node):
|
def __init__(self, node):
|
||||||
|
|
|
@ -55,7 +55,7 @@ class AssertionError(BuiltinAssertionError):
|
||||||
if args:
|
if args:
|
||||||
try:
|
try:
|
||||||
self.msg = str(args[0])
|
self.msg = str(args[0])
|
||||||
except (KeyboardInterrupt, SystemExit):
|
except py.builtin._sysex:
|
||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
self.msg = "<[broken __repr__] %s at %0xd>" %(
|
self.msg = "<[broken __repr__] %s at %0xd>" %(
|
||||||
|
|
|
@ -189,7 +189,7 @@ class TracebackEntry(object):
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
return self.frame.eval("__tracebackhide__")
|
return self.frame.eval("__tracebackhide__")
|
||||||
except (SystemExit, KeyboardInterrupt):
|
except py.builtin._sysex:
|
||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
return False
|
return False
|
||||||
|
@ -354,9 +354,17 @@ class ExceptionInfo(object):
|
||||||
abspath=False, tbfilter=True, funcargs=False):
|
abspath=False, tbfilter=True, funcargs=False):
|
||||||
""" return str()able representation of this exception info.
|
""" return str()able representation of this exception info.
|
||||||
showlocals: show locals per traceback entry
|
showlocals: show locals per traceback entry
|
||||||
style: long|short|no traceback style
|
style: long|short|no|native traceback style
|
||||||
tbfilter: hide entries (where __tracebackhide__ is true)
|
tbfilter: hide entries (where __tracebackhide__ is true)
|
||||||
"""
|
"""
|
||||||
|
if style == 'native':
|
||||||
|
import traceback
|
||||||
|
return ''.join(traceback.format_exception(
|
||||||
|
self.type,
|
||||||
|
self.value,
|
||||||
|
self.traceback[0]._rawentry,
|
||||||
|
))
|
||||||
|
|
||||||
fmt = FormattedExcinfo(showlocals=showlocals, style=style,
|
fmt = FormattedExcinfo(showlocals=showlocals, style=style,
|
||||||
abspath=abspath, tbfilter=tbfilter, funcargs=funcargs)
|
abspath=abspath, tbfilter=tbfilter, funcargs=funcargs)
|
||||||
return fmt.repr_excinfo(self)
|
return fmt.repr_excinfo(self)
|
||||||
|
|
|
@ -276,7 +276,7 @@ def getfslineno(obj):
|
||||||
def findsource(obj):
|
def findsource(obj):
|
||||||
try:
|
try:
|
||||||
sourcelines, lineno = py.std.inspect.findsource(obj)
|
sourcelines, lineno = py.std.inspect.findsource(obj)
|
||||||
except (KeyboardInterrupt, SystemExit):
|
except py.builtin._sysex:
|
||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
return None, None
|
return None, None
|
||||||
|
|
|
@ -5,8 +5,6 @@ builtin_repr = repr
|
||||||
|
|
||||||
reprlib = py.builtin._tryimport('repr', 'reprlib')
|
reprlib = py.builtin._tryimport('repr', 'reprlib')
|
||||||
|
|
||||||
sysex = (KeyboardInterrupt, MemoryError, SystemExit)
|
|
||||||
|
|
||||||
class SafeRepr(reprlib.Repr):
|
class SafeRepr(reprlib.Repr):
|
||||||
""" subclass of repr.Repr that limits the resulting size of repr()
|
""" subclass of repr.Repr that limits the resulting size of repr()
|
||||||
and includes information on exceptions raised during the call.
|
and includes information on exceptions raised during the call.
|
||||||
|
@ -21,7 +19,7 @@ class SafeRepr(reprlib.Repr):
|
||||||
try:
|
try:
|
||||||
# Try the vanilla repr and make sure that the result is a string
|
# Try the vanilla repr and make sure that the result is a string
|
||||||
s = call(x, *args)
|
s = call(x, *args)
|
||||||
except sysex:
|
except py.builtin._sysex:
|
||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
cls, e, tb = sys.exc_info()
|
cls, e, tb = sys.exc_info()
|
||||||
|
|
|
@ -26,7 +26,7 @@ def _getdimensions():
|
||||||
def get_terminal_width():
|
def get_terminal_width():
|
||||||
try:
|
try:
|
||||||
height, width = _getdimensions()
|
height, width = _getdimensions()
|
||||||
except (SystemExit, KeyboardInterrupt):
|
except py.builtin._sysex:
|
||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
# FALLBACK
|
# FALLBACK
|
||||||
|
|
|
@ -22,7 +22,7 @@ def pytest_addoption(parser):
|
||||||
help="(deprecated, use -r)")
|
help="(deprecated, use -r)")
|
||||||
group._addoption('--tb', metavar="style",
|
group._addoption('--tb', metavar="style",
|
||||||
action="store", dest="tbstyle", default='long',
|
action="store", dest="tbstyle", default='long',
|
||||||
type="choice", choices=['long', 'short', 'no', 'line'],
|
type="choice", choices=['long', 'short', 'no', 'line', 'native'],
|
||||||
help="traceback print mode (long/short/line/no).")
|
help="traceback print mode (long/short/line/no).")
|
||||||
group._addoption('--fulltrace',
|
group._addoption('--fulltrace',
|
||||||
action="store_true", dest="fulltrace", default=False,
|
action="store_true", dest="fulltrace", default=False,
|
||||||
|
|
|
@ -102,7 +102,7 @@ class Node(object):
|
||||||
return getattr(self, attrname)
|
return getattr(self, attrname)
|
||||||
try:
|
try:
|
||||||
res = function()
|
res = function()
|
||||||
except (KeyboardInterrupt, SystemExit):
|
except py.builtin._sysex:
|
||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
failure = py.std.sys.exc_info()
|
failure = py.std.sys.exc_info()
|
||||||
|
|
10
setup.py
10
setup.py
|
@ -12,8 +12,12 @@ py.test and pylib: rapid testing and development utils
|
||||||
- `py.code`_: dynamic code compile and traceback printing support
|
- `py.code`_: dynamic code compile and traceback printing support
|
||||||
|
|
||||||
Platforms: Linux, Win32, OSX
|
Platforms: Linux, Win32, OSX
|
||||||
|
|
||||||
Interpreters: Python versions 2.4 through to 3.2, Jython 2.5.1 and PyPy
|
Interpreters: Python versions 2.4 through to 3.2, Jython 2.5.1 and PyPy
|
||||||
For questions please check out http://pylib.org/contact.html
|
|
||||||
|
Bugs and issues: http://bitbucket.org/hpk42/py-trunk/issues/
|
||||||
|
|
||||||
|
Mailing lists and more contact points: http://pylib.org/contact.html
|
||||||
|
|
||||||
.. _`py.test`: http://pytest.org
|
.. _`py.test`: http://pytest.org
|
||||||
.. _`py.path`: http://pylib.org/path.html
|
.. _`py.path`: http://pylib.org/path.html
|
||||||
|
@ -26,14 +30,14 @@ def main():
|
||||||
name='py',
|
name='py',
|
||||||
description='py.test and pylib: rapid testing and development utils.',
|
description='py.test and pylib: rapid testing and development utils.',
|
||||||
long_description = long_description,
|
long_description = long_description,
|
||||||
version= '1.3.4a1',
|
version= '1.3.4',
|
||||||
url='http://pylib.org',
|
url='http://pylib.org',
|
||||||
license='MIT license',
|
license='MIT license',
|
||||||
platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],
|
platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],
|
||||||
author='holger krekel, Guido Wesdorp, Carl Friedrich Bolz, Armin Rigo, Maciej Fijalkowski & others',
|
author='holger krekel, Guido Wesdorp, Carl Friedrich Bolz, Armin Rigo, Maciej Fijalkowski & others',
|
||||||
author_email='holger at merlinux.eu',
|
author_email='holger at merlinux.eu',
|
||||||
entry_points= make_entry_points(),
|
entry_points= make_entry_points(),
|
||||||
classifiers=['Development Status :: 5 - Production/Stable',
|
classifiers=['Development Status :: 6 - Mature',
|
||||||
'Intended Audience :: Developers',
|
'Intended Audience :: Developers',
|
||||||
'License :: OSI Approved :: MIT License',
|
'License :: OSI Approved :: MIT License',
|
||||||
'Operating System :: POSIX',
|
'Operating System :: POSIX',
|
||||||
|
|
|
@ -700,3 +700,16 @@ raise ValueError()
|
||||||
repr = excinfo.getrepr(**reproptions)
|
repr = excinfo.getrepr(**reproptions)
|
||||||
repr.toterminal(tw)
|
repr.toterminal(tw)
|
||||||
assert tw.stringio.getvalue()
|
assert tw.stringio.getvalue()
|
||||||
|
|
||||||
|
|
||||||
|
def test_native_style(self):
|
||||||
|
excinfo = self.excinfo_from_exec("""
|
||||||
|
assert 0
|
||||||
|
""")
|
||||||
|
repr = excinfo.getrepr(style='native')
|
||||||
|
assert repr.startswith('Traceback (most recent call last):\n File')
|
||||||
|
assert repr.endswith('\nAssertionError: assert 0\n')
|
||||||
|
assert 'exec (source.compile())' in repr
|
||||||
|
# python 2.4 fails to get the source line for the assert
|
||||||
|
if py.std.sys.version_info >= (2, 5):
|
||||||
|
assert repr.count('assert 0') == 2
|
||||||
|
|
Loading…
Reference in New Issue