Running tests#

Running a suite#

$ python3 -mpytest --kernel=/path/to/bzImage

$ export FUNCTIONAL_TESTING_KERNEL=/path/to/bzImage
$ python3 -mpytest

To build a kernel image when needed, use --kernel-build:

$ python3 -mpytest --kernel-build

To use BlueZ binaries from a given build:

$ python3 -mpytest --bluez-build-dir=/path/to/bluez/build

Live logging#

$ python3 -mpytest --log-cli-level=0

Specific loggers can be selected or excluded with --log-filter:

$ python3 -mpytest --log-cli-level=0 --log-filter=rpc,host
$ python3 -mpytest --log-cli-level=0 --log-filter=*.bluetoothctl
$ python3 -mpytest --log-cli-level=0 --log-filter=-host
$ python3 -mpytest --log-cli-level=0 --log-filter=host,-host.*.1

Slow RPC calls#

$ python3 -mpytest --bluezenv-progress=on

A slow host RPC call is shown on the line below the test:

test_bluetoothd.py::test_read_feature                WAITING
host.0.0: bluetoothd.call("request", timeout=150) [55s, 95s left]

--vm-timeout sets the default timeout for VM-host RPC calls:

$ python3 -mpytest --vm-timeout=60

Selecting tests#

$ python3 -mpytest test/functional/test_cli_simple.py::test_bluetoothctl_script_show
$ python3 -mpytest -k test_bluetoothctl_script_show
$ python3 -mpytest -k 'test_btmgmt or test_bluetoothctl'

Markers can exclude tests:

$ python3 -mpytest -m "not pipewire"
$ python3 -mpytest -m "not xfail"

Without the second expression, known failing tests run with their failures suppressed. The following command reruns failed tests and stops on failure:

$ python3 -mpytest -x --ff

--runxfail reports failures from known-failing tests:

$ python3 -mpytest --runxfail -k test_btmgmt_info

USB controllers#

$ python3 -mpytest --usb=hci0,hci1

$ export FUNCTIONAL_TESTING_CONTROLLERS=hci0,hci1
$ python3 -mpytest -vv

USB pass-through does not require root. The process needs permission to open each device. With -vv, pytest-bluezenv reports missing permissions. --force-usb selects USB controllers for tests that would otherwise use btvirt:

$ python3 -mpytest --usb=hci0,hci1 --force-usb

PCIe controllers#

$ sudo python3 -mpytest --pcie=hci0,hci1

A PCIe controller is bound to vfio-pci while a VM host uses it and returned to its original driver afterwards. This requires root, an enabled IOMMU, and an IOMMU group containing no other device. --force-pcie selects PCIe controllers for tests that would otherwise use btvirt:

$ sudo python3 -mpytest --pcie=hci0,hci1 --force-pcie

Parallel execution#

pytest-xdist provides parallel execution:

$ python3 -mpytest -n auto

--dist loadgroup keeps tests that reuse a VM host on the same worker:

$ python3 -mpytest -n auto --dist loadgroup

With -n auto, the worker count is limited by the memory available and the selected tests’ VM configurations. Pytest-bluezenv collects the tests once before starting workers to estimate their maximum VM memory. The workers collect the tests again as usual. An explicit worker count, such as -n 4, is not adjusted.

VM-host console#

During a running test, the following command connects to a VM-host serial console:

$ python3 -mpytest_bluezenv attach

The test normally needs to be paused, for example with --trace. The upper tester logs an equivalent command when it starts a VM host:

TTY: socat /tmp/pytest-bluezenv-q658swgi/pytest-bluezenv-tty-0 STDIO,rawer

The command contains the serial socket path.