Testing and benchmarking#
Running the Python test suite#
Install the following dependencies into the default Python installation:
pip install pytest-pyodide pytest-httpserver
pytest-pyodide is a pytest plugin for testing Pyodide
and third-party applications that use Pyodide.
See: pytest-pyodide for more information.
Install geckodriver or chromedriver and check that they are in your
To run the test suite, run
pytestfrom the root directory of Pyodide:
There are 3 test locations that are collected by pytest,
src/tests/: general Pyodide tests and tests running the CPython test suite
pyodide-build/pyodide_build/tests/: tests related to Pyodide build system (do not require selenium or playwright to run)
packages/*/test_*: package specific tests.
You can run the tests from a specific file with:
Some browsers sometimes produce informative errors than others
so if you are getting confusing errors it is worth rerunning the test on each
browser. You can use
--runtime commandline option to specify the browser runtime.
pytest --runtime firefox pytest --runtime chrome pytest --runtime node
Custom test marks#
We support custom test marks:
by default the tests will fail. If a test is known to leak objects, it is
possible to disable these checks with these markers.
cd src/js npm test
To check TypeScript type definitions run,
Manual interactive testing#
To run tests manually:
Build Pyodide, perhaps in the docker image
From outside of the docker image,
distdirectory and run
python -m http.server.
Once the webserver is running, simple interactive testing can be run by visiting the URL:
http://localhost:<PORT>/console.html. It’s recommended to use
pyodide.runPythonin the browser console rather than using the repl.
To run common benchmarks to understand Pyodide’s performance, begin by installing the same prerequisites as for testing. Then run:
PYODIDE_PACKAGES="numpy,matplotlib" make benchmark
We lint with
Python is linted with
C is linted with
To lint the code, run:
pre-commit run -a
You can have the linter automatically run whenever you commit by running
pip install pre-commit pre-commit install
and this can later be disabled with
If you don’t lint your code, certain lint errors will be fixed automatically by
pre-commit.ci which will push fixes to your branch. If you want to push more
commits, you will either have to pull in the remote changes or force push.