[pypy-commit] pypy pytest-25: sync pytest.py as well and kill pytest_cov.py
rlamy
noreply at buildbot.pypy.org
Sun Apr 13 19:10:33 CEST 2014
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: pytest-25
Changeset: r70616:c00584626471
Date: 2014-04-12 22:15 +0100
http://bitbucket.org/pypy/pypy/changeset/c00584626471/
Log: sync pytest.py as well and kill pytest_cov.py
diff --git a/pytest.py b/pytest.py
--- a/pytest.py
+++ b/pytest.py
@@ -1,49 +1,19 @@
#!/usr/bin/env python
+# PYTHON_ARGCOMPLETE_OK
"""
-PyPy Test runner interface
---------------------------
-
-Running pytest.py starts py.test, the testing tool
-we use in PyPy. It is distributed along with PyPy,
-but you may get more information about it at
-http://pytest.org/.
-
-Note that it makes no sense to run all tests at once.
-You need to pick a particular subdirectory and run
-
- cd pypy/.../test
- ../../../pytest.py [options]
-
-For more information, use pytest.py -h.
+pytest: unit and functional testing with Python.
"""
__all__ = ['main']
-# XXX hack for win64:
-# This patch must stay here until the END OF STAGE 1
-# When all tests work, this branch will be merged
-# and the branch stage 2 is started, where we remove this patch.
-import sys
-if hasattr(sys, "maxint") and hasattr(sys, "maxsize"):
- if sys.maxint != sys.maxsize:
- sys.maxint = sys.maxsize
- import warnings
- warnings.warn("""\n
----> This win64 port is now in stage 1: sys.maxint was modified.
----> When pypy/__init__.py becomes empty again, we have reached stage 2.
-""")
+if __name__ == '__main__': # if run as a script or by 'python -m pytest'
+ # we trigger the below "else" condition by the following import
+ import pytest
+ raise SystemExit(pytest.main())
-from _pytest.core import main, UsageError, _preloadplugins
-from _pytest import core as cmdline
+# else we are imported
+
+from _pytest.config import main, UsageError, _preloadplugins, cmdline
from _pytest import __version__
-if __name__ == '__main__': # if run as a script or by 'python -m pytest'
- import os
- if len(sys.argv) == 1 and os.path.dirname(sys.argv[0]) in '.':
- print >> sys.stderr, __doc__
- sys.exit(2)
+_preloadplugins() # to populate pytest.* namespace so help(pytest) works
- #XXX: sync to upstream later
- import pytest_cov
- raise SystemExit(main(plugins=[pytest_cov]))
-else:
- _preloadplugins() # to populate pytest.* namespace so help(pytest) works
diff --git a/pytest_cov.py b/pytest_cov.py
deleted file mode 100644
--- a/pytest_cov.py
+++ /dev/null
@@ -1,353 +0,0 @@
-"""produce code coverage reports using the 'coverage' package, including support for distributed testing.
-
-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 pytest-cov or
-through coverage's config file.
-
-
-Installation
-------------
-
-The `pytest-cov`_ package may be installed with pip or easy_install::
-
- pip install pytest-cov
- easy_install 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
------
-
-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/
-
-Shows a terminal report::
-
- -------------------- 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: 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/
-
-Shows a terminal report::
-
- -------------------- 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%
-
-
-Again but spread over different hosts and different directories::
-
- py.test --cov myproj --dist load
- --tx ssh=memedough at host1//chdir=testenv1
- --tx ssh=memedough at host2//chdir=/tmp/testenv2//python=/tmp/env1/bin/python
- --rsyncdir myproj --rsyncdir tests --rsync examples
- tests/
-
-Shows a terminal report::
-
- -------------------- 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: Each
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-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 at host2//chdir=/tmp/testenv4//python=/tmp/env2/bin/python
- --rsyncdir myproj --rsyncdir tests --rsync examples
- tests/
-
-Shows a terminal report::
-
- ---------------------------------------- coverage ----------------------------------------
- platform linux2, python 2.6.5-final-0
- 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
----------
-
-It is possible to generate any combination of the reports for a single test run.
-
-The available reports are terminal (with or without missing line numbers shown), HTML, XML and
-annotated source code.
-
-The terminal report without line numbers (default)::
-
- 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
-------------------
-
-The data file is erased at the beginning of testing to ensure clean data for each test run.
-
-The data file is left at the end of testing so that it is possible to use normal coverage tools to
-examine it.
-
-
-Coverage Config File
---------------------
-
-This plugin provides a clean minimal set of command line options that are added to pytest. For
-further control of coverage use a coverage config file.
-
-For example if tests are contained within the directory tree being measured the tests may be
-excluded if desired by using a .coveragerc file with the omit option set::
-
- py.test --cov-config .coveragerc
- --cov myproj
- myproj/tests/
-
-Where the .coveragerc file contains file globs::
-
- [run]
- omit = tests/*
-
-For full details refer to the `coverage config file`_ documentation.
-
-.. _`coverage config file`: http://nedbatchelder.com/code/coverage/config.html
-
-Note that this plugin controls some options and setting the option in the config file will have no
-effect. These include specifying source to be measured (source option) and all data file handling
-(data_file and parallel options).
-
-
-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 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
-----------------
-
-Whilst this plugin has been built fresh from the ground up 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.
-
-Ned Batchelder for coverage and its ability to combine the coverage results of parallel runs.
-
-Holger Krekel for pytest with its distributed testing support.
-
-Jason Pellerin for nose.
-
-Michael Foord for unittest2.
-
-No doubt others have contributed to these tools as well.
-"""
-
-
-def pytest_addoption(parser):
- """Add options to control coverage."""
-
- group = parser.getgroup('coverage reporting with distributed testing support')
- group.addoption('--cov', action='append', default=[], metavar='path',
- dest='cov_source',
- help='measure coverage for filesystem path (multi-allowed)')
- group.addoption('--cov-report', action='append', default=[], metavar='type',
- choices=['term', 'term-missing', 'annotate', 'html', 'xml'],
- dest='cov_report',
- help='type of report to generate: term, term-missing, annotate, html, xml (multi-allowed)')
- group.addoption('--cov-config', action='store', default='.coveragerc', metavar='path',
- dest='cov_config',
- help='config file for coverage, default: .coveragerc')
-
-
-def pytest_configure(config):
- """Activate coverage plugin if appropriate."""
-
- if config.getvalue('cov_source'):
- config.pluginmanager.register(CovPlugin(), '_cov')
-
-
-class CovPlugin(object):
- """Use coverage package to produce code coverage reports.
-
- Delegates all work to a particular implementation based on whether
- this test process is centralised, a distributed master or a
- distributed slave.
- """
-
- def __init__(self):
- """Creates a coverage pytest plugin.
-
- We read the rc file that coverage uses to get the data file
- name. This is needed since we give coverage through it's API
- the data file name.
- """
-
- # Our implementation is unknown at this time.
- self.cov_controller = None
-
- def pytest_sessionstart(self, session):
- """At session start determine our implementation and delegate to it."""
-
- import cov_core
-
- cov_source = session.config.getvalue('cov_source')
- cov_report = session.config.getvalue('cov_report') or ['term']
- cov_config = session.config.getvalue('cov_config')
-
- session_name = session.__class__.__name__
- is_master = (session.config.pluginmanager.hasplugin('dsession') or
- session_name == 'DSession')
- is_slave = (hasattr(session.config, 'slaveinput') or
- session_name == 'SlaveSession')
- nodeid = None
-
- if is_master:
- controller_cls = cov_core.DistMaster
- elif is_slave:
- controller_cls = cov_core.DistSlave
- nodeid = session.config.slaveinput.get('slaveid', getattr(session, 'nodeid'))
- else:
- controller_cls = cov_core.Central
-
- self.cov_controller = controller_cls(cov_source,
- cov_report,
- cov_config,
- session.config,
- nodeid)
-
- self.cov_controller.start()
-
- def pytest_configure_node(self, node):
- """Delegate to our implementation."""
-
- self.cov_controller.configure_node(node)
- pytest_configure_node.optionalhook = True
-
- def pytest_testnodedown(self, node, error):
- """Delegate to our implementation."""
-
- self.cov_controller.testnodedown(node, error)
- pytest_testnodedown.optionalhook = True
-
- def pytest_sessionfinish(self, session, exitstatus):
- """Delegate to our implementation."""
-
- self.cov_controller.finish()
-
- def pytest_terminal_summary(self, terminalreporter):
- """Delegate to our implementation."""
-
- self.cov_controller.summary(terminalreporter._tw)
-
-
-def pytest_funcarg__cov(request):
- """A pytest funcarg that provides access to the underlying coverage object."""
-
- # Check with hasplugin to avoid getplugin exception in older pytest.
- if request.config.pluginmanager.hasplugin('_cov'):
- plugin = request.config.pluginmanager.getplugin('_cov')
- if plugin.cov_controller:
- return plugin.cov_controller.cov
- return None
More information about the pypy-commit
mailing list