.. _testing:
Testing your package
====================
While writing new functionality for your package, you should also make sure that
you write unit tests. We suggest using the `pytest `_
framework for writing and running tests.
Where to keep tests
-------------------
We recommend placing the tests inside sub-folders called ``tests`` alongside the
Python code they are meant to test - for example, the layout of the package might
look like::
my_package/__init__.py
my_package/utils.py
my_package/tests/__init__.py
my_package/tests/test_utils.py
The name of the test files should start with ``test_``. We recommend taking a look
at the `Getting Started `_
guide for pytest for how to write tests, as well as the `Astropy guide on writing
tests `_.
Running tests
-------------
Assuming you have installed pytest, the easiest way to run the tests is to run the
``pytest`` command::
pytest my_package
Note that if your package contains C extension, you will need to make sure the
extensions are compiled ahead of time - you can either do this with::
python setup.py build_ext --inplace
or with::
pip install -e .
Once you have done this, the pytest command should work. If your package defines
entry points, you will likely need to run the ``pip`` command if you are running
tests that rely on the entry points.
Defining default pytest options
-------------------------------
If you regularly need to run tests with the same command-line flags for your
package, or if you want to set options that are required for certain pytest
plugins, you can control these by adding a ``[tool.pytest.ini_options]`` section
to your ``pyproject.toml`` file; for example
.. code-block:: toml
[tool.pytest.ini_options]
addopts = "-v"
will ensure that tests are always run in verbose mode.
Running doctests
----------------
It is possible to use pytest to run doctests (blocks of code in docstrings or in
the .rst docs) as part of the test suite. If you want to do this, we recommend
using the `pytest-doctestplus `
plugin. You can define the following options in your ``pyproject.toml`` file to make
sure that this option is always enabled
.. code-block:: toml
[tool.pytest.ini_options]
doctest_plus = "enabled"
addopts = "--doctest-rst"
Declaring dependencies for tests
--------------------------------
To make it easier for contributors to get set up with the dependencies
required to run the tests, as well as to make it easier to
configure automated builds (with e.g. :ref:`tox `), you should
define an ``[project.optional-dependencies]`` section in
your ``pyproject.toml`` file named ``test`` which lists the dependencies
required to run the tests (not including dependencies already
mentioned in ``dependencies``)::
[project.optional-dependencies]
test = [
"pytest",
"pytest-doctestplus",
]
This will then allow contributors to type
.. code-block:: shell
pip install -e .[test]
to install the package in developer/editable mode along with the test
dependencies.