Перейти к содержимому

Сценарии

--expect-text отвечает на один вопрос: появлялась ли когда-нибудь эта строка? Сценарий отвечает на всё остальное. Это файл YAML со списком шагов, которые runner выполняет по порядку, на симулированных часах основной платы.

Имена полей взяты у Wokwi, поэтому существующий сценарий Wokwi выполняется без изменений.

scenario.yaml
name: uno-ready boots and blinks
version: 1
steps:
- wait-serial: READY
- delay: 600ms
- expect-pin:
part-id: uno
pin: 13
expected: 1
Окно терминала
velxio-cli run --scenario scenario.yaml .

Запуск проходит, когда проходит последний шаг, и завершается неудачей на первом шаге, который не прошёл. Каждый шаг сообщается по мере выполнения:

ok wait-serial "READY" at 0.004 s
ok delay 600 ms at 0.604 s
ok expect-pin uno:13 expected 1 at 0.604 s
PASS in 0.60 s simulated (2.9 s wall) · billed 1 s · exit 0
шаг поля что делает
delay 500ms, 2s, 100us; голое число — это миллисекунды ждёт, пока симулированные часы достигнут t0 + n
wait-serial строка, не более 512 байт поиск подстроки, побайтово точный, по serial, принятому с момента предыдущего wait-serial. Если бюджет исчерпается раньше, запуск завершается со статусом timeout
write-serial строка UTF-8 или список байтов 0..255 пишет в UART основной платы
expect-pin part-id, pin, expected (0/1, high/low, true/false; также принимается value) читает пин один раз, немедленно. Несовпадение проваливает запуск и сообщает уровень, который фактически был прочитан
set-control part-id, control, value (число, строка или булево) pressed на кнопке нажимает или отпускает её; остальные элементы управления — это сенсорные элементы управления и атрибуты детали. Неизвестный элемент управления проваливает запуск и перечисляет те, что есть у этой детали
take-screenshot part-id, save-to и/или compare-with, tolerance делает снимок PNG этой детали в этот момент запуска

Любой шаг может нести name: рядом со своим ключом, исключительно для журнала.

Ограничения: 200 шагов и 20 снимков экрана на запуск.

delay: 600ms — это 600 миллисекунд часов гостя, а не настенных часов. Один и тот же сценарий занимает одно и то же симулированное время на загруженном runner и на простаивающем, и именно это делает результат воспроизводимым — и именно за это вы платите.

steps:
- wait-serial: READY
- set-control:
part-id: btn1
control: pressed
value: 1
- delay: 50ms
- set-control:
part-id: btn1
control: pressed
value: 0
- wait-serial: "pressed"

part-id — это id из вашего diagram.json (или .vlx), никогда не внутренний. Шаг, называющий несуществующую деталь, отклоняется до начала запуска, с scenario_part_missing и кодом выхода 2 — ничего не тарифицируется.

Байты идут в обратную сторону с write-serial и возвращаются побайтово точно, включая значения выше 0x7f:

steps:
- wait-serial: ECHO READY
- write-serial: "hi\n"
- wait-serial: "hi"
- take-screenshot:
part-id: oled1
save-to: shots/oled.png

PNG этой детали захватывается в этот момент запуска и записывается в save-to, с разрешением относительно каталога проекта. Запуск, единственное ожидание которого — снимок экрана, проходит, как только сделан последний снимок.

Вы можете выразить простые случаи без файла, и они сочетаются с ним:

флаг эквивалент
--expect-text X финальный wait-serial X
--screenshot-part P --screenshot-time T delay T, затем take-screenshot P
--fail-text Y не шаг: Y отслеживается на каждом фрагменте serial каждой платы в течение всего запуска и завершает его со статусом failed в тот момент, когда появляется

--interactive перенаправляет ваш stdin в последовательный порт основной платы, объединяя каждые 20 мс. Он работает вместе со сценарием: оба пишут в один и тот же UART, в порядке поступления. Закрытие stdin завершает ввод, а не запуск — это делают бюджет или сценарий.

  • Шаги касаний (touch-press, touch-move, touch-release). CLI отклоняет их на этапе проверки, а не пропускает.
  • Сравнение снимков экрана, как указано выше.
  • Пользовательские чипы в запуске CI: [[chip]] в конфигурации отклоняется с feature_unsupported.

См. Коды выхода, чтобы узнать, что каждый сбой возвращает вашей задаче, и velxio.toml, чтобы узнать, как сценарий привязывается к проекту по умолчанию.