Написание тестов¶
Тесты в 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