Mojoπ₯ language test runner plugin for pytest. Try it for your mixed Python and Mojo codebases!
This package implements a pytest
plugin to discover and run Mojo tests, alongside your Python tests. Although pytest
does not have any awareness of Mojo source or package structure, pytest
is extensible. In summary, plugin.py
calls
mojo test
in a sub-process and parses the outputs and exit codes.
-
Create your Mojo tests according to the manual: https://docs.modular.com/mojo/tools/testing .
-
Install Mojo, Python,
pytest
and thispytest-mojo
plugin using the conda environment.yml file. This can alternatively be done with the magic package manager, but conda is easier for this use case.# use conda to install mojo, python, and the pytest-mojo plugin. $ conda env create -n foo-project -f environment.yml # verify environment $ conda activate foo-project $ mojo --version mojo 24.6.0 (4487cd6e) $ python --version Python 3.12.8 $ conda list pytest ... pytest 8.3.4 pyhd8ed1ab_1 conda-forge pytest-mojo 24.6 pypi_0 pypi pytest-xdist 3.6.1 pyhd8ed1ab_1 conda-forge
Summary: it is a requirement is to have Python and Mojo sharing the same runtime and packages and conda is the easiest way to accomplish that.
-
See the example project for one possible filesystem layout:
example_src/
has it's tests in theexample_tests/
folder.- Remember the Mojo manual explains that tests are allowed to be in the same folder as Mojo code, or different folder, or even as Mojo code in docstrings! So this example project is just one possibility.
-
Mojo tests and Python tests are all run via
pytest
! Use the plugin's--mojo-include
option to include your Mojo packages.# this example_src/ contains a Python package which is also called from Mojo, # so we must add it using PYTHONPATH. Please note that the full path may be required! $ export PYTHONPATH=/Users/you/project/example_src/ # Use the plugin's --mojo-include option to tell mojo where to find `my_package` $ pytest --mojo-include example_src/ example_tests/ ============================= test session starts ============================== platform darwin -- Python 3.12.8, pytest-8.3.4, pluggy-1.5.0 rootdir: /Users/guidorice/dev/mojo/mojo-pytest configfile: pyproject.toml plugins: mojo-24.6, anyio-4.7.0, xdist-3.6.1 collected 6 items example_tests/my_package/my_test.mojo . [ 16%] example_tests/my_package/test_fibonacci.mojo .. [ 50%] example_tests/my_package/test_fibonacci.py . [ 66%] example_tests/my_package/test_fire.π₯ . [ 83%] example_tests/my_package/test_random_tensor.mojo . [100%] ============================== 6 passed in 18.19s ==============================
ππ½ Notice how your Python tests are run alongside your Mojo tests.
-
Mojo binary packages are also supported with
--mojo-include
. For example, this could be used in a CI/CD script:$ mojo package example_src/my_package -o build/my_package.mojopkg # or .π¦ $ pytest --mojo-include build/ example_tests/ ... ... (same pytest output as above) ...
In the example_src/
directory is a Mojo package with a couple of modules. There is also a Python module, which we call
in two ways (from pytest
, and from Mojo). Here is an overview:
example_src
βββ main.mojo # main entry point. run with `mojo example_src/main.mojo`
βββ my_package
βββ __init__.mojo # this is both Mojo package, and a Python package.
βββ __init__.py
βββ fibonacci.mojo # Mojo implementation
βββ fibonacci.py # Python implementation
βββ random_tensor.mojo # random tensor stuff
example_tests
βββ my_package
βββ my_test.mojo # files can be named xxx_test as well as test_xxx.
βββ test_fibonacci.mojo # tests the Mojo impl and the Python impl.
βββ test_fibonacci.py # tests the Python impl (pure Python).
βββ test_fire.π₯ # tests are collected for fire extension too.
βββ test_random_tensor.mojo # tests the Mojo impl.
- If you experience slowness, see this
tip about using multiprocessing with
pytest
. - Writing tests in Mojo: https://docs.modular.com/mojo/tools/testing
- Non-Python tests in
pytest
: https://pytest.org/en/latest/example/nonpython.html#non-python-tests - C test runner: https://pytest-c-testrunner.readthedocs.io
pytest
docs: https://docs.pytest.org