Ручные тест-кейсы — приложение ученика (student-app)
Полный набор ручных тест-кейсов для тестировщика, у которого на руках настоящее железо: робот (модуль STM32 + Android-телефон с приложением-мостом), ноутбук ученика (macOS или Windows) и, для части кейсов, ноутбук учителя. Дополняет ../TESTER-GUIDE.md (там — понятийный ввод и первый проход по первому запуску) и ../student-app/MANUAL-TEST-01-first-launch.md (тот файл — журнал конкретных прогонов ветки первого запуска; здесь — исчерпывающий чек-лист по всему приложению).
Стенд тестера
Обязательно:
- ноутбук ученика (macOS или Windows), установщик или dev-сборка
student-app; - Android-телефон с установленным приложением робота (android-bridge), Bluetooth и USB OTG;
- модуль робота (контроллер STM32) с USB-кабелем к телефону;
- заряженный аккумулятор робота (для разделов 5–7, 13);
- рулетка или размеченный пол — часть кейсов проверяет робот в движении.
Для разделов 9–10 (учитель) — второй ноутбук или второе приложение teacher-app на этом же компьютере, плюс общая Wi-Fi-сеть или мобильная точка доступа (D-086: роутер, либо телефон-хотспот, либо явное «сети нет»).
Опционально: секундомер (замер времени останова/переподключения), второй Android-телефон (для кейса «второй ученик подключается к тому же роботу»), доступ к параметрам Windows/macOS для сброса пар Bluetooth.
Виртуальный робот (Виртуальный робот в приложении) не требует железа вовсе — большинство кейсов разделов 2–3 и часть раздела 6 можно пройти без физического робота, но реальное железо остаётся приоритетом там, где помечено (реальный робот).
Сводная таблица разделов
| № | Раздел | Кейсов |
|---|---|---|
| 1 | Первый запуск и онбординг | 14 |
| 2 | Редактор Blockly | 9 |
| 3 | Редактор Python | 9 |
| 4 | Подключение к роботу по Bluetooth (включая Connect Guide) | 15 |
| 5 | Запуск и остановка программы на реальном роботе | 13 |
| 6 | Телеметрия и вывод print | 8 |
| 7 | Ошибки Python при выполнении | 8 |
| 8 | Уроки и прогресс | 8 |
| 9 | Связь с приложением учителя по LAN | 15 |
| 10 | Задания, сдача работ и перенос проектов | 7 |
| 11 | Обновления приложения | 7 |
| 12 | Офлайн-режим | 5 |
| 13 | Отказоустойчивость: реальное железо | 11 |
| 14 | Кроссплатформенность macOS / Windows | 7 |
| Итого | 132 |
1. Первый запуск и онбординг
Сжатая выжимка веток A–F из MANUAL-TEST-01-first-launch.md — для полного прохода используй тот файл. Здесь — минимум, без которого остальные разделы не имеют смысла.
ST-001. Первый вопрос — «где работает этот компьютер»
Приоритет: P1 Предусловия: чистая база (см. «Сброс к первому запуску» в TESTER-GUIDE.md) Шаги:
- Запустить приложение.
Ожидаемый результат: экран «Где работает этот компьютер?» с двумя карточками — «В классе» и «Самостоятельно». Вопрос не задаётся повторно после перезапуска.
ST-002. Самостоятельный режим — создание карточки ученика
Приоритет: P1 Предусловия: режим «Самостоятельно» выбран Шаги:
- Открыть «Локальная группа» → «Добавить ученика».
- Заполнить имя, фамилию, PIN из 4 цифр → «Сохранить».
Ожидаемый результат: карточка создана и появляется в списке группы.
ST-003. PIN короче 4 цифр отклоняется
Приоритет: P1 Шаги:
- «Добавить ученика», имя+фамилия, PIN из 2 цифр → «Сохранить».
Ожидаемый результат: «PIN — это ровно четыре цифры. Допиши его или оставь поле пустым.» Карточка не создаётся (регрессия на Д-6 — раньше короткий PIN молча отбрасывался).
ST-004. Пустое имя отклоняется
Приоритет: P2 Шаги:
- «Добавить ученика», оставить имя и фамилию пустыми → «Сохранить».
Ожидаемый результат: «Напиши имя и фамилию — без них карточку не создать.»
ST-005. Карточка без PIN — вход без запроса пароля
Приоритет: P2 Шаги:
- Создать карточку с пустым PIN.
- Выбрать её из списка.
Ожидаемый результат: сразу экран выбора робота, PIN не запрашивается — это штатное поведение, не баг.
ST-006. Неверный PIN — визуальная обратная связь и выход
Приоритет: P1 Предусловия: карточка с PIN Шаги:
- Выбрать карточку, ввести неверный PIN.
- Нажать «Это не я — выбрать другую карточку».
Ожидаемый результат: точки поля ввода краснеют, «Неверный PIN-код, попробуй ещё раз»; после шага 2 — возврат к выбору карточек (не тупик).
ST-007. Замедление после серии неверных PIN, без вечной блокировки
Приоритет: P2 Шаги:
- Ввести неверный PIN 5–6 раз подряд.
Ожидаемый результат: между попытками растёт задержка; профиль не блокируется насмерть.
ST-008. Тёзка — предупреждение о дубле, а не запрет
Приоритет: P3 Шаги:
- Создать карточку с именем «Иван Иванов».
- Создать вторую карточку с тем же именем.
Ожидаемый результат: «Такая карточка уже есть. Твоя — выбери её; другого человека — сохрани ещё раз»; повторное «Сохранить» создаёт тёзку — два ученика с одинаковым именем допустимы.
ST-009. Выбор режима «В классе» без учителя — не тупик
Приоритет: P1 Предусловия: чистая база, teacher-app не запущен Шаги:
- «В классе».
- Дождаться «Ничего не найдено в сети».
- Нажать «Работать самостоятельно» (или эквивалент возврата).
Ожидаемый результат: переход к выбору карточки в самостоятельном режиме; путь не тупиковый.
ST-010. Смена режима задним числом — предупреждение перед действием
Приоритет: P2 Предусловия: активная база с профилями Шаги:
- Настройки → «Режим устройства» → «Сменить режим».
- Прочитать текст предупреждения, не подтверждать.
- Нажать «Отмена».
Ожидаемый результат: первый клик только показывает, что изменится (текст последствий), кнопка подтверждения — отдельный второй шаг; «Отмена» ничего не меняет. Для перехода «В классе» → «Самостоятельно» текст называет обе стороны обмена, а не одну входящую: связь будет разорвана, работы перестанут уходить учителю, уже сделанное останется на компьютере, для возврата в класс сопряжение придётся настроить заново.
ST-011. Смена режима — профили и проекты не теряются
Приоритет: P2 Шаги:
- В самостоятельном режиме создать проект.
- Сменить режим на «В классе», затем обратно на «Самостоятельно».
Ожидаемый результат: профили и проекты на месте — стирается канал связи, а не данные.
> Кейсы ST-011a и ST-011b добавлены после находки QA (D-123) в уже пронумерованный документ. > Буквенные номера — чтобы не сдвигать сотню ссылок на ST-012…ST-130, которыми тестировщики уже > пользуются в отчётах.
ST-011a. Переход в самостоятельный режим действительно рвёт связь с учителем
Приоритет: P1 Предусловия: устройство сопряжено с учителем, статус «Синхронизировано», ученик вошёл в профиль Шаги:
- Убедиться, что в шапке горит «синхронизировано», а ученик виден в приложении учителя.
- Настройки → «Режим устройства» → «Сменить режим» → подтвердить переход в самостоятельный.
- Посмотреть на индикатор в шапке и на раздел «Синхронизация» в настройках.
- Закрыть и снова открыть приложение ученика.
Ожидаемый результат: индикатор показывает «не синхронизировано» (не «ищем приложение учителя…» — устройство, объявившее себя самостоятельным, не должно продолжать сканировать сеть); раздел «Синхронизация» пишет «Приложение ещё не синхронизировано с приложением учителя»; после перезапуска связь сама не восстанавливается. Если приложение учителя в этот момент было доступно — устройство уходит у него из списка активных в список отозванных (токен отзывается на сервере); если ноутбук учителя был выключен, устройство всё равно становится самостоятельным — отзыв делается best-effort и не может заблокировать выход.
Была ошибка (до D-123): статус оставался «Синхронизировано» — режим был подписью над живым каналом, deviceMode не читался в main-процессе вовсе.
ST-011b. Работы, созданные в самостоятельном режиме, не уходят учителю
Приоритет: P1 Предусловия: продолжение ST-011a — устройство только что переведено в самостоятельный режим Шаги:
- До перехода: создать в классном режиме проект, дождаться, пока он появится у учителя.
- Перейти в самостоятельный режим (ST-011a).
- Создать новый проект («Новый проект N»), написать в нём пару блоков, дождаться автосохранения (5 с) и подождать ещё минуту.
- Проверить список работ этого ученика в приложении учителя (обновить страницу).
Ожидаемый результат: проект, сделанный до перехода, у учителя есть — работа урока не теряется, она досылается в момент разрыва. Проект, созданный после перехода, у учителя не появляется ни сразу, ни после перезапуска обоих приложений.
Была ошибка (до D-123): «Новый проект4», созданный уже в самостоятельном режиме, приезжал учителю — пуш работ гейтился только на состоянии соединения и про режим устройства ничего не знал.
ST-012. Повреждённая локальная база — карантин и восстановление
Приоритет: P2 Предусловия: приложение закрыто Шаги:
- Испортить файл базы (см.
TESTER-GUIDE.mdчасть 3, ветка F). - Запустить приложение.
- Нажать «Начать заново».
Ожидаемый результат: диалог «Локальная база данных повреждена или недоступна»; после «Начать заново» — чистая база, вопрос о режиме задаётся снова; повреждённый файл не удалён, путь к нему назван в сообщении.
2. Редактор Blockly
ST-013. Новая программа — выбор режима при первом создании
Приоритет: P1 Предусловия: ни одного проекта ещё не создавалось на этом устройстве Шаги:
- Главная → «Новая программа».
Ожидаемый результат: диалог выбора «Блоки» / «Python», без рекламных слоганов.
ST-014. Новая программа — запоминает последний выбранный режим
Приоритет: P3 Предусловия: хотя бы одна программа уже создавалась в режиме «Блоки» Шаги:
- Главная → «Новая программа».
Ожидаемый результат: диалог выбора не показывается повторно — сразу открывается редактор блоков.
ST-015. Сборка простой программы и live-предпросмотр Python
Приоритет: P1 Шаги:
- В мастерской собрать: «когда программа запущена» → «вперёд 20 см» → «поворот на 90°».
Ожидаемый результат: справа в панели предпросмотра сразу появляется соответствующий Python-код; код обновляется при каждом изменении блоков.
ST-016. Валидация — пустая программа
Приоритет: P2 Шаги:
- Очистить рабочее поле (удалить все блоки).
- Нажать «Старт» или «Проверить».
Ожидаемый результат: «Программа пустая — добавь блоки на рабочее поле»; запуск не начинается.
ST-017. Валидация — пустой блок «когда программа запущена»
Приоритет: P2 Шаги:
- Оставить на поле только блок старта без вложенных команд.
- Запустить.
Ожидаемый результат: «Добавь хотя бы одну команду внутрь блока «когда программа запущена»».
ST-018. Валидация — блоки движения без «настройки колёс»
Приоритет: P2 Шаги:
- Добавить блок движения без предшествующего блока настройки колёс.
- Запустить.
Ожидаемый результат: ошибка «Команды движения не работают без блока «настройка колёс»» — запуск блокируется, а не молча игнорирует блоки.
ST-019. Предупреждение о «повисших» блоках
Приоритет: P3 Шаги:
- Положить блок отдельно от основной цепочки (не подключённым к «когда программа запущена»).
- Запустить программу.
Ожидаемый результат: предупреждение «блок лежит в стороне и не выполнится»; программа всё же запускается (это предупреждение, не ошибка).
ST-020. Автосохранение и восстановление после ухода с экрана
Приоритет: P1 Шаги:
- Собрать программу из нескольких блоков.
- Перейти в «Проекты», затем вернуться в мастерскую.
Ожидаемый результат: программа на месте; в списке проектов ровно один проект (не создался дубль).
3. Редактор Python
ST-022. Переключение в Python — предупреждение о необратимости
Приоритет: P1 Предусловия: проект в режиме «Блоки» Шаги:
- Начать редактировать текст в панели Python-предпросмотра.
Ожидаемый результат: появляется диалог «Реши, что делать с изменениями в Python — иначе запустятся блоки» с вариантами подтвердить/отменить/вернуться к блокам.
ST-023. Отмена перехода в Python — правка не пропадает
Приоритет: P2 Шаги:
- Как в ST-022, но на диалоге нажать «Отмена» (не «Подтвердить»).
Ожидаемый результат: диалог закрывается, но набранный текст остаётся видимым в редакторе (не откатывается); следующее нажатие клавиши снова открывает диалог.
ST-024. Явный откат к блокам
Приоритет: P2 Шаги:
- Как в ST-022, но выбрать вариант «вернуться к блокам» / отменить изменения.
Ожидаемый результат: редактор снова показывает код, сгенерированный текущими блоками; ручная правка отброшена.
ST-025. Подтверждение перехода — необратимая смена режима
Приоритет: P1 Шаги:
- Подтвердить переход в Python.
- Открыть проект заново (выйти в проекты и вернуться).
Ожидаемый результат: «Блоки» видимо недоступны с подписью «Проект переведён в Python — блоки недоступны»; редактор блоков больше не редактируется для этого проекта (D-046).
ST-026. Автосохранение Python-кода
Приоритет: P2 Предусловия: проект уже в режиме Python Шаги:
- Изменить код, подождать ~1 секунду (окно дебаунса), закрыть проект без явного сохранения.
- Открыть проект снова.
Ожидаемый результат: последняя правка сохранена.
ST-027. time.sleep() вместе с движением — честное предупреждение перед запуском
Приоритет: P2 Предусловия: проект в режиме Python Шаги:
- Написать программу с движением и
time.sleep()(например,import time,robot.drive(60),time.sleep(3),robot.stop()) и нажать «Проверить» или «Старт». - Написать программу с
time.sleep()без движения (печать, экран) и тоже проверить. - Убрать
import timeи запустить.
Ожидаемый результат:
- Перед запуском видно предупреждение: пока идёт
time.sleep(), моторы останавливаются (через ~0,8 с, лиза движения), для езды —robot.wait(секунды). Программа запускается; робот останавливается через ~0,8 с после входа вsleep— как и предупреждено. - Без движения предупреждения нет.
- Ошибка «Переменная/модуль time не подключён…» с подсказкой
robot.wait(секунды)илиimport time. Старого «time.sleep() запрещён — не отпускает «Стоп»» нигде нет.
ST-028. Синтаксическая ошибка Python подсвечивается построчно
Приоритет: P2 Шаги:
- В Python-режиме ввести код с синтаксической ошибкой (например, лишнее двоеточие).
- Нажать «Старт».
Ожидаемый результат: «❌ Ошибка в коде, строка N: …», запуск не начинается; номер строки соответствует реальной строке с ошибкой.
ST-029. Смена активного проекта не смешивает Python-код разных проектов
Приоритет: P2 Шаги:
- Открыть проект А (Python), написать уникальный код.
- Переключиться на проект Б (Python), написать другой уникальный код.
- Вернуться к проекту А.
Ожидаемый результат: код проекта А не изменился и не смешался с кодом проекта Б.
ST-020a. Программа на Python не исчезает при выходе из мастерской
Приоритет: P1 Предусловия: любой режим устройства Шаги:
- Главная → «Новая программа» → «Python».
- Написать любую строку кода, например
print("привет"). - Нажать «Сохранить».
- Уйти с экрана мастерской: «Проекты» в левом меню.
- Открыть «Проекты».
Ожидаемый результат: программа в списке; открывается, код на месте. То же самое после перезапуска приложения.
Была ошибка (до D-124): программа исчезала бесследно. Уборка брошенных проб (projects:discardIfUntouched) спрашивала только про блоки, а у программы на Python блоков нет вовсе — она считалась нетронутой заготовкой и удалялась при уходе с экрана. Пропадала любая программа, которой не дали своё имя.
Проверить заодно (обратная сторона фикса): Главная → «Новая программа» → «Блоки», ничего не менять, уйти на «Проекты» — пустая проба «Новый проект» в списке остаться не должна. Если она остаётся, уборка сломана в другую сторону: список зарастёт одинаковыми карточками.
> Номер с буквой — по той же причине, что у ST-011a/ST-011b: не сдвигать ссылки на уже > пронумерованные кейсы.
4. Подключение к роботу по Bluetooth (включая Connect Guide)
ST-030. Экран выбора робота — оба пути равнозначны
Приоритет: P1 Шаги:
- Открыть «Выбери робота».
Ожидаемый результат: обе кнопки — «Найти робота» и «Виртуальный робот» — активны и кликабельны одновременно, ни одна не выглядит недоступной по умолчанию.
ST-031. Поиск робота — робот не найден (реальный робот)
Приоритет: P1 Предусловия: телефон/робот выключены или недоступны Шаги:
- Нажать «Найти робота».
Ожидаемый результат: «Роботов не нашлось» + одна кнопка «Показать, что делать» (не несколько дублирующих инструкций).
ST-032. Подключение по сети класса (LAN) (реальный робот)
Приоритет: P1 Предусловия: ноутбук и телефон в одной Wi-Fi-сети/хотспоте, приложение робота запущено Шаги:
- «Найти робота».
- В списке найти строку «По сети · <IP>».
- Нажать «Подключить».
Ожидаемый результат: робот подключается без запроса кода сопряжения; статус меняется на «Подключено».
ST-033. Подключение по Bluetooth-эфиру, несопряжённый телефон (реальный робот)
Приоритет: P1 Предусловия: сети нет, телефон в режиме видимости Bluetooth, ранее не был сопряжён Шаги:
- «Найти робота» — телефон появляется в списке «По Bluetooth · подтвердите на телефоне после нажатия».
- Нажать «Подключить».
- Сверить код сопряжения на ноутбуке и на телефоне, подтвердить на телефоне.
Ожидаемый результат: код показан на обоих устройствах и совпадает; после подтверждения на телефоне — «Подключено» на ноутбуке.
ST-034. Повторное подключение к уже сопряжённому телефону (реальный робот)
Приоритет: P2 Предусловия: телефон уже был сопряжён ранее Шаги:
- «Найти робота» — устройство отображается как «По Bluetooth · уже подключался».
- Нажать «Подключить».
Ожидаемый результат: подключение без повторного запроса кода на телефоне (OQ-049 — известный риск, отдельно отмеченный в проекте; если канал не открывается — это подтверждение известного открытого вопроса, зафиксировать явно).
ST-035. Подключение через список последовательных портов (реальный робот)
Приоритет: P3 Шаги:
- «Найти робота» — среди результатов есть запись из списка COM/serial-портов.
- Подключиться вручную, выбрав порт.
Ожидаемый результат: известное устройство подписано «известное устройство», незнакомый порт — «выбери вручную, если это робот»; подключение проходит либо явно завершается ошибкой.
ST-036. E_BUSY — робот занят другим ноутбуком (реальный робот, 2 ноутбука)
Приоритет: P1 Предусловия: робот уже подключён к другому ноутбуку/IDE Шаги:
- Со второго ноутбука попытаться подключиться к тому же роботу.
Ожидаемый результат: «Rubrick занят — к нему подключён другой компьютер.» (не сырой код ошибки и не общий таймаут); первое подключение не разрывается.
ST-037. Несовпадение версии протокола (proto) (реальный робот, старая сборка телефона)
Приоритет: P2 Предусловия: на телефоне установлена сборка со старым протоколом (proto: 1) Шаги:
- Подключиться к роботу.
Ожидаемый результат: соединение и телеметрия работают, но появляется предупреждение «Обнови приложение на телефоне: у робота версия протокола 1, а этой программе нужна версия 2. Связь и телеметрия работают, но запуск программы на роботе недоступен...»; кнопка запуска на роботе недоступна.
ST-038. Журнал подключения — просмотр и сохранение в файл
Приоритет: P3 Шаги:
- На экране выбора робота нажать «Показать журнал подключения».
- Нажать «Сохранить в файл».
Ожидаемый результат: журнал отображается текстом; после сохранения показывается путь к файлу с подсказкой «этот файл можно отправить».
ST-039. Connect Guide — случай «робот уже отозвался по сети»
Приоритет: P2 Предусловия: робот виден по LAN Шаги:
- Открыть «Как подключить робота» (ссылка внизу экрана выбора робота).
Ожидаемый результат: заголовок случая «Робот уже виден по сети»; шаги — подготовка (кабель, приложение) и «Нажми «Подключить» у строки «По сети»» — без упоминания кодов сопряжения.
ST-040. Connect Guide — случай «сеть есть, робот молчит»
Приоритет: P2 Предусловия: у ноутбука есть сеть, робот пока не подключён/не отозвался Шаги:
- Открыть «Как подключить робота» из пустого списка.
Ожидаемый результат: заголовок «Сеть есть, но робот пока не отозвался»; в шагах — «подключи телефон к той же сети, что и ноутбук»; на Windows дополнительно шаг про галочки брандмауэра, на macOS его нет.
ST-041. Connect Guide — случай «сети нет», через приложение Bluetooth
Приоритет: P2 Предусловия: на ноутбуке нет сети, но платформенный Bluetooth-посредник поднят Шаги:
- Открыть инструкцию.
Ожидаемый результат: заголовок «Сети нет — подключаемся по Bluetooth»; шаг «сделай телефон видимым» присутствует со ссылкой на «Служебный экран → Make discoverable»; на macOS есть шаг разрешения Bluetooth в системе, на Windows его нет.
ST-042. Connect Guide — случай «сети нет и посредника нет», сопряжение через ОС
Приоритет: P2 Шаги:
- Открыть инструкцию в этой обстановке (или переключить случай вручную внизу экрана).
Ожидаемый результат: заголовок «Сети нет, и телефон придётся сопрячь через настройки»; на Windows — явное предупреждение «Windows покажет два одинаковых пункта на один телефон — пробуй по очереди»; на macOS этой фразы нет.
ST-043. Connect Guide — ручное переключение случая
Приоритет: P3 Шаги:
- Открыть «Инструкция не про нашу ситуацию» (details внизу экрана).
- Выбрать другой случай из списка.
Ожидаемый результат: инструкция переключается на выбранный случай, счётчик шагов сбрасывается на первый шаг.
ST-044. Connect Guide — навигация «Дальше»/«Назад»/«Закрыть» и признаки успеха
Приоритет: P2 Шаги:
- Пройти инструкцию до последнего шага кнопкой «Дальше».
- На первом шаге нажать «Закрыть» — убедиться в возврате.
- На последнем шаге прочитать блок «Получилось, когда:» и нажать «Искать робота».
Ожидаемый результат: «Закрыть» на первом шаге ведёт назад к экрану выбора робота; последний шаг показывает оба признака успеха (телефон и ноутбук); «Искать робота» возвращает на экран выбора и можно сразу начать поиск.
5. Запуск и остановка программы на реальном роботе
Раздел предполагает реальное железо, кроме отдельно помеченных кейсов.
ST-045. Запуск простой программы движения
Приоритет: P1 Предусловия: робот подключён, программа собрана и валидна Шаги:
- Нажать «▶ Старт».
Ожидаемый результат: кнопка меняется на «■ Стоп»; в консоли/лог видно, что программа стартовала; робот физически двигается согласно программе.
ST-046. Остановка во время движения — торможение немедленно
Приоритет: P1 Шаги:
- Запустить программу с длинным циклом движения.
- Нажать «■ Стоп» во время движения.
Ожидаемый результат: робот тормозит сразу, не докатывая до конца программы; кнопка возвращается в состояние «▶ Старт».
ST-047. Повторный «Старт» во время выполнения — перезапуск, а не ошибка
Приоритет: P2 Шаги:
- Запустить программу.
- Не дожидаясь конца, снова нажать «Старт» (с изменённым кодом).
Ожидаемый результат: прежний запуск останавливается (аналог force: true), новый стартует сразу; студенту не показывается диалог «сначала нажми Стоп».
ST-048. Программа с ошибкой останавливает робот и репортит трассировку
Приоритет: P1 Шаги:
- Запустить программу, которая роняет необработанное исключение после начала движения.
Ожидаемый результат: робот прекращает движение (лиза непрерывного движения истекает); в консоли — «❌ Ошибка: …»; за раскрывающимся «подробности» — полная трассировка на английском.
ST-049. Запуск без физического модуля — доступен, ошибка при первом обращении к железу
Приоритет: P2 Предусловия: телефон подключён по BT, USB-кабель к модулю отключён Шаги:
- Запустить программу с первой же командой движения.
Ожидаемый результат: запуск принимается (не отклоняется на уровне канала); ошибка приходит из rubrick.py на русском языке при первом реальном обращении к моторам — не «канал отказал в запуске».
ST-050. Программы без обращения к роботу выполняются без модуля
Приоритет: P3 Предусловия: та же обстановка, что и в ST-049 Шаги:
- Запустить программу, состоящую только из
print().
Ожидаемый результат: программа выполняется полностью и завершается штатно (ok), несмотря на отсутствие модуля.
ST-051. «Проверить работу» до первого запуска — запускает программу и сама показывает итог
Приоритет: P2 Предусловия: урок с автопроверкой, программа ещё ни разу не запускалась, виртуальный робот Шаги:
- Навести на кнопку «Проверить работу» — подсказка «Запустить и проверить».
- Нажать её один раз.
Ожидаемый результат: программа запускается; когда она доезжает до конца, карточка «Задание засчитано» / «Задание не засчитано» появляется сама, второй клик не нужен. Пока программа едет, подсказка кнопки — «Идёт проверка…», повторный клик ничего не запускает.
ST-052. Слишком большой Python-код отклоняется до отправки
Приоритет: P3 Предусловия: проект в режиме Python Шаги:
- Вставить в редактор код длиной существенно больше 128 КиБ (например, вставить один и тот же блок много раз).
- Нажать «Старт».
Ожидаемый результат: приложение отказывает локально с понятным сообщением «Программа слишком большая (… байт, максимум 131072 байт)», не дожидаясь ответа от телефона.
ST-055. Остановка при отсутствии активного запуска — не ошибка
Приоритет: P3 Шаги:
- Не запуская ничего, найти способ отправить «Стоп» (например, нажать «Стоп» сразу после того, как предыдущий запуск уже завершился).
Ожидаемый результат: нет сообщения об ошибке «нечего останавливать»; UI ведёт себя корректно, без зависаний.
ST-056. «Виртуальный робот» — запуск без физического железа
Приоритет: P1 Предусловия: робот не подключён, выбран «Виртуальный робот» Шаги:
- Собрать программу движения, нажать «Старт».
Ожидаемый результат: программа выполняется на встроенном эмуляторе, телеметрия и остановка работают так же, как с реальным роботом (тот же UI, та же панель).
ST-057. «Программа выполняется» на странице «Робот» отражает реальное состояние
Приоритет: P3 Предусловия: робот подключён Шаги:
- Запустить длинную программу.
- Не останавливая её, открыть «Робот» в навигации.
Ожидаемый результат: строка «Программа: выполняется»; после завершения/остановки — «не запущена».
6. Телеметрия и вывод print
ST-058. Живая телеметрия во время движения (реальный робот)
Приоритет: P1 Шаги:
- Запустить программу движения.
- Наблюдать панель телеметрии/Robot View.
Ожидаемый результат: значения (скорость, положение и т.п.) обновляются в реальном времени, без заметного запаздывания больше секунды.
ST-059. print() появляется в консоли построчно и без потерь
Приоритет: P1 Шаги:
- Написать программу с несколькими
print()в разных местах, включая цикл. - Запустить, открыть консоль.
Ожидаемый результат: все строки появляются в консоли в правильном порядке; счётчик непрочитанного растёт, пока консоль свёрнута.
ST-060. Индикатор непрочитанных сообщений в свёрнутой консоли
Приоритет: P3 Шаги:
- Свернуть консоль.
- Запустить программу с несколькими
print().
Ожидаемый результат: на кнопке консоли появляется бейдж-счётчик; при ошибке бейдж окрашен как «есть ошибка» (иным цветом/классом).
ST-061. Печать без завершающего перевода строки не теряется и не ломает разбор
Приоритет: P3 Предусловия: проект в режиме Python Шаги:
- Написать
print("часть1", end=""), затем ещё одинprint("часть2")в следующей строке кода. - Запустить.
Ожидаемый результат: обе части выводятся корректно (сцепленно или раздельно, но без потери текста и без лишних переносов строк, которых не было в программе).
ST-062. NO SIGNAL после потери сигнала телеметрии (реальный робот)
Приоритет: P2 Предусловия: робот подключён, идёт телеметрия Шаги:
- Временно заблокировать/отдалить телефон так, чтобы телеметрия перестала приходить (не разрывая BT-соединение полностью, если получится, либо просто зафиксировать момент разрыва).
Ожидаемый результат: индикатор «нет сигнала» появляется не раньше ~800 мс тишины (не мгновенно после короткой заминки).
ST-063. Батарея робота отображается на странице «Робот»
Приоритет: P2 Предусловия: робот подключён, модуль отвечает Шаги:
- Открыть «Робот».
Ожидаемый результат: видно значение напряжения батареи в вольтах — именно батареи модуля, а не телефона.
ST-064. Данные прошивки модуля отображаются
Приоритет: P3 Шаги:
- Открыть «Робот» при подключённом модуле.
Ожидаемый результат: видны «Прошивка модуля» и «Модуль» (модель + серийный номер), не пустые поля.
ST-065. «Проверить работу» использует данные именно последнего запуска
Приоритет: P2 Шаги:
- Запустить программу А, дождаться завершения, посмотреть результат «Проверить работу».
- Изменить программу и запустить снова (программа Б).
- Нажать «Проверить работу» второй раз.
Ожидаемый результат: второй результат оценки соответствует программе Б, а не устаревшим данным программы А; при новом запуске старый результат оценки явно сбрасывается/скрывается до готовности нового.
ST-133. Повторная проверка после исправления ошибки (RUB-129)
Приоритет: P1 Предусловия: урок с автопроверкой по времени, виртуальный робот Шаги:
- Написать неверную программу, нажать «Проверить работу» — «Задание не засчитано».
- Исправить программу (не нажимая «Старт»).
- Нажать «Проверить работу».
Ожидаемый результат: после шага 2 старая красная карточка сразу исчезает; на шаге 3 запускается исправленная программа и по её окончании появляется новый итог. Урок после неудачной проверки остаётся «Продолжить», после успешной — «Пройден» и обратно не откатывается.
ST-134. Проверка урочного проекта, открытого из «Мои проекты»
Приоритет: P2 Шаги:
- Открыть урок из курса, написать программу, закрыть.
- Открыть этот же проект из «Мои проекты» (или «Мастерская»).
- Нажать «Проверить работу».
Ожидаемый результат: автопроверка урока работает так же, как при входе через курс; нет сообщения «Эта программа не привязана к уроку».
ST-135. Остановка во время проверки
Приоритет: P2 Шаги:
- Нажать «Проверить работу», пока программа едет — нажать «Стоп».
- Нажать «Проверить работу» ещё раз, ничего не меняя.
Ожидаемый результат: после шага 1 — «Программа не доехала до конца — проверка отменена…», вердикт не записывается; шаг 2 запускает программу заново. На живом модуле дополнительно: обрыв связи и перехват пультом дают свои сообщения («Связь с роботом прервалась…», «Робота перехватил пульт…»).
ST-136. Проверка расстояния на виртуальном роботе (D-143)
Приоритет: P2 Предусловия: учитель задал автопроверку distance_traveled 90–110 мм (пример из редактора учителя), виртуальный робот Шаги:
- Программа: «настройка колёс» в начале (маленькое колесо Ø43), проехать 10 см. «Проверить работу».
- То же с большим колесом Ø56 и портами A/B.
- Проехать 30 см.
- Поставить «настройку колёс» после блока движения.
Ожидаемый результат: 1–2 — «Задание засчитано»; 3 — «не засчитано», в тексте фактическое расстояние в мм; 4 — нейтральное «Эту проверку пока нельзя сделать» с советом поставить настройку колёс в начало, вердикт не записывается.
ST-137. Проверка расстояния на настоящем роботе — пока недоступна
Приоритет: P2 Предусловия: живой модуль + телефон, задание с distance_traveled Шаги:
- Запустить проверку на настоящем роботе.
Ожидаемый результат: нейтральное «Проверка расстояния пока работает только на виртуальном роботе — переключись на виртуального робота…», без красного «не засчитано»; статус урока не меняется. Проверки по времени на настоящем роботе — см. RUB-137.
7. Ошибки Python при выполнении
Таблица ожидаемых сообщений — из protocols/01-student-app--android-bridge.md §8.3.
ST-066. IndentationError → «Ошибка отступов»
Приоритет: P2 Шаги:
- Написать Python-код с неправильным отступом (например, лишний пробел перед строкой без блока).
- Запустить.
Ожидаемый результат: «Ошибка отступов. Проверь пробелы в начале строк.»
ST-067. NameError → «Переменная не определена»
Приоритет: P2 Шаги:
- Использовать необъявленную переменную.
- Запустить.
Ожидаемый результат: «Переменная не определена. Проверь название.»
ST-068. ZeroDivisionError → «Деление на ноль»
Приоритет: P2 Шаги:
- Написать
1 / 0(или переменную, равную нулю, в знаменателе). - Запустить.
Ожидаемый результат: «Деление на ноль.»
ST-069. AttributeError → «У объекта нет такого метода или свойства»
Приоритет: P3 Шаги:
- Вызвать несуществующий метод у
robot(например,robot.летать()). - Запустить.
Ожидаемый результат: «У объекта нет такого метода или свойства.»
ST-070. Исключения rubrick.py показываются на русском без переупаковки
Приоритет: P1 Предусловия: удалось вызвать собственное исключение библиотеки rubrick.py (например, попытка команды движения при заблокированном модуле/аварии) Шаги:
- Спровоцировать ошибку внутри
rubrick.py. - Запустить.
Ожидаемый результат: показанное сообщение — уже готовая русская фраза библиотеки, показанная дословно, без прогона через таблицу общих ошибок (протокол требует именно verbatim-показ, когда exc.rubrick == true).
ST-071. Неизвестный тип исключения — общий запасной вариант
Приоритет: P3 Шаги:
- Вызвать редкое исключение, не входящее в таблицу маппинга (например,
raise RecursionError("тест")— само по себе имя исключения, безraise, ничего не вызывает, это просто выражение). - Запустить.
Ожидаемый результат: запасное сообщение вида «❌ Ошибка: <последняя строка трассировки>», а не пустой экран или необработанное состояние.
ST-072. «Подробности» — полная трассировка доступна, но свёрнута
Приоритет: P2 Шаги:
- Спровоцировать любое необработанное исключение.
- Раскрыть «подробности» в консоли.
Ожидаемый результат: видна полная английская трассировка Python, свёрнутая по умолчанию, но доступная по клику.
ST-073. Подсветка строки с ошибкой в редакторе
Приоритет: P3 Предусловия: проект в режиме Python Шаги:
- Спровоцировать ошибку на конкретной известной строке кода.
- Запустить, посмотреть на редактор.
Ожидаемый результат: соответствующая строка визуально выделена/подсвечена (если функциональность реализована) — либо сообщение прямо называет номер строки.
8. Уроки и прогресс
ST-074. «Курсы» без синхронизации с учителем
Приоритет: P1 Предусловия: самостоятельный режим, устройство не сопряжено Шаги:
- Открыть «Курсы».
Ожидаемый результат: «Курсы появятся после синхронизации» + кнопка настройки синхронизации; ни одного раздела-заглушки вида «Скоро»/«В разработке».
ST-075. Курсы появляются после синхронизации с учителем
Приоритет: P1 Предусловия: устройство сопряжено, учитель опубликовал хотя бы один курс Шаги:
- Открыть «Курсы».
Ожидаемый результат: список курсов и уроков от учителя; новый непройденный курс помечен бейджем «Новый».
ST-076. Учитель не опубликовал курсов — честное сообщение
Приоритет: P2 Предусловия: устройство сопряжено, у учителя нет опубликованных курсов Шаги:
- Открыть «Курсы».
Ожидаемый результат: «Учитель пока не опубликовал ни одного курса» — не пустой список без объяснений.
ST-077. Прогресс урока отражает реальное прохождение
Приоритет: P1 Предусловия: есть урок с автопроверкой Шаги:
- Открыть урок, выполнить задание так, чтобы «Проверить работу» дала успешный вердикт.
- Вернуться в «Курсы».
Ожидаемый результат: урок помечен пройденным; агрегированный прогресс курса («пройдено X из Y» или «курс пройден») обновился.
ST-078. Главная — «Продолжить урок» ведёт на реальный последний урок
Приоритет: P2 Предусловия: есть незавершённый урок Шаги:
- Открыть незавершённый урок частично.
- Вернуться на главную.
Ожидаемый результат: карточка «Продолжить урок» указывает именно на этот урок (не на захардкоженный курс) и открывает его по клику.
ST-079. Главная без прогресса — карточки «Продолжить» нет
Приоритет: P2 Предусловия: ни один урок ещё не начат Шаги:
- Открыть главную.
Ожидаемый результат: карточки «Продолжить урок» нет вовсе; нигде на экране не отображается «0% выполнено».
ST-080. Пакет курса частично не читается — честный отчёт о потерях
Приоритет: P3 Предусловия: синхронизирован курс с элементами, которые эта версия приложения не умеет разобрать (либо смоделировать искусственно на тестовом стенде, если инструмент есть) Шаги:
- Синхронизировать курс.
Ожидаемый результат: если часть материалов пропущена — видно сообщение «Не удалось прочитать материалов: N. Попроси учителя обновить приложение», а не молчаливая потеря.
ST-081. Урок открывается и подсказки (хинты) отображаются, если заданы
Приоритет: P3 Предусловия: урок с текстовыми подсказками Шаги:
- Открыть урок, найти блок подсказок.
Ожидаемый результат: подсказки видны и читаемы, соответствуют содержимому урока.
9. Связь с приложением учителя по LAN
Требует второй ноутбук/второе приложение (teacher-app).
ST-082. Обнаружение учителя и автоматическое сопряжение с единственным кандидатом
Приоритет: P1 Предусловия: teacher-app запущен, окно сопряжения открыто, в сети только один учитель Шаги:
- Ученик: «В классе» → экран поиска.
Ожидаемый результат: учитель находится автоматически; при единственном кандидате сопряжение запускается само, без выбора вручную.
ST-083. Сверка кода сопряжения на обоих экранах
Приоритет: P1 Шаги:
- Довести сопряжение до подтверждения учителем.
Ожидаемый результат: одинаковый короткий код виден и на ноутбуке ученика, и на экране учителя; термин на обоих экранах — «код», а не «отпечаток безопасности».
ST-084. Несколько кандидатов в сети — ручной выбор, без автосопряжения
Приоритет: P2 Предусловия: в сети видны два teacher-app одновременно (или эмулировать двумя запущенными инстансами) Шаги:
- Ученик: «В классе» → экран поиска.
Ожидаемый результат: авто-сопряжение не срабатывает; список кандидатов показан для ручного выбора, и это состояние «липнет» — даже если один кандидат позже исчезнет, авто-сопряжение всё равно не включается для этого сеанса.
ST-085. Ручной ввод адреса при отсутствии обнаружения
Приоритет: P2 Предусловия: учитель недостижим через discovery (другая подсеть, но известен IP) Шаги:
- Дождаться «Ничего не найдено в сети».
- Ввести
host:portвручную и нажать «Далее».
Ожидаемый результат: попытка подключения к указанному адресу; при неверном формате — «Введи адрес в формате host:port, например 192.168.1.20:50506».
ST-086. Смена отпечатка сервера — предупреждение о подмене
Приоритет: P1 Предусловия: устройство уже было сопряжено; сервер переустановлен с новым сертификатом (или эмулировать иначе, если возможно на стенде) Шаги:
- Попытаться синхронизироваться.
Ожидаемый результат: полноэкранное предупреждение «Приложение учителя ответило другим отпечатком безопасности…», короткие формы «было/сейчас», без опции «доверять всё равно» и без показа полного отпечатка; текст рекомендует позвать учителя.
ST-087. Отвязка от учителя — подтверждение в два клика
Приоритет: P2 Предусловия: устройство сопряжено Шаги:
- Настройки/Синхронизация → «Отвязаться от этого учителя».
- Проверить, что первый клик не выполняет отвязку сразу.
- Нажать подтверждающую кнопку.
Ожидаемый результат: первый клик только показывает подтверждение («Точно отвязаться?»); отвязка происходит только после явного второго клика.
ST-088. Учитель отозвал доступ устройства
Приоритет: P2 Предусловия: teacher-app отозвал токен этого устройства Шаги:
- Открыть «Курсы» или «Настройки → Синхронизация» на ученике.
Ожидаемый результат: «Учитель отозвал доступ этого устройства» + кнопка «Попробовать сопрячься заново».
ST-089. Заморозка (freeze) от учителя во время работы
Приоритет: P1 Предусловия: ученик работает в мастерской, есть запущенная программа Шаги:
- Учитель командует «заморозить» (freeze) с этого устройства/класса.
Ожидаемый результат: полноэкранная панель «Учитель приостановил работу» с обратным отсчётом (если задан срок); активная программа на роботе останавливается до появления панели.
ST-090. Автоматическое снятие заморозки по таймауту
Приоритет: P3 Предусловия: заморозка активна, учитель недостижим 30+ минут (или ускоренный тестовый таймаут, если есть) Шаги:
- Дождаться истечения срока действия заморозки без участия учителя.
Ожидаемый результат: заморозка снимается сама; всплывает уведомление об истечении.
ST-091. Блокировка ученика (student_lock) — возврат к выбору карточки
Приоритет: P2 Предусловия: учитель блокирует конкретного ученика Шаги:
- Учитель применяет блокировку к текущему профилю (из «Классы» или «Класс») и пишет причину, например «Контрольная».
- Не закрывая экран, дождаться возврата к выбору карточки.
- Другой ученик нажимает на заблокированную карточку.
- Нажать на заблокированную карточку ещё раз: экран PIN не открывается, карточка остаётся на экране выбора с сообщением.
- Вернуться назад из экрана подключения к учителю (если открывали) на экран выбора карточки.
Ожидаемый результат: «Твой профиль заблокирован учителем» и строка «Причина: Контрольная» на панели и после возврата к выбору карточки внутри своей группы (не к общему списку групп). Причина блокировки ученика видна только этому ребёнку: другой ученик, нажавший ту же карточку, видит заблокированную карточку без причины; экран PIN для заблокированной карточки не открывается; после возврата назад или нового входа на экран выбора причины нет. Блокировка без причины работает как раньше, строки «Причина» нет.
ST-092. Блокировка класса (class_lock) — возврат к списку групп
Приоритет: P2 Шаги:
- Учитель блокирует весь класс (из «Классы» или «Класс») и пишет причину, например «Обед».
- Ученик внутри карточки этого класса ждёт возврата к списку групп.
- Одноклассник нажимает на карточку этого класса (через «Недавно здесь», поиск или запомненную группу) и вводит PIN.
- Повторить шаги 1–2, выключив Wi-Fi на ученическом ноутбуке на время блокировки и включив его после.
Ожидаемый результат: «Твоя группа заблокирована учителем» и «Причина: Обед» на панели и затем на списке групп. У одноклассника на карточке и на экране PIN тоже «Причина: Обед». После включения Wi-Fi блокировка доходит вместе с обновлением класса, и причина видна на списке групп и на карточках. Блокировка без причины работает как раньше. После разблокировки строки «Причина» нет.
ST-093. Учитель офлайн — индикатор синхронизации честно показывает разрыв, урок не прерывается
Приоритет: P1 Предусловия: устройство сопряжено и синхронизировано Шаги:
- Закрыть teacher-app.
- На ученике продолжить работу в мастерской, открыть «Настройки».
Ожидаемый результат: через несколько секунд статус меняется на «сопряжено, нет связи»; текст в настройках согласован с индикатором в шапке; текущий урок/программа не прерывается.
ST-094. Синхронизация проекта не блокирует локальную работу
Приоритет: P3 Шаги:
- Во время активной синхронизации курсов продолжить редактировать программу в мастерской.
Ожидаемый результат: редактор остаётся отзывчивым, синхронизация не блокирует ввод.
ST-131. Ростер класса приезжает сразу после сопряжения
Приоритет: P1 Предусловия: в teacher-app создан класс с учениками; устройство ученика в режиме «В классе», ещё не сопряжено Шаги:
- Пройти сопряжение (учитель подтверждает устройство, «Готово! Устройство сопряжено»).
- Нажать «Продолжить» и дойти до экрана выбора карточки.
Ожидаемый результат: в списке групп есть класс учителя (не только «Локальная группа»); внутри — карточки учеников, созданных учителем. Ждать ручной синхронизации или перезапуска не требуется.
ST-132. Изменения ростера у учителя доезжают до открытого экрана выбора
Приоритет: P2 Предусловия: устройство сопряжено и онлайн; на ученике открыт экран выбора карточки Шаги:
- На стороне учителя добавить нового ученика в класс (или переименовать существующего).
Ожидаемый результат: карточка появляется/обновляется на открытом экране без перезапуска приложения (по sync_hint). Удаление ученика у учителя карточку на устройстве не удаляет — синхронизация ростера аддитивная (защита работ ученика).
10. Задания, сдача работ и перенос проектов
ST-095. Код ученика доезжает до учителя (push)
Приоритет: P1 Предусловия: устройство сопряжено Шаги:
- Написать и сохранить программу на ученике.
- На стороне учителя открыть вкладку «Код учеников».
Ожидаемый результат: программа ученика видна учителю (только для чтения); соответствует последней сохранённой версии.
ST-096. Перенос проектов на новый ноутбук (pull)
Приоритет: P2 Предусловия: у ученика есть работы, синхронизированные с учителем ранее; новое устройство ещё не видело эти проекты Шаги:
- Войти под тем же профилем на новом (пустом) ноутбуке, сопряжённом с тем же учителем.
- Открыть «Проекты».
Ожидаемый результат: ранее сохранённые на другом ноутбуке проекты появляются в списке — подтягиваются с учителя.
ST-097. Экспорт проекта в файл
Приоритет: P2 Шаги:
- В «Проектах» нажать «В файл» на карточке проекта.
Ожидаемый результат: запускается системный диалог сохранения; после сохранения файл валиден (может быть импортирован обратно).
ST-098. Импорт проекта из файла
Приоритет: P2 Шаги:
- «Проекты» → «Открыть из файла», выбрать ранее экспортированный файл.
Ожидаемый результат: проект появляется в списке и сразу открывается в мастерской; при повреждённом/неподходящем файле — понятная ошибка импорта, а не тишина.
ST-099. Организация проектов по папкам
Приоритет: P3 Шаги:
- У проекта выбрать «+ Новая папка…», ввести название, подтвердить Enter.
- Проверить, что проект появился в новой группе.
Ожидаемый результат: проект перемещён в папку; список группируется по папкам, «без папки» — отдельная группа сверху.
ST-100. Сортировка списка проектов
Приоритет: P3 Шаги:
- Создать несколько проектов в разное время, с разными именами.
- Переключить сортировку «Сначала недавние» ↔ «По алфавиту».
Ожидаемый результат: порядок списка меняется корректно в обоих режимах.
ST-101. Импорт курса файлом (флешка = файл с флешки)
Приоритет: P3 Предусловия: на учителе доступен пакет курса на внешнем носителе Шаги:
- На teacher-app импортировать пакет курса из файла на флешке.
- Опубликовать курс ученикам.
Ожидаемый результат: курс доходит до ученика тем же путём, что и обычная синхронизация — отдельного «USB-режима» на ученике не требуется.
11. Обновления приложения
ST-102. Проверка обновлений — «установлена последняя версия»
Приоритет: P2 Предусловия: установлена актуальная версия Шаги:
- Настройки → «Обновления» → «Проверить обновления».
Ожидаемый результат: «Установлена последняя версия.», ниже — строка «Проверено в ЧЧ:ММ» с текущим временем; на время работы кнопка подписана «Проверяем…».
ST-102a. На самостоятельном устройстве проверка объясняет себя и предлагает файл
Приоритет: P2 Предусловия: самостоятельный режим (D-123), устройство не сопряжено с учителем, адрес портала не задан Шаги:
- Настройки → «Обновления» → «Проверить обновления».
- Прочитать сообщение целиком.
- Подождать минуту и нажать ещё раз.
Ожидаемый результат: «Обновления недоступны: приложение не подключено к учителю, а адрес портала не задан — обновление можно поставить из файла». Фразы «ни один источник обновлений не ответил» нет: спрашивать было некого, и это штатное состояние ноутбука, унесённого домой, а не поломка. Про отсутствующий интернет тоже не пишем — он ни при чём. После повторного нажатия время в строке «Проверено в …» меняется, даже если само сообщение осталось прежним.
Была ошибка (до D-125): сообщение говорило про молчащие источники, а повторное нажатие не меняло на экране ничего — тот же дефект, который QA нашла в панели учителя.
ST-103. Доступно обновление — скачивание и установка раздельны
Приоритет: P1 Предусловия: доступна более новая версия Шаги:
- «Проверить обновления» → появляется «Доступна версия X…».
- Нажать «Скачать», дождаться прогресса.
- После «готово» нажать «Установить».
Ожидаемый результат: скачивание показывает прогресс в процентах; после скачивания статус «готово» с подсказкой по установке; установка запускается отдельным явным кликом, не автоматически сразу после скачивания.
ST-104. Установка обновления закрывает приложение осознанно
Приоритет: P2 Предусловия: обновление скачано («готово») Шаги:
- Нажать «Установить» во время открытого проекта с несохранёнными изменениями (если возможно воссоздать).
Ожидаемый результат: приложение не закрывается посреди работы без предупреждения — либо автосохранение уже гарантирует отсутствие потерь (проверить, что после переустановки проект цел).
ST-105. Обновления недоступны — причина названа
Приоритет: P3 Предусловия: сеть отключена или сервер обновлений недостижим Шаги:
- «Проверить обновления» без сети.
Ожидаемый результат: «Обновления недоступны: <причина>» — конкретная причина, не пустое молчание.
ST-106. Обновление из файла (офлайн-доставка)
Приоритет: P2 Предусловия: установочный пакет обновления получен не через сеть (например, от учителя) Шаги:
- «Обновить из файла…», выбрать пакет.
Ожидаемый результат: обновление принимается и обрабатывается тем же путём, что сетевое (по крайней мере не падает и даёт понятный результат — успех или явную ошибку формата).
ST-107. Версия приложения видна в настройках
Приоритет: P3 Шаги:
- Открыть «Настройки → О приложении».
Ожидаемый результат: показана текущая установленная версия — нужна для отчёта о найденных багах (часть 6 TESTER-GUIDE.md).
12. Офлайн-режим
ST-108. Полностью автономная работа без сети и без сопряжения
Приоритет: P1 Предусловия: самостоятельный режим, Wi-Fi выключен на ноутбуке Шаги:
- Пройти полный цикл: выбрать карточку → создать программу → запустить на виртуальном роботе → посмотреть телеметрию.
Ожидаемый результат: ни один шаг не требует сети; ничего не «висит», ожидая ответа сервера.
ST-109. Отсутствие интернета не показывается как ошибка
Приоритет: P2 Шаги:
- Отключить интернет (но не локальную сеть/LAN, если учитель на ней есть) и поработать в приложении.
Ожидаемый результат: нет диалогов вида «нет подключения к интернету»; отсутствие интернета — норма продукта, не сбой (см. «Что НЕ является багом» в TESTER-GUIDE.md).
ST-110. Работа с реальным роботом полностью офлайн (без учителя и без интернета)
Приоритет: P1 Предусловия: реальный робот, ни teacher-app, ни интернет недоступны Шаги:
- Подключиться к роботу по Bluetooth (без сети).
- Написать и запустить программу.
Ожидаемый результат: программа выполняется на реальном железе так же, как при наличии сети — BT-путь к роботу не зависит ни от LAN, ни от интернета (D-086).
ST-111. Возврат сети/учителя после автономной работы — синхронизация без потерь
Приоритет: P2 Предусловия: ученик поработал офлайн, накопил проекты/прогресс Шаги:
- Включить сеть, дождаться появления/переподключения учителя.
Ожидаемый результат: накопленные локально проекты и прогресс не теряются и (если применимо) доезжают до учителя при следующей синхронизации.
ST-112. Индикатор синхронизации в шапке приложения честен в офлайне
Приоритет: P3 Шаги:
- В офлайне (без пары с учителем) открыть любой экран приложения-оболочки (
AppShell).
Ожидаемый результат: индикатор синхронизации в шапке не утверждает ложного «синхронизировано»; текст согласован с тем, что видно в «Настройки → Синхронизация».
13. Отказоустойчивость: реальное железо
Раздел целиком требует физического робота. Каждый кейс моделирует реальный сбой, который случится на школьном уроке.
ST-113. Обрыв Bluetooth во время выполнения программы (реальный робот)
Приоритет: P1 Предусловия: робот подключён, идёт выполнение программы с движением Шаги:
- Отвести/увести телефон за пределы дальности Bluetooth (или выключить Bluetooth на ноутбуке) во время движения.
Ожидаемый результат: UI отражает разрыв связи (статус меняется на «Переподключение…» или «Не подключено»); программа на телефоне не обрывается принудительно ноутбуком — по протоколу робот не должен замереть мгновенно посреди манёвра, но и не должен продолжать движение бесконечно (лиза непрерывного движения ограничивает его ~800 мс без keepalive).
ST-114. Переподключение после обрыва — повторное присоединение к запущенной программе
Приоритет: P1 Предусловия: ситуация из ST-113, программа на телефоне продолжает выполняться Шаги:
- Вернуть телефон в радиус действия / включить Bluetooth обратно.
- Дождаться автоматического переподключения на ноутбуке.
Ожидаемый результат: приложение переподключается и заново показывает статус текущего запуска (в том числе «выполняется», если программа ещё не закончилась) — без необходимости заново нажимать «Старт».
ST-115. Отключение телефона (выключение) во время выполнения (реальный робот)
Приоритет: P1 Шаги:
- Запустить программу движения.
- Выключить телефон (или принудительно завершить приложение робота) во время выполнения.
Ожидаемый результат: робот доканчивает текущее позиционное движение и останавливается (лиза), не продолжает крутиться бесконечно; ноутбук показывает потерю связи, не зависает и не выдаёт неинформативную ошибку.
ST-116. Отключение USB-кабеля модуля во время работы (реальный робот)
Приоритет: P1 Предусловия: телефон подключён к ноутбуку по BT, кабель телефон↔модуль на месте, программа запущена Шаги:
- Физически отсоединить USB-кабель между телефоном и модулем во время выполнения.
Ожидаемый результат: BT-канал к ноутбуку не рвётся сам по себе; следующая команда движения завершается понятной русской ошибкой (обрыв связи с модулем), а не тихим зависанием; статус связи с модулем на странице «Робот» отражает link: none.
ST-117. Восстановление USB-кабеля — работа продолжается без перезапуска приложений
Приоритет: P2 Предусловия: ситуация из ST-116 Шаги:
- Подключить кабель обратно.
- Запустить новую программу с движением.
Ожидаемый результат: новая программа выполняется нормально без необходимости перезапускать приложение робота или переподключаться по BT заново.
ST-118. Разряженный/низкий заряд аккумулятора робота (реальный робот с низким зарядом)
Приоритет: P2 Предусловия: аккумулятор модуля разряжен близко к минимуму (готовится заранее) Шаги:
- Подключиться, открыть «Робот», посмотреть значение батареи.
- Попробовать запустить программу движения.
Ожидаемый результат: значение напряжения показано честно и низко; поведение при критически низком заряде не приводит к неожиданному/опасному поведению робота (либо документированно отказывает).
ST-119. Второй ученик пытается подключиться к тому же роботу во время урока
Приоритет: P2 Предусловия: реальный робот уже подключён к первому ноутбуку, второй телефон/ноутбук пробует тот же робот Шаги:
- Со второго устройства попытаться подключиться (см. ST-036).
Ожидаемый результат: второй получает «Rubrick занят»; первое соединение и его текущий запуск не затронуты.
ST-120. Уход робота за пределы Bluetooth-радиуса и возврат (реальный робот, требуется место)
Приоритет: P2 Шаги:
- Запустить программу.
- Физически унести робота на расстояние, где связь пропадает (типично > 10 м или через несколько стен).
- Вернуть робота в радиус действия.
Ожидаемый результат: аналогично ST-113/ST-114 — связь пропадает и восстанавливается предсказуемо, без необходимости пересоздавать проект или перезапускать приложение с нуля.
ST-121. Аварийная остановка (E-stop) при зависшей программе
Приоритет: P1 Предусловия: запущена программа с намеренно «зависающим» участком (например, тяжёлый цикл без вызовов robot.wait()), робот в движении Шаги:
- Дождаться, пока программа перестанет реагировать на команды (если удаётся воспроизвести).
- Нажать «Стоп».
Ожидаемый результат: модуль тормозит независимо от того, ответил ли интерпретатор Python («торможение раньше остановки программы» — протокол §5.1); UI показывает stop_ack с brake_confirmed: true, если модуль подтвердил торможение.
ST-122. Замер времени торможения после «Стоп» (реальный робот, секундомер)
Приоритет: P3 Шаги:
- Запустить непрерывное движение.
- Нажать «Стоп», засечь время от клика до визуальной остановки колёс.
Ожидаемый результат: субъективно быстро (документированный бюджет — не гарантия для BT-плеча, но модуль должна тормозить в пределах десятых долей секунды после получения команды).
ST-123. Аккуратное завершение работы: закрытие крышки ноутбука посреди запуска
Приоритет: P3 Шаги:
- Запустить программу движения.
- Закрыть крышку ноутбука (уснуть) на несколько секунд, затем открыть.
Ожидаемый результат: после пробуждения приложение либо всё ещё подключено, либо честно показывает разрыв и предлагает переподключиться; робот не остаётся в неопределённом состоянии.
14. Кроссплатформенность macOS / Windows
Каждый применимый кейс из разделов 1–13 стоит повторить на обеих платформах хотя бы раз; здесь — кейсы, специфичные именно для платформенных различий.
ST-124. Установка на Windows — предупреждение «Неизвестный издатель»
Приоритет: P2 Предусловия: установщик student-<версия>-win-x64.exe с https://rubrick.beys.tech/downloads Шаги:
- Запустить установщик.
Ожидаемый результат: Windows SmartScreen показывает «Неизвестный издатель»; после «Подробнее» → «Выполнить в любом случае» установка проходит нормально (это ожидаемое поведение, не баг — подпись ещё не куплена).
ST-125. Установка на macOS через .dmg
Приоритет: P2 Шаги:
- Открыть
.dmg, перетащить приложение в «Программы». - Запустить.
Ожидаемый результат: приложение запускается; если Gatekeeper блокирует — задокументированный обходной путь работает (например, через «Открыть» из контекстного меню).
ST-126. Разрешение сети на Windows для первого запуска
Приоритет: P1 Предусловия: первый запуск на «чистой» Windows-машине, требуется LAN-сопряжение с учителем Шаги:
- При первом запуске, когда Windows спросит про доступ к сети, поставить обе галочки — частные и общественные сети.
Ожидаемый результат: после этого обнаружение учителя по сети работает; если поставить только «частные» — школьный Wi-Fi (обычно определяется как общественный) блокирует обнаружение без явной ошибки (известное ограничение, зафиксированное в TESTER-GUIDE.md).
ST-127. Bluetooth-разрешение на macOS — запрашивается один раз
Приоритет: P2 Шаги:
- При первом поиске робота через Bluetooth-посредник дождаться системного диалога разрешения Bluetooth.
- Разрешить.
- Повторить поиск позже.
Ожидаемый результат: запрос показывается один раз; повторные поиски больше не спрашивают разрешение.
ST-128. Windows показывает два одинаковых пункта на один сопряжённый телефон
Приоритет: P2 Предусловия: сопряжение через параметры Windows (случай no-network-manual) Шаги:
- В параметрах Windows «Bluetooth и устройства → Добавить устройство» найти телефон.
Ожидаемый результат: возможно появление двух неотличимых записей на одно устройство (известный факт, отражённый в Connect Guide — ST-042); подключение срабатывает хотя бы через одну из них при переборе по очереди.
ST-129. Расположение файла базы данных различается по ОС
Приоритет: P3 Шаги:
- Найти файл базы: на macOS —
~/Library/Application Support/student-app/rubrick.db; на Windows —%APPDATA%\student-app\rubrick.db.
Ожидаемый результат: файл существует по документированному для платформы пути; сценарии сброса базы (TESTER-GUIDE.md) работают на обеих ОС.
ST-130. Внешний вид (скругления, тема) одинаков на обеих ОС
Приоритет: P3 Шаги:
- Пройтись по основным экранам на обеих платформах, сверяя вёрстку: скругления «Мягкого» стиля (D-174: 8 / 12 / 16 px, пилюли), выравнивание полей и кнопок одной высоты, аватары по центру.
- Проверить тему на каждой платформе: приложение всегда светлое, переключателя темы в Настройках нет (D-172). На установке, где раньше была выбрана тёмная тема, после обновления приложение открывается светлым, без вспышки тёмного при запуске.
Ожидаемый результат: визуальных расхождений между macOS и Windows нет; на обеих ОС приложение светлое, включая Blockly и редактор Python.
Как сообщать о находках
См. «Часть 6. Как сообщать о находках» в ../TESTER-GUIDE.md — формат находки (ветка/кейс, шаги, ожидание, факт, скриншот, окружение) общий для обоих документов.