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