commit
4b2cb3acbe
3
.hgtags
3
.hgtags
|
@ -28,3 +28,6 @@ d5eacf390af74553227122b85e20345d47b2f9e6 1.3.1
|
|||
8b8e7c25a13cf863f01b2dd955978285ae9daf6a 1.3.1
|
||||
3bff44b188a7ec1af328d977b9d39b6757bb38df 1.3.2
|
||||
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
|
||||
==================================================
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
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
|
||||
|
@ -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
|
||||
reproducible and reliable test environment.
|
||||
|
||||
|
||||
.. _`virtualenv`: http://pypi.python.org/pypi/virtualenv
|
||||
.. _`buildout`: http://www.buildout.org/
|
||||
.. _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:
|
||||
|
||||
|
@ -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
|
||||
all core features and runs unchanged under Python2 and Python3 interpreters.
|
||||
|
||||
Troubleshooting / known issues
|
||||
===============================
|
||||
|
||||
.. _`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
|
||||
.. _`Python for Windows`: http://www.imladris.com/Scripts/PythonForWindows.html
|
||||
|
||||
.. _mercurial: http://mercurial.selenic.com/wiki/
|
||||
.. _`Distribute`:
|
||||
|
|
|
@ -6,27 +6,39 @@ produce code coverage reports using the 'coverage' package, including support fo
|
|||
.. contents::
|
||||
:local:
|
||||
|
||||
This plugin produces coverage reports using the coverage package. It
|
||||
supports centralised testing and distributed testing in both load and
|
||||
each modes.
|
||||
This plugin produces coverage reports. It supports centralised testing and distributed testing in
|
||||
both load and each modes. It also supports coverage of subprocesses.
|
||||
|
||||
All features offered by the coverage package should be available,
|
||||
either through this plugin or through coverage's own config file.
|
||||
All features offered by the coverage package should be available, either through pytest-cov or
|
||||
through coverage's config file.
|
||||
|
||||
|
||||
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 uninstall pytest-cov
|
||||
|
||||
Alternatively easy_install can be used::
|
||||
|
||||
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
|
||||
|
@ -35,6 +47,9 @@ Usage
|
|||
Centralised Testing
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Centralised testing will report on the combined coverage of the main process and all of it's
|
||||
subprocesses.
|
||||
|
||||
Running centralised testing::
|
||||
|
||||
py.test --cov myproj tests/
|
||||
|
@ -42,150 +57,149 @@ Running centralised testing::
|
|||
Shows a terminal report::
|
||||
|
||||
-------------------- coverage: platform linux2, python 2.6.4-final-0 ---------------------
|
||||
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%
|
||||
Name Stmts Miss Cover
|
||||
----------------------------------------
|
||||
myproj/__init__ 2 0 100%
|
||||
myproj/myproj 257 13 94%
|
||||
myproj/feature4286 94 7 92%
|
||||
----------------------------------------
|
||||
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/
|
||||
|
||||
The results from the slaves will be combined like so::
|
||||
Shows a terminal report::
|
||||
|
||||
-------------------- coverage: platform linux2, python 2.6.4-final-0 ---------------------
|
||||
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%
|
||||
Name Stmts Miss Cover
|
||||
----------------------------------------
|
||||
myproj/__init__ 2 0 100%
|
||||
myproj/myproj 257 13 94%
|
||||
myproj/feature4286 94 7 92%
|
||||
----------------------------------------
|
||||
TOTAL 353 20 94%
|
||||
|
||||
|
||||
Distributed testing in each mode::
|
||||
Again but spread over different hosts and different directories::
|
||||
|
||||
py.test --cov myproj --dist=each
|
||||
--tx=popen//python=/usr/local/python265/bin/python
|
||||
--tx=popen//python=/usr/local/python27b1/bin/python
|
||||
py.test --cov myproj --dist load
|
||||
--tx ssh=memedough@host1//chdir=testenv1
|
||||
--tx ssh=memedough@host2//chdir=/tmp/testenv2//python=/tmp/env1/bin/python
|
||||
--rsyncdir myproj --rsyncdir tests --rsync examples
|
||||
tests/
|
||||
|
||||
Will produce a report for each slave::
|
||||
Shows a terminal report::
|
||||
|
||||
-------------------- coverage: platform linux2, python 2.6.5-final-0 ---------------------
|
||||
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%
|
||||
--------------------- 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%
|
||||
-------------------- 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%
|
||||
|
||||
|
||||
Distributed testing in each mode can also produce a single combined
|
||||
report. This is useful to get coverage information spanning things
|
||||
such as all python versions::
|
||||
Distributed Testing: Each
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
py.test --cov myproj --cov-combine-each --dist=each
|
||||
--tx=popen//python=/usr/local/python265/bin/python
|
||||
--tx=popen//python=/usr/local/python27b1/bin/python
|
||||
Distributed testing with dist mode set to each will report on the combined coverage of all slaves.
|
||||
Since each slave is running all tests this allows generating a combined coverage report for multiple
|
||||
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/
|
||||
|
||||
Which looks like::
|
||||
Shows a terminal report::
|
||||
|
||||
---------------------------------------- coverage ----------------------------------------
|
||||
platform linux2, python 2.6.5-final-0
|
||||
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%
|
||||
platform linux2, python 2.7.0-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%
|
||||
|
||||
|
||||
Reporting
|
||||
---------
|
||||
|
||||
By default a terminal report is output. This report can be disabled
|
||||
if desired, such as when results are going to a continuous integration
|
||||
system and the terminal output won't be seen.
|
||||
It is possible to generate any combination of the reports for a single test run.
|
||||
|
||||
In addition and without rerunning tests it is possible to generate
|
||||
annotated source code, a html report and an xml report.
|
||||
The available reports are terminal (with or without missing line numbers shown), HTML, XML and
|
||||
annotated source code.
|
||||
|
||||
The directories for annotated source code and html reports can be
|
||||
specified as can the file name for the xml report.
|
||||
The terminal report without line numbers (default)::
|
||||
|
||||
Since testing often takes a non trivial amount of time at the end of
|
||||
testing any / all of the reports may be generated.
|
||||
py.test --cov-report term --cov myproj tests/
|
||||
|
||||
-------------------- 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
|
||||
------------------
|
||||
|
||||
During testing there may be many data files with coverage data. These
|
||||
will have unique suffixes and will be combined at the end of testing.
|
||||
The data file is erased at the beginning of testing to ensure clean data for each test run.
|
||||
|
||||
Upon completion, for --dist=load (and also for --dist=each when the
|
||||
--cov-combine-each option is used) there will only be one data file.
|
||||
|
||||
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
|
||||
The data file is left at the end of testing so that it is possible to use normal coverage tools to
|
||||
examine it.
|
||||
|
||||
|
||||
Limitations
|
||||
-----------
|
||||
|
||||
For distributed testing the slaves must have the pytest-cov package
|
||||
installed. This is needed since the plugin must be registered through
|
||||
setuptools / distribute for pytest to start the plugin on the slave.
|
||||
For distributed testing the slaves must have the pytest-cov package installed. This is needed since
|
||||
the plugin must be registered through setuptools / distribute for pytest to start the plugin on the
|
||||
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
|
||||
|
@ -193,14 +207,11 @@ Acknowledgements
|
|||
|
||||
Holger Krekel for pytest with its distributed testing support.
|
||||
|
||||
Ned Batchelder for coverage and its ability to combine the coverage
|
||||
results of parallel runs.
|
||||
Ned Batchelder for coverage and its ability to combine the coverage results of parallel runs.
|
||||
|
||||
Whilst this plugin has been built fresh from the ground up to support
|
||||
distributed testing it has been influenced by the work done on
|
||||
pytest-coverage (Ross Lawley, James Mills, Holger Krekel) and
|
||||
nose-cover (Jason Pellerin) which are other coverage plugins for
|
||||
pytest and nose respectively.
|
||||
Whilst this plugin has been built fresh from the ground up to support distributed testing it has
|
||||
been influenced by the work done on pytest-coverage (Ross Lawley, James Mills, Holger Krekel) and
|
||||
nose-cover (Jason Pellerin) which are other coverage plugins for pytest and nose respectively.
|
||||
|
||||
No doubt others have contributed to these tools as well.
|
||||
|
||||
|
@ -208,43 +219,11 @@ command line options
|
|||
--------------------
|
||||
|
||||
|
||||
``--cov-on``
|
||||
enable coverage, only needed if not specifying any --cov options
|
||||
``--cov=package``
|
||||
collect coverage for the specified package (multi-allowed)
|
||||
``--cov-no-terminal``
|
||||
disable printing a report on the terminal
|
||||
``--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
|
||||
``--cov=path``
|
||||
measure coverage for filesystem path (multi-allowed)
|
||||
``--cov-report=type``
|
||||
type of report to generate: term, term-missing, annotate, html, xml (multi-allowed)
|
||||
``--cov-config=path``
|
||||
config file for coverage, default: .coveragerc
|
||||
|
||||
.. include:: links.txt
|
||||
|
|
|
@ -6,10 +6,27 @@ Write and report coverage data with the 'coverage' package.
|
|||
.. contents::
|
||||
:local:
|
||||
|
||||
Original code by Ross Lawley.
|
||||
Note: Original code by Ross Lawley.
|
||||
|
||||
Requires Ned Batchelder's excellent coverage:
|
||||
http://nedbatchelder.com/code/coverage/
|
||||
Install
|
||||
--------------
|
||||
|
||||
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
|
||||
--------------------
|
||||
|
@ -21,8 +38,11 @@ command line options
|
|||
html: Directory for html output.
|
||||
report: Output a text report.
|
||||
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``
|
||||
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``
|
||||
Show missing files
|
||||
``--cover-ignore-errors=IGNORE_ERRORS``
|
||||
|
|
|
@ -6,16 +6,29 @@ report test coverage using the 'figleaf' package.
|
|||
.. contents::
|
||||
: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
|
||||
---------------
|
||||
|
||||
after pip or easy_install mediated installation of ``pytest-figleaf`` you can type::
|
||||
After installation you can simply type::
|
||||
|
||||
py.test --figleaf [...]
|
||||
|
||||
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 ``fig-html`` to modify the paths.
|
||||
and "html" directory will be created. You can use command line options
|
||||
to control where data and html files are created.
|
||||
|
||||
command line options
|
||||
--------------------
|
||||
|
|
|
@ -1,47 +1,47 @@
|
|||
.. _`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
|
||||
.. _`pytest_monkeypatch.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_monkeypatch.py
|
||||
.. _`pytest_genscript.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_genscript.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.4/py/_plugin/pytest_genscript.py
|
||||
.. _`pastebin`: pastebin.html
|
||||
.. _`skipping`: skipping.html
|
||||
.. _`genscript`: genscript.html
|
||||
.. _`plugins`: index.html
|
||||
.. _`mark`: mark.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
|
||||
.. _`pytest_nose.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_nose.py
|
||||
.. _`pytest_restdoc.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_restdoc.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.4/py/_plugin/pytest_restdoc.py
|
||||
.. _`restdoc`: restdoc.html
|
||||
.. _`xdist`: xdist.html
|
||||
.. _`pytest_pastebin.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_pastebin.py
|
||||
.. _`pytest_tmpdir.py`: http://bitbucket.org/hpk42/py-trunk/raw/1.3.2/py/_plugin/pytest_tmpdir.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.4/py/_plugin/pytest_tmpdir.py
|
||||
.. _`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
|
||||
.. _`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
|
||||
.. _`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
|
||||
.. _`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
|
||||
.. _`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
|
||||
.. _`customize`: ../customize.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
|
||||
.. _`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
|
||||
.. _`coverage`: coverage.html
|
||||
.. _`resultlog`: resultlog.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
|
||||
.. _`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
|
||||
.. _`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
|
||||
|
|
|
@ -8,7 +8,7 @@ dictionary or an import path.
|
|||
|
||||
(c) Holger Krekel and others, 2004-2010
|
||||
"""
|
||||
__version__ = version = "1.3.4a1"
|
||||
__version__ = version = "1.3.4"
|
||||
|
||||
import py.apipkg
|
||||
|
||||
|
@ -111,6 +111,7 @@ py.apipkg.initpkg(__name__, dict(
|
|||
'frozenset' : '._builtin:frozenset',
|
||||
'BaseException' : '._builtin:BaseException',
|
||||
'GeneratorExit' : '._builtin:GeneratorExit',
|
||||
'_sysex' : '._builtin:_sysex',
|
||||
'print_' : '._builtin:print_',
|
||||
'_reraise' : '._builtin:_reraise',
|
||||
'_tryimport' : '._builtin:_tryimport',
|
||||
|
|
|
@ -87,6 +87,8 @@ except NameError:
|
|||
pass
|
||||
GeneratorExit.__module__ = 'exceptions'
|
||||
|
||||
_sysex = (KeyboardInterrupt, SystemExit, MemoryError, GeneratorExit)
|
||||
|
||||
if sys.version_info >= (3, 0):
|
||||
exec ("print_ = print ; exec_=exec")
|
||||
import builtins
|
||||
|
|
|
@ -3,7 +3,7 @@ import sys, inspect
|
|||
from compiler import parse, ast, pycodegen
|
||||
from py._code.assertion import BuiltinAssertionError, _format_explanation
|
||||
|
||||
passthroughex = (KeyboardInterrupt, SystemExit, MemoryError)
|
||||
passthroughex = py.builtin._sysex
|
||||
|
||||
class Failure:
|
||||
def __init__(self, node):
|
||||
|
|
|
@ -55,7 +55,7 @@ class AssertionError(BuiltinAssertionError):
|
|||
if args:
|
||||
try:
|
||||
self.msg = str(args[0])
|
||||
except (KeyboardInterrupt, SystemExit):
|
||||
except py.builtin._sysex:
|
||||
raise
|
||||
except:
|
||||
self.msg = "<[broken __repr__] %s at %0xd>" %(
|
||||
|
|
|
@ -189,7 +189,7 @@ class TracebackEntry(object):
|
|||
"""
|
||||
try:
|
||||
return self.frame.eval("__tracebackhide__")
|
||||
except (SystemExit, KeyboardInterrupt):
|
||||
except py.builtin._sysex:
|
||||
raise
|
||||
except:
|
||||
return False
|
||||
|
@ -354,9 +354,17 @@ class ExceptionInfo(object):
|
|||
abspath=False, tbfilter=True, funcargs=False):
|
||||
""" return str()able representation of this exception info.
|
||||
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)
|
||||
"""
|
||||
if style == 'native':
|
||||
import traceback
|
||||
return ''.join(traceback.format_exception(
|
||||
self.type,
|
||||
self.value,
|
||||
self.traceback[0]._rawentry,
|
||||
))
|
||||
|
||||
fmt = FormattedExcinfo(showlocals=showlocals, style=style,
|
||||
abspath=abspath, tbfilter=tbfilter, funcargs=funcargs)
|
||||
return fmt.repr_excinfo(self)
|
||||
|
|
|
@ -276,7 +276,7 @@ def getfslineno(obj):
|
|||
def findsource(obj):
|
||||
try:
|
||||
sourcelines, lineno = py.std.inspect.findsource(obj)
|
||||
except (KeyboardInterrupt, SystemExit):
|
||||
except py.builtin._sysex:
|
||||
raise
|
||||
except:
|
||||
return None, None
|
||||
|
|
|
@ -5,8 +5,6 @@ builtin_repr = repr
|
|||
|
||||
reprlib = py.builtin._tryimport('repr', 'reprlib')
|
||||
|
||||
sysex = (KeyboardInterrupt, MemoryError, SystemExit)
|
||||
|
||||
class SafeRepr(reprlib.Repr):
|
||||
""" subclass of repr.Repr that limits the resulting size of repr()
|
||||
and includes information on exceptions raised during the call.
|
||||
|
@ -21,7 +19,7 @@ class SafeRepr(reprlib.Repr):
|
|||
try:
|
||||
# Try the vanilla repr and make sure that the result is a string
|
||||
s = call(x, *args)
|
||||
except sysex:
|
||||
except py.builtin._sysex:
|
||||
raise
|
||||
except:
|
||||
cls, e, tb = sys.exc_info()
|
||||
|
|
|
@ -26,7 +26,7 @@ def _getdimensions():
|
|||
def get_terminal_width():
|
||||
try:
|
||||
height, width = _getdimensions()
|
||||
except (SystemExit, KeyboardInterrupt):
|
||||
except py.builtin._sysex:
|
||||
raise
|
||||
except:
|
||||
# FALLBACK
|
||||
|
|
|
@ -22,7 +22,7 @@ def pytest_addoption(parser):
|
|||
help="(deprecated, use -r)")
|
||||
group._addoption('--tb', metavar="style",
|
||||
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).")
|
||||
group._addoption('--fulltrace',
|
||||
action="store_true", dest="fulltrace", default=False,
|
||||
|
|
|
@ -102,7 +102,7 @@ class Node(object):
|
|||
return getattr(self, attrname)
|
||||
try:
|
||||
res = function()
|
||||
except (KeyboardInterrupt, SystemExit):
|
||||
except py.builtin._sysex:
|
||||
raise
|
||||
except:
|
||||
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
|
||||
|
||||
Platforms: Linux, Win32, OSX
|
||||
|
||||
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.path`: http://pylib.org/path.html
|
||||
|
@ -26,14 +30,14 @@ def main():
|
|||
name='py',
|
||||
description='py.test and pylib: rapid testing and development utils.',
|
||||
long_description = long_description,
|
||||
version= '1.3.4a1',
|
||||
version= '1.3.4',
|
||||
url='http://pylib.org',
|
||||
license='MIT license',
|
||||
platforms=['unix', 'linux', 'osx', 'cygwin', 'win32'],
|
||||
author='holger krekel, Guido Wesdorp, Carl Friedrich Bolz, Armin Rigo, Maciej Fijalkowski & others',
|
||||
author_email='holger at merlinux.eu',
|
||||
entry_points= make_entry_points(),
|
||||
classifiers=['Development Status :: 5 - Production/Stable',
|
||||
classifiers=['Development Status :: 6 - Mature',
|
||||
'Intended Audience :: Developers',
|
||||
'License :: OSI Approved :: MIT License',
|
||||
'Operating System :: POSIX',
|
||||
|
|
|
@ -700,3 +700,16 @@ raise ValueError()
|
|||
repr = excinfo.getrepr(**reproptions)
|
||||
repr.toterminal(tw)
|
||||
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