Merged contributing-community into default
This commit is contained in:
commit
e9d4853296
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue