Testing your code
As stated in the Style guidelines section all code is checked to verify the following:
- All the unit tests pass
- All code passes the checks from the linting tools
Local testing is done using pytest and using pre-commit for running out linters, which has been installed as part of running script/setup
in the virtual environment.
Python test requirements need to be installed before tests can be run. This can be achieved by using the VScode devcontainer and the corresponding task. Check the devcontainer documentation for guidance about running tasks.
To run our linters, on the full code base, run the following command:
pre-commit run --all-files
To start the tests, and run the full test suite, activate the virtual environment and run the command:
pytest tests
It might be required that you install additional packages depending on your distribution/operating system:
- Fedora:
sudo dnf -y install systemd-devel gcc-c++
- Ubuntu:
sudo apt-get install libudev-dev
Run pytest
& pre-commit
before you create your pull request to avoid annoying fixes.
pre-commit
will be invoked automatically by git when commiting changes.
Running the full pytest
test suite will take quite some time, so as the minimal requirement for pull requests, run at least the tests that are related to your code changes (see details below on how to). The full test suite will anyway be run by the CI once you created your pull request and before it can be merged.
Running pytest
will run unit tests against the locally available Python version. We run our tests in our CI against all our supported Python versions.
Adding new dependencies to test environment
If you are working on tests for an integration and you changed the dependencies, then run the script/gen_requirements_all.py
script to update all requirement files.
Next you can update all dependencies in your development environment by running:
uv pip install -r requirements_test_all.txt
Running a limited test suite
You can pass arguments to pytest
to be able to run single test suites or test files.
Here are some helpful commands:
# Stop after the first test fails
$ pytest tests/test_core.py -x
# Run test with specified name
$ pytest tests/test_core.py -k test_split_entity_id
# Fail a test after it runs for 2 seconds
$ pytest tests/test_core.py --timeout 2
# Show the 10 slowest tests
$ pytest tests/test_core.py --duration=10
If you want to test just your integration, and include a test coverage report, the following command is recommended:
pytest ./tests/components/<your_component>/ --cov=homeassistant.components.<your_component> --cov-report term-missing -vv