Pytest shell application testing

Overview

The sample project illustrates usage of pytest framework integrated with Twister test runner.

A simple application provides basic Zephyr shell interface. Twister builds it and then calls pytest in subprocess which runs tests from pytest/test_shell.py file. The first test verifies valid response for help command, second one verifies if application is able to return information about used kernel version. Both tests use shell fixture, which is defined in pytest-twister-harness plugin. More information about plugin can be found here.

Requirements

Board (hardware, native_sim or QEMU) with UART console.

Building and Running

Build and run sample by Twister:

$ ./scripts/twister -vv --platform native_sim -T samples/subsys/testsuite/pytest/shell

Sample Output

...
samples/subsys/testsuite/pytest/shell/pytest/test_shell.py::test_shell_print_help
INFO: send "help" command
DEBUG: #: uart:~$ help
DEBUG: #: Please press the <Tab> button to see all available commands.
DEBUG: #: You can also use the <Tab> button to prompt or auto-complete all commands or its subcommands.
DEBUG: #: You can try to call commands with <-h> or <--help> parameter for more information.
DEBUG: #: Shell supports following meta-keys:
DEBUG: #: Ctrl + (a key from: abcdefklnpuw)
DEBUG: #: Alt  + (a key from: bf)
DEBUG: #: Please refer to shell documentation for more details.
DEBUG: #: Available commands:
DEBUG: #: clear    :Clear screen.
DEBUG: #: device   :Device commands
DEBUG: #: devmem   :Read/write physical memory
DEBUG: #:             Usage:
DEBUG: #:             Read memory at address with optional width:
DEBUG: #:             devmem address [width]
DEBUG: #:             Write memory at address with mandatory width and value:
DEBUG: #:             devmem address <width> <value>
DEBUG: #: help     :Prints the help message.
DEBUG: #: history  :Command history.
DEBUG: #: kernel   :Kernel commands
DEBUG: #: rem      :Ignore lines beginning with 'rem '
DEBUG: #: resize   :Console gets terminal screen size or assumes default in case the
DEBUG: #:             readout fails. It must be executed after each terminal width change
DEBUG: #:             to ensure correct text display.
DEBUG: #: retval   :Print return value of most recent command
DEBUG: #: shell    :Useful, not Unix-like shell commands.
DEBUG: #: uart:~$
INFO: response is valid
PASSED
samples/subsys/testsuite/pytest/shell/pytest/test_shell.py::test_shell_print_version
INFO: send "kernel version" command
DEBUG: #: uart:~$ kernel version
DEBUG: #: Zephyr version 3.5.99
DEBUG: #: uart:~$
INFO: response is valid
PASSED
...