Announcing mojo-pytest
mojo-pytest
is a Mojo🔥 language test runner plugin for pytest
.
Try it for your mixed Python and Mojo codebases. Here are some tips and example command line usage...
What is Mojo​
Mojo is a new programming language that bridges the gap between research and production by combining Python syntax and ecosystem with systems programming and metaprogramming features. Mojo is still young, but it is designed to become a superset of Python over time. source: Mojo docs
What is pytest​
The
pytest
framework makes it easy to write small, readable tests, and can scale to support complex functional testing for applications and libraries. source: pytest docs
pytest, meet Mojo​
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.
Example test using Mojo standard library​
This simple Mojo module shows testing native Mojo code, and also calling into a Python module for testing vs reference implementation.
# file: example_tests/my_package/test_fibonacci.mojo
from python import Python
from testing import assert_equal
from my_package.fibonacci import fibonacci
def test_fibonacci():
"""
Test fibonacci 10th number.
"""
expect = 55
got = fibonacci(10)
assert_equal(got, expect)
def test_fibonacci_reference():
"""
Test mojo fibonacci versus python "reference" implementation.
"""
py = Python.import_module("my_package.fibonacci")
for n in range(0, 10):
expect = py.fibonacci(n)
got = fibonacci(n)
assert_equal(got, expect)
pytest
runs both the Python tests, and the Mojo tests. Example command line usage:
$ pytest --mojo-include example_src/ example_tests/
================================ test session starts =======================
platform darwin -- Python 3.12.6, pytest-8.3.3, pluggy-1.5.0
rootdir: /Users/guidorice/mojo/mojo-pytest
configfile: pyproject.toml
plugins: mojo-24.5
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 13.55s =======================
Check it out at the GitHub repo: https://github.com/guidorice/mojo-pytest.
For compatibility, mojo-pytest
follows the version numbering of mojo
, ex: v24.5.
Contributor​
Thanks to Leandro Leites Barrios @lleiets for contributions and suggesting
the idea of using the pytest
plugin API, instead of just a config script.
Further reading​
mojo-pytest
GitHub repo: https://github.com/guidorice/mojo-pytest- Mojo GitHub https://github.com/modularml/mojo
- Mojo and MAX engine docs
- 2024-10-17 remove
var
from code snippets: it's optional in latest Mojo release.