Написание тестов

Тесты в MicroPython находятся по пути tests/. Ниже приведён список ключевых каталогов и скрипта запуска run-tests.py:

.
 ├── basics
 ├── extmod
 ├── float
 ├── micropython
 ├── run-tests.py
 ...

Поддерживаются подпапки для категоризации тестов. Добавьте тест, создав новый файл в одной из существующих папок или в новой папке. Также можно создавать пользовательские тесты вне этой папки tests, что рекомендуется для пользовательского порта.

Например, добавьте следующий код в файл print.py в подкаталоге tests/unix/:

def print_one():
    print(1)

print_one()

Если вы запустите свои тесты, этот тест должен появиться в выводе тестов:

$ cd ports/unix
$ make tests
skip  unix/extra_coverage.py
pass  unix/ffi_callback.py
pass  unix/ffi_float.py
pass  unix/ffi_float2.py
pass  unix/print.py
pass  unix/time.py
pass  unix/time2.py

Тесты запускаются путём сравнения вывода целевой среды теста с выводом CPython. Поэтому любой тест должен использовать операторы print для отображения результатов теста.

Для тестов, которые невозможно сравнить с CPython (т. е. функциональность, специфичная для micropython), вы можете предоставить файл .py.exp, который будет использоваться в качестве эталона для сравнения.

Другой способ запуска тестов, полезный при запуске на целевых устройствах, отличных от порта Unix, таков:

$ cd tests
$ ./run-tests.py

Затем для запуска на плате:

$ ./run-tests.py -t /dev/ttyACM0

А чтобы запустить только определённый набор тестов (например, каталог):

$ ./run-tests.py -d basics
$ ./run-tests.py float/builtin*.py

Использование run-tests.py

Скрипт run-tests.py поддерживает несколько параметров для настройки выполнения тестов:

Выбор целевого устройства и устройства:

  • -t, --test-instance

Опция -t принимает следующие значения для экземпляра теста:

  • unix — использовать порт MicroPython для unix, задаваемый переменной окружения MICROPY_MICROPYTHON (которая по умолчанию указывает на стандартный вариант порта unix или windows, в зависимости от хост-платформы)

  • webassembly — использовать порт MicroPython для webassembly, задаваемый переменной окружения MICROPY_MICROPYTHON_MJS (которая по умолчанию указывает на стандартный вариант порта webassembly)

  • port:<device> — подключиться к указанному устройству последовательного порта и использовать его

  • a<n> — подключиться к /dev/ttyACM<n> и использовать его

  • u<n> — подключиться к /dev/ttyUSB<n> и использовать его

  • c<n> — подключиться к COM<n> и использовать его

  • exec:<command> — выполнить команду и подключиться к её stdin/stdout

  • execpty:<command> — выполнить команду и подключиться к выводимому устройству /dev/pts/<n>

  • <a>.<b>.<c>.<d> — подключиться к указанному адресу IPv4

  • всё остальное указывает на последовательный порт

Выбор тестов:

  • -d, --test-dirs — указать один или несколько каталогов с тестами для запуска

  • -i, --include REGEX — включить тесты, соответствующие шаблону регулярного выражения

  • -e, --exclude REGEX — исключить тесты, соответствующие шаблону регулярного выражения

  • files — конкретные файлы тестов для запуска

Опции выполнения:

  • --emit <EMITTER> — эмиттер MicroPython, EMITTER может быть bytecode или native. По умолчанию: bytecode

  • --via-mpy — сначала скомпилировать файлы .py в .mpy

  • --heapsize — задать размер кучи для тестов

  • -j, --jobs N — количество одновременно выполняемых тестов

Установите переменную окружения MICROPY_MPYCROSS, чтобы использовать конкретную версию mpy-cross при использовании --via-mpy.

Управление результатами:

  • -r, --result-dir — каталог для результатов тестов. По умолчанию: results/

  • --print-failures — показать diff проваленных тестов и выйти

  • --clean-failures — удалить файлы .exp и .out от предыдущих проваленных тестов

  • --run-failures — повторно запустить только ранее проваленные тесты

Примеры:

# Run only basic tests with native emitter
$ ./run-tests.py --emit native -d basics extmod

# Run tests excluding async functionality
$ ./run-tests.py -e async

# Run tests matching *_pep_*
$ ./run-tests.py -i *_pep_*

# Run specific test files in parallel
$ ./run-tests.py -j 4 basics/list*.py

# Test on a connected OpenMV Cam
$ ./run-tests.py -t /dev/ttyACM0
# or
$ ./run-tests.py -t a0

# Re-run only failed tests from previous run
$ ./run-tests.py --run-failures