Merged contributing-community into default

This commit is contained in:
holger krekel 2015-02-27 11:17:14 +01:00
commit e9d4853296
1 changed files with 54 additions and 19 deletions

View File

@ -1,7 +1,7 @@
.. _plugins: .. _plugins:
Working with plugins and conftest files Working with plugins and conftest files
============================================= =======================================
``pytest`` implements all aspects of configuration, collection, running and reporting by calling `well specified hooks`_. Virtually any Python module can be registered as a plugin. It can implement any number of hook functions (usually two or three) which all have a ``pytest_`` prefix, making hook functions easy to distinguish and find. There are three basic location types: ``pytest`` implements all aspects of configuration, collection, running and reporting by calling `well specified hooks`_. Virtually any Python module can be registered as a plugin. It can implement any number of hook functions (usually two or three) which all have a ``pytest_`` prefix, making hook functions easy to distinguish and find. There are three basic location types:
@ -16,7 +16,7 @@ Working with plugins and conftest files
.. _`conftest`: .. _`conftest`:
conftest.py: local per-directory plugins conftest.py: local per-directory plugins
-------------------------------------------------------------- ----------------------------------------
local ``conftest.py`` plugins contain directory-specific hook local ``conftest.py`` plugins contain directory-specific hook
implementations. Session and test running activities will implementations. Session and test running activities will
@ -55,7 +55,7 @@ Here is how you might run it::
.. _`extplugins`: .. _`extplugins`:
Installing External Plugins / Searching Installing External Plugins / Searching
------------------------------------------------------ ---------------------------------------
Installing a plugin happens through any usual Python installation Installing a plugin happens through any usual Python installation
tool, for example:: tool, for example::
@ -119,8 +119,42 @@ You may also discover more plugins through a `pytest- pypi.python.org search`_.
.. _`available installable plugins`: .. _`available installable plugins`:
.. _`pytest- pypi.python.org search`: http://pypi.python.org/pypi?%3Aaction=search&term=pytest-&submit=search .. _`pytest- pypi.python.org search`: http://pypi.python.org/pypi?%3Aaction=search&term=pytest-&submit=search
External plugin development
---------------------------
Pytest community cares about pytest users, in particular, it's crucial for the community
to keep all pieces of the pytest ecosystem well supported. External plugins are important for
pytest users, as they implement many useful, and sometimes critical features which the pytest core does
not implement.
To simplify the plugin development and/or support, it was decided to create teams(companies) on popular code hosting
services (at the moment it's github and bitbucket):
* `<https://github.com/pytest-dev>`_:
probably the most popular hosting for pytest plugins
the name ``pytest-dev`` is choosen because ``pytest`` was already taken by
some unknown person, who's not active on the github or just doesn't check the email used to register
that organization.
* `<https://bitbucket.org/pytest-dev>`_:
pytest is hosted on the bitbucket, also a lot of pytest plugins are hosted there.
More code hosting services can be added in the future.
Community encourages pytest plugin developers to move their plugins under those organizations (eg transfer ownership),
paying with a better support, faster feedback, better discoverability, etc.
Generic workflow of the ownership transfer looks like:
* If not a member already, developer asks for a membership in the `pytest plugin developers community` organizations listed above, sending an email to `<pytest-dev@python.org>`_.
* Developer transfers the ownership of his plugin repository to the organization listed above.
* Existing organization members will make sure proper write permissions are set up for developer who transfered the ownership to the organization.
Writing a plugin by looking at examples Writing a plugin by looking at examples
------------------------------------------------------ ---------------------------------------
.. _`Distribute`: http://pypi.python.org/pypi/distribute .. _`Distribute`: http://pypi.python.org/pypi/distribute
.. _`setuptools`: http://pypi.python.org/pypi/setuptools .. _`setuptools`: http://pypi.python.org/pypi/setuptools
@ -138,7 +172,7 @@ to extend and add functionality.
.. _`setuptools entry points`: .. _`setuptools entry points`:
Making your plugin installable by others Making your plugin installable by others
----------------------------------------------- ----------------------------------------
If you want to make your plugin externally available, you If you want to make your plugin externally available, you
may define a so-called entry point for your distribution so may define a so-called entry point for your distribution so
@ -169,10 +203,11 @@ If a package is installed this way, ``pytest`` will load
``myproject.pluginmodule`` as a plugin which can define ``myproject.pluginmodule`` as a plugin which can define
`well specified hooks`_. `well specified hooks`_.
.. _`pluginorder`: .. _`pluginorder`:
Plugin discovery order at tool startup Plugin discovery order at tool startup
-------------------------------------------- --------------------------------------
``pytest`` loads plugin modules at tool startup in the following way: ``pytest`` loads plugin modules at tool startup in the following way:
@ -199,7 +234,7 @@ Plugin discovery order at tool startup
Requiring/Loading plugins in a test module or conftest file Requiring/Loading plugins in a test module or conftest file
------------------------------------------------------------- -----------------------------------------------------------
You can require plugins in a test module or a conftest file like this:: You can require plugins in a test module or a conftest file like this::
@ -214,7 +249,7 @@ which will import the specified module as a ``pytest`` plugin.
Accessing another plugin by name Accessing another plugin by name
-------------------------------------------- --------------------------------
If a plugin wants to collaborate with code from If a plugin wants to collaborate with code from
another plugin it can obtain a reference through another plugin it can obtain a reference through
@ -230,7 +265,7 @@ the ``--traceconfig`` option.
.. _`findpluginname`: .. _`findpluginname`:
Finding out which plugins are active Finding out which plugins are active
---------------------------------------------------------------------------- ------------------------------------
If you want to find out which plugins are active in your If you want to find out which plugins are active in your
environment you can type:: environment you can type::
@ -244,7 +279,7 @@ and their names. It will also print local plugins aka
.. _`cmdunregister`: .. _`cmdunregister`:
Deactivating / unregistering a plugin by name Deactivating / unregistering a plugin by name
---------------------------------------------------------------------------- ---------------------------------------------
You can prevent plugins from loading or unregister them:: You can prevent plugins from loading or unregister them::
@ -257,7 +292,7 @@ how to obtain the name of a plugin.
.. _`builtin plugins`: .. _`builtin plugins`:
pytest default plugin reference pytest default plugin reference
==================================== ===============================
You can find the source code for the following plugins You can find the source code for the following plugins
@ -291,10 +326,10 @@ in the `pytest repository <http://bitbucket.org/hpk42/pytest/>`_.
.. _`well specified hooks`: .. _`well specified hooks`:
pytest hook reference pytest hook reference
==================================== =====================
Hook specification and validation Hook specification and validation
----------------------------------------- ---------------------------------
``pytest`` calls hook functions to implement initialization, running, ``pytest`` calls hook functions to implement initialization, running,
test execution and reporting. When ``pytest`` loads a plugin it validates test execution and reporting. When ``pytest`` loads a plugin it validates
@ -305,7 +340,7 @@ by simply not specifying them. If you mistype argument names or the
hook name itself you get an error showing the available arguments. hook name itself you get an error showing the available arguments.
Initialization, command line and configuration hooks Initialization, command line and configuration hooks
-------------------------------------------------------------------- ----------------------------------------------------
.. currentmodule:: _pytest.hookspec .. currentmodule:: _pytest.hookspec
@ -319,7 +354,7 @@ Initialization, command line and configuration hooks
.. autofunction:: pytest_unconfigure .. autofunction:: pytest_unconfigure
Generic "runtest" hooks Generic "runtest" hooks
------------------------------ -----------------------
All runtest related hooks receive a :py:class:`pytest.Item` object. All runtest related hooks receive a :py:class:`pytest.Item` object.
@ -339,7 +374,7 @@ The :py:mod:`_pytest.terminal` reported specifically uses
the reporting hook to print information about a test run. the reporting hook to print information about a test run.
Collection hooks Collection hooks
------------------------------ ----------------
``pytest`` calls the following hooks for collecting files and directories: ``pytest`` calls the following hooks for collecting files and directories:
@ -359,7 +394,7 @@ items, delete or otherwise amend the test items:
.. autofunction:: pytest_collection_modifyitems .. autofunction:: pytest_collection_modifyitems
Reporting hooks Reporting hooks
------------------------------ ---------------
Session related reporting hooks: Session related reporting hooks:
@ -375,7 +410,7 @@ test execution:
Debugging/Interaction hooks Debugging/Interaction hooks
-------------------------------------- ---------------------------
There are few hooks which can be used for special There are few hooks which can be used for special
reporting or interaction with exceptions: reporting or interaction with exceptions:
@ -468,7 +503,7 @@ that result, however.
Reference of objects involved in hooks Reference of objects involved in hooks
=========================================================== ======================================
.. autoclass:: _pytest.config.Config() .. autoclass:: _pytest.config.Config()
:members: :members: