name: python-test-runner
description: >-
Guidelines and instructions for building prerequisite example applications
and running python-based integration and certification tests located in
src/python_testing/. Use this skill to run important regression tests
during developement or, when building new example apps, or when there is a
need to execute python test scripts or "certification test scripts" or
mentions of run_python_test.py and local.py.
Python Test Runner
This skill provides expert guidelines for running Python-based integration and
certification tests located in src/python_testing/.
Prerequisite 1: Activating the Python Environment
Before running any Python tests, you must compile (if one doesn't exist in out/) and activate the project's Python virtual environment.
[!IMPORTANT] Different runner methods may expect different virtual environments. The modern local runner script (
local.py) hardcodesout/venvas its Python environment. Ensure you compile and activate this specific folder:
./scripts/build_python.sh -i out/venv --enable_ipv4 true
source out/venv/bin/activate
Be sure to check the arguments in the build_python.sh script before setting up
the virtual environment. Run the shell script with the --help argument to see
all available options that may be relevant for the tests.
Prerequisite 2: Building the Example Application
Matter Python tests execute against a compiled device simulator application. Before you can run any test locally, you must identify, map, and compile the required application from source.
[!NOTE] For many modern Python tests, the use of the
all-devices-appis preferred, which allows simulating specific device type(s) on endpoints. However, many existing tests continue to usechip-all-clusters-app, and some domain-specific tests may require other specialized apps (e.g.,chip-energy-management-app).
1. Identify the Required Application
Open the Python test file (e.g., src/python_testing/TC_FAN_3_3.py) and locate
the === BEGIN CI TEST ARGUMENTS === block near the top of the file. Under
the app parameter, you will see the application defined as an environment
variable, such as:
app: ${ALL_CLUSTERS_APP}app: ${ALL_DEVICES_APP}
These environment variables map to specific compiled applications. Locally, you
will need to know where these apps are built (usually in the out/ directory)
to reference them correctly.
2. Map Environment Variable to a Build Target
To compile the required application, match the environment variable from the
test header to a buildable target defined in scripts/build/build/targets.py.
Typical mappings:
${ALL_CLUSTERS_APP}-> Target:linux-x64-all-clusters-clang(buildschip-all-clusters-app)${ALL_DEVICES_APP}-> Target:linux-x64-all-devices-clang(buildsall-devices-app)
To see the full list of compile targets available in the project:
scripts/run_in_build_env.sh "./scripts/build/build_examples.py targets"
3. Build the Target
Activate the environment and use the build_examples.py tool to compile the
application.
source scripts/activate.sh
./scripts/build/build_examples.py --target {build_target} build
Example:
source scripts/activate.sh
./scripts/build/build_examples.py --target linux-x64-all-devices-clang build
Once compiled, the application binary will be located in its corresponding
target folder under out/ (e.g.
out/linux-x64-all-devices-clang/all-devices-app). Keep track of this local
path, as you will pass it explicitly to the execution commands.
Determining Test Arguments
The header comments at the top of each python test file define the parameters used for both the example app and the script.
[!TIP] When running locally and manually passing arguments, ignore or remove environment-variable-based arguments (like
${TRACE_APP}or${TRACE_TEST_JSON}) from your command line. These are intended for CI pipelines.
Excluding Arguments During Local Testing
When running tests manually on a local workstation, you can (and sometimes should) omit certain CI-mandated arguments depending on your specific testing goal:
- Omitting
--factory-resetand--commissioning-method: If you are running multiple test scripts sequentially against the same active device session or commissioning window, you should omit these flags. Factory resetting or re-commissioning is unnecessary if the device is already configured and commissioned on the controller. - Reusing KVS Storage: If you wish to verify state persistence across
application restarts (e.g. simulating a power cycle), make sure you do not
pass
--factory-resetor delete your--KVSdatabase files.
Identifying Test Header Parameters
The header comments at the top of each python test file define the parameters used for both the example app and the script. You can understand what each parameter does using this description:
app: Indicates the application to be used in the test.- Example:
app: ${ALL_DEVICES_APP}
- Example:
factory-reset: Determines whether a factory reset should be performed before the test (i.e., wiping persistent KVS files).- Example:
factory-reset: true
- Example:
quiet: Sets the verbosity level of the test run. When set totrue, the test runner generates less output.- Example:
quiet: true
- Example:
app-args: Specifies the arguments to be passed to the application during the test.- Example:
--discriminator 1234 --KVS kvs1 --discriminator: Specifies the discriminator value used by the application during commissioning to uniquely identify the device during the discovery phase. This will change the pairing code for the device--KVS: Specifies the path to the Key-Value Store (KVS) file. The KVS is a persistent database used by the application to store state (such as commissioned fabrics, node IDs, etc.) so that they survive application restarts. Specifying a unique KVS path prevents state interference between concurrent test runs.
- Example:
app-ready-pattern: Regular expression pattern to match against the application's stdout to determine when the application has completed initialization. The test runner blocks script execution until this pattern is found.- Example:
"Manual pairing code: \\[\\d+\\]"
- Example:
app-stdin-pipe: Path to a named pipe that the test runner can use to pipe standard input command strings into the application process.- Example:
dut-input
- Example:
script-args: Specifies the CLI arguments to be passed to the test script itself.- Example:
--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021
- Example:
Python Script Command Line Arguments
When running the test script directly (using Python) or passing arguments inside
--script-args, you can customize the execution. Use --help on any script to
get a full list of arguments. Key parameters include:
--storage-path: Configures the file path where local state and credentials are persisted (e.g.,--storage-path admin_storage.json). Providing this argument avoids state conflicts between concurrent runs. Defaults toadmin_storage.jsonin the current working directory.--commissioning-method: Specifies the method to use for commissioning (e.g.on-network). Becausechip-tooland the python controller do not share credentials, the python script must commission the simulator target.- Pairing Codes:
--discriminator(e.g.1234)--passcode(e.g.20202021)--qr-code--manual-code
--tests: Filters which test case(s) within the script to execute.--PICS: Path to the PICS XML file or directory defining supported features.- Custom Script Arguments (PIXITs): Used for passing custom config values
to the script. Must be supplied in
key:valueformat:--bool-arg(e.g.--bool-arg pixit_name:False)--int-arg--float-arg--string-arg--json-arg--hex-arg
Running Tests: Method 1 (CI Meta Runner - Recommended)
The project provides a high-level local test harness script,
./scripts/tests/local.py. This is the preferred and most automated method
for running python tests locally because it pulls test metadata and CI arguments
directly from the headers of the Python test scripts.
Setup Requirements
This script hardcodes the virtual environment location to out/venv. You must
compile and activate this specific virtual environment path before running the
command:
./scripts/build_python.sh -i out/venv --enable_ipv4 true
source out/venv/bin/activate
Executing Tests
Use the python-tests subcommand and specify a filter using --test-filter to
target specific test suites:
./scripts/tests/local.py python-tests --test-filter {test_name}
Mapping Apps using --override-binary-path
Because the script reads the CI blocks directly, it parses variables like
app: ${ALL_CLUSTERS_APP}. By default, it attempts to look for built binaries
in default output folders. If your compiled binaries are located in a
non-standard build path, you must map the CI variable to your local compiled
file using --override-binary-path:
./scripts/tests/local.py python-tests \
--test-filter {test_name} \
--override-binary-path {CI_APP_VARIABLE} {path_to_local_built_binary}
Execution Example:
./scripts/tests/local.py python-tests \
--test-filter TC_RR_1_1 \
--override-binary-path ALL_CLUSTERS_APP out/linux-x64-all-clusters-no-ble/chip-all-clusters-app
Notable Arguments for local.py python-tests
--test-filter: Runs only the test scripts that match this glob pattern (e.g.,TC_RR_1_1orTC_FAN_*).--override-binary-path: Maps a CI environment variable (e.g.,ALL_CLUSTERS_APP,ALL_DEVICES_APP) to a specific path where the application is built. Can be passed multiple times.--fail-log-dir: Specifies a directory to write logs when a test fails (creates{test_name}.out.logand{test_name}.err.loginside the directory). If not specified, failed test logs are printed directly to stdout/stderr.--skip: Excludes specific test names or patterns from running.--include-nightly: Includes slow nightly tests that are skipped by default.--keep-going: Instructs the runner to continue executing subsequent tests even if a previous test in the queue fails.--help: View the help dialog for more information.
Running Tests: Method 2 (Combined Runner)
This uses the run_python_test.py script directly to manage starting the app,
running the test, and collecting logs. Unlike local.py, you must explicitly
provide all arguments since it does not read metadata blocks from the files.
Combined Runner Template
With the Python environment active:
./scripts/tests/run_python_test.py \
--factory-reset \
--app {path_to_compiled_app_binary} \
--app-args "{app_arguments}" \
--script {path_to_python_script} \
--script-args "{script_arguments}"
Combined Examples
Example A: Contact Sensor (All-Devices) Test
./scripts/tests/run_python_test.py \
--factory-reset \
--app ./out/linux-x64-all-devices-clang/all-devices-app \
--app-args "--device contact-sensor:1 --discriminator 1234 --KVS kvs1" \
--script src/python_testing/TC_IDM_2_3.py \
--script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --PICS src/app/tests/suites/certification/ci-pics-values"
Note that the --endpoint script argument is relevant for most apps and tests.
Some tests may exclude an endpoint argument and use the default one (which often
is EP 0), but it is best to explicitly specify which endpoint should be used.
Example B: All Clusters App Test
./scripts/tests/run_python_test.py \
--factory-reset \
--app ./out/linux-x64-all-clusters-clang/chip-all-clusters-app \
--app-args "--discriminator 1234 --KVS kvs1" \
--script src/python_testing/TC_GC_2_2.py \
--script-args "--storage-path admin_storage.json --commissioning-method on-network --discriminator 1234 --passcode 20202021 --endpoint 1"
Running Tests: Method 3 (Two Terminals)
This method is useful for interactive debugging, allowing you to monitor the application's stdout logs side-by-side with the test script runner.
Step A: Start the Example Application
In one terminal, run your locally built application binary:
./out/linux-x64-all-devices-clang/all-devices-app \
--device contact-sensor:1 \
--discriminator 1234 \
--KVS kvs1
Note that the all devices app should always specify a device type and endpoint,
in the format device-type:endpoint-number
Step B: Run the Python Test Script
In a second terminal, run the python script after activating the Python virtual environment:
source out/venv/bin/activate
python3 src/python_testing/TC_IDM_2_3.py \
--storage-path admin_storage.json \
--commissioning-method on-network \
--discriminator 1234 \
--passcode 20202021 \
--PICS src/app/tests/suites/certification/ci-pics-values