Написання тестів

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

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

Існують підкаталоги для категоризації тестів. Щоб додати тест, створіть новий файл в одному з наявних каталогів або в новому каталозі. Також можна розміщувати власні тести поза цим каталогом тестів, що рекомендується для власного порту.

Наприклад, додайте наступний код у файл 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 - використовує Unix-порт MicroPython, визначений змінною середовища MICROPY_MICROPYTHON (яка за замовчуванням вказує на стандартний варіант Unix- або Windows-порту залежно від платформи хоста)

  • webassembly - використовує WebAssembly-порт MicroPython, визначений змінною середовища 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 - включити тести, що відповідають шаблону regex

  • -e, --exclude REGEX - виключити тести, що відповідають шаблону 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 - показати різницю невдалих тестів і вийти

  • --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