Testing the package#

In-development tests#

While developing a new feature or fixing a bug, it is handy to run a test script against the code you are working on. To ensure that the imported package biotite points to the code you are working on, you may want to install the local repository clone in editable mode:

$ pip install -e .

If you are writing or using an extension module in Cython, consider using pyximport at the beginning of the script you use for testing.

import numpy as np
import pyximport
pyximport.install(
    build_in_temp=False,
    setup_args={"include_dirs":np.get_include()},
    language_level=3
)

To enforce the recompilation of the changed Cython module, delete the respective compiled module (.dll or .so) from the src/ directory, if already existing.

Unit tests#

The backbone of testing Biotite are the unit tests in the tests directory. Pytest is used as the testing framework. To run the tests, install the local repository clone (in editable mode) and run the tests:

$ pip install -e ".[test]"
$ pytest

Benchmarks#

As outlined before, computation speed is one of the project’s main goals. Therefore CodSpeed benchmarks are used to ensure code changes do not decrease the performance. The benchmarks are simply pytest functions residing in the separate benchmarks/ directory, with the addition of the @pytest.mark.parametrize.benchmark decorator. These can also run with the pytest command, to ensure that they work. However, the actual benchmarking is done by the respective CI job.

If you introduce a change that might significantly affect the performance of a function, please add a benchmark function, which runs the affected code, first and create a draft pull request. This will benchmark the code without the change. Afterwards, add and push the actual code change. This way, one can compare the performance of the code before and after the change.

Doctests#

For simple tests checking that some code simply does not raise an exception and produces some predefined output, doctests are suitable. They are part of the docstrings of the corresponding functions and classes. The doctests fulfill two purposes: They are automatically executed by pytest via the tests/test_doctests.py module and give users reading the API reference easily understandable examples how a function/class works.

Testing visualizations#

Testing visualization functions (e.g. in biotite.sequence.graphics) is difficult, because the output can hardly be checked against some reference value. To still have at least some confirmation that these functions produce the expected output, it is mandatory to have at least one example using that function in the gallery.