РУБРИК · портал

← Ко всем документам

Ручные тест-кейсы — приложение ученика (student-app)

Полный набор ручных тест-кейсов для тестировщика, у которого на руках настоящее железо: робот (модуль STM32 + Android-телефон с приложением-мостом), ноутбук ученика (macOS или Windows) и, для части кейсов, ноутбук учителя. Дополняет ../TESTER-GUIDE.md (там — понятийный ввод и первый проход по первому запуску) и ../student-app/MANUAL-TEST-01-first-launch.md (тот файл — журнал конкретных прогонов ветки первого запуска; здесь — исчерпывающий чек-лист по всему приложению).

Стенд тестера

Обязательно:

Для разделов 9–10 (учитель) — второй ноутбук или второе приложение teacher-app на этом же компьютере, плюс общая Wi-Fi-сеть или мобильная точка доступа (D-086: роутер, либо телефон-хотспот, либо явное «сети нет»).

Опционально: секундомер (замер времени останова/переподключения), второй Android-телефон (для кейса «второй ученик подключается к тому же роботу»), доступ к параметрам Windows/macOS для сброса пар Bluetooth.

Виртуальный робот (Виртуальный робот в приложении) не требует железа вовсе — большинство кейсов разделов 2–3 и часть раздела 6 можно пройти без физического робота, но реальное железо остаётся приоритетом там, где помечено (реальный робот).

Сводная таблица разделов

№РазделКейсов
1Первый запуск и онбординг14
2Редактор Blockly9
3Редактор Python9
4Подключение к роботу по Bluetooth (включая Connect Guide)15
5Запуск и остановка программы на реальном роботе13
6Телеметрия и вывод print8
7Ошибки Python при выполнении8
8Уроки и прогресс8
9Связь с приложением учителя по LAN15
10Задания, сдача работ и перенос проектов7
11Обновления приложения7
12Офлайн-режим5
13Отказоустойчивость: реальное железо11
14Кроссплатформенность macOS / Windows7
Итого132

1. Первый запуск и онбординг

Сжатая выжимка веток A–F из MANUAL-TEST-01-first-launch.md — для полного прохода используй тот файл. Здесь — минимум, без которого остальные разделы не имеют смысла.

ST-001. Первый вопрос — «где работает этот компьютер»

Приоритет: P1 Предусловия: чистая база (см. «Сброс к первому запуску» в TESTER-GUIDE.md) Шаги:

Ожидаемый результат: экран «Где работает этот компьютер?» с двумя карточками — «В классе» и «Самостоятельно». Вопрос не задаётся повторно после перезапуска.

ST-002. Самостоятельный режим — создание карточки ученика

Приоритет: P1 Предусловия: режим «Самостоятельно» выбран Шаги:

Ожидаемый результат: карточка создана и появляется в списке группы.

ST-003. PIN короче 4 цифр отклоняется

Приоритет: P1 Шаги:

Ожидаемый результат: «PIN — это ровно четыре цифры. Допиши его или оставь поле пустым.» Карточка не создаётся (регрессия на Д-6 — раньше короткий PIN молча отбрасывался).

ST-004. Пустое имя отклоняется

Приоритет: P2 Шаги:

Ожидаемый результат: «Напиши имя и фамилию — без них карточку не создать.»

ST-005. Карточка без PIN — вход без запроса пароля

Приоритет: P2 Шаги:

Ожидаемый результат: сразу экран выбора робота, PIN не запрашивается — это штатное поведение, не баг.

ST-006. Неверный PIN — визуальная обратная связь и выход

Приоритет: P1 Предусловия: карточка с PIN Шаги:

Ожидаемый результат: точки поля ввода краснеют, «Неверный PIN-код, попробуй ещё раз»; после шага 2 — возврат к выбору карточек (не тупик).

ST-007. Замедление после серии неверных PIN, без вечной блокировки

Приоритет: P2 Шаги:

Ожидаемый результат: между попытками растёт задержка; профиль не блокируется насмерть.

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 — устройство только что переведено в самостоятельный режим Шаги:

Ожидаемый результат: проект, сделанный до перехода, у учителя есть — работа урока не теряется, она досылается в момент разрыва. Проект, созданный после перехода, у учителя не появляется ни сразу, ни после перезапуска обоих приложений.

Была ошибка (до D-123): «Новый проект4», созданный уже в самостоятельном режиме, приезжал учителю — пуш работ гейтился только на состоянии соединения и про режим устройства ничего не знал.

ST-012. Повреждённая локальная база — карантин и восстановление

Приоритет: P2 Предусловия: приложение закрыто Шаги:

Ожидаемый результат: диалог «Локальная база данных повреждена или недоступна»; после «Начать заново» — чистая база, вопрос о режиме задаётся снова; повреждённый файл не удалён, путь к нему назван в сообщении.


2. Редактор Blockly

ST-013. Новая программа — выбор режима при первом создании

Приоритет: P1 Предусловия: ни одного проекта ещё не создавалось на этом устройстве Шаги:

Ожидаемый результат: диалог выбора «Блоки» / «Python», без рекламных слоганов.

ST-014. Новая программа — запоминает последний выбранный режим

Приоритет: P3 Предусловия: хотя бы одна программа уже создавалась в режиме «Блоки» Шаги:

Ожидаемый результат: диалог выбора не показывается повторно — сразу открывается редактор блоков.

ST-015. Сборка простой программы и live-предпросмотр Python

Приоритет: P1 Шаги:

Ожидаемый результат: справа в панели предпросмотра сразу появляется соответствующий Python-код; код обновляется при каждом изменении блоков.

ST-016. Валидация — пустая программа

Приоритет: P2 Шаги:

Ожидаемый результат: «Программа пустая — добавь блоки на рабочее поле»; запуск не начинается.

ST-017. Валидация — пустой блок «когда программа запущена»

Приоритет: P2 Шаги:

Ожидаемый результат: «Добавь хотя бы одну команду внутрь блока «когда программа запущена»».

ST-018. Валидация — блоки движения без «настройки колёс»

Приоритет: P2 Шаги:

Ожидаемый результат: ошибка «Команды движения не работают без блока «настройка колёс»» — запуск блокируется, а не молча игнорирует блоки.

ST-019. Предупреждение о «повисших» блоках

Приоритет: P3 Шаги:

Ожидаемый результат: предупреждение «блок лежит в стороне и не выполнится»; программа всё же запускается (это предупреждение, не ошибка).

ST-020. Автосохранение и восстановление после ухода с экрана

Приоритет: P1 Шаги:

Ожидаемый результат: программа на месте; в списке проектов ровно один проект (не создался дубль).


3. Редактор Python

ST-022. Переключение в Python — предупреждение о необратимости

Приоритет: P1 Предусловия: проект в режиме «Блоки» Шаги:

Ожидаемый результат: появляется диалог «Реши, что делать с изменениями в Python — иначе запустятся блоки» с вариантами подтвердить/отменить/вернуться к блокам.

ST-023. Отмена перехода в Python — правка не пропадает

Приоритет: P2 Шаги:

Ожидаемый результат: диалог закрывается, но набранный текст остаётся видимым в редакторе (не откатывается); следующее нажатие клавиши снова открывает диалог.

ST-024. Явный откат к блокам

Приоритет: P2 Шаги:

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

ST-025. Подтверждение перехода — необратимая смена режима

Приоритет: P1 Шаги:

Ожидаемый результат: «Блоки» видимо недоступны с подписью «Проект переведён в Python — блоки недоступны»; редактор блоков больше не редактируется для этого проекта (D-046).

ST-026. Автосохранение Python-кода

Приоритет: P2 Предусловия: проект уже в режиме Python Шаги:

Ожидаемый результат: последняя правка сохранена.

ST-027. time.sleep() вместе с движением — честное предупреждение перед запуском

Приоритет: P2 Предусловия: проект в режиме Python Шаги:

Ожидаемый результат:

ST-028. Синтаксическая ошибка Python подсвечивается построчно

Приоритет: P2 Шаги:

Ожидаемый результат: «❌ Ошибка в коде, строка N: …», запуск не начинается; номер строки соответствует реальной строке с ошибкой.

ST-029. Смена активного проекта не смешивает Python-код разных проектов

Приоритет: P2 Шаги:

Ожидаемый результат: код проекта А не изменился и не смешался с кодом проекта Б.

ST-020a. Программа на Python не исчезает при выходе из мастерской

Приоритет: P1 Предусловия: любой режим устройства Шаги:

Ожидаемый результат: программа в списке; открывается, код на месте. То же самое после перезапуска приложения.

Была ошибка (до 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-сети/хотспоте, приложение робота запущено Шаги:

Ожидаемый результат: робот подключается без запроса кода сопряжения; статус меняется на «Подключено».

ST-033. Подключение по Bluetooth-эфиру, несопряжённый телефон (реальный робот)

Приоритет: P1 Предусловия: сети нет, телефон в режиме видимости Bluetooth, ранее не был сопряжён Шаги:

Ожидаемый результат: код показан на обоих устройствах и совпадает; после подтверждения на телефоне — «Подключено» на ноутбуке.

ST-034. Повторное подключение к уже сопряжённому телефону (реальный робот)

Приоритет: P2 Предусловия: телефон уже был сопряжён ранее Шаги:

Ожидаемый результат: подключение без повторного запроса кода на телефоне (OQ-049 — известный риск, отдельно отмеченный в проекте; если канал не открывается — это подтверждение известного открытого вопроса, зафиксировать явно).

ST-035. Подключение через список последовательных портов (реальный робот)

Приоритет: P3 Шаги:

Ожидаемый результат: известное устройство подписано «известное устройство», незнакомый порт — «выбери вручную, если это робот»; подключение проходит либо явно завершается ошибкой.

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 Шаги:

Ожидаемый результат: инструкция переключается на выбранный случай, счётчик шагов сбрасывается на первый шаг.

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 Шаги:

Ожидаемый результат: программа выполняется полностью и завершается штатно (ok), несмотря на отсутствие модуля.

ST-051. «Проверить работу» до первого запуска — запускает программу и сама показывает итог

Приоритет: P2 Предусловия: урок с автопроверкой, программа ещё ни разу не запускалась, виртуальный робот Шаги:

Ожидаемый результат: программа запускается; когда она доезжает до конца, карточка «Задание засчитано» / «Задание не засчитано» появляется сама, второй клик не нужен. Пока программа едет, подсказка кнопки — «Идёт проверка…», повторный клик ничего не запускает.

ST-052. Слишком большой Python-код отклоняется до отправки

Приоритет: P3 Предусловия: проект в режиме Python Шаги:

Ожидаемый результат: приложение отказывает локально с понятным сообщением «Программа слишком большая (… байт, максимум 131072 байт)», не дожидаясь ответа от телефона.

ST-055. Остановка при отсутствии активного запуска — не ошибка

Приоритет: P3 Шаги:

Ожидаемый результат: нет сообщения об ошибке «нечего останавливать»; UI ведёт себя корректно, без зависаний.

ST-056. «Виртуальный робот» — запуск без физического железа

Приоритет: P1 Предусловия: робот не подключён, выбран «Виртуальный робот» Шаги:

Ожидаемый результат: программа выполняется на встроенном эмуляторе, телеметрия и остановка работают так же, как с реальным роботом (тот же UI, та же панель).

ST-057. «Программа выполняется» на странице «Робот» отражает реальное состояние

Приоритет: P3 Предусловия: робот подключён Шаги:

Ожидаемый результат: строка «Программа: выполняется»; после завершения/остановки — «не запущена».


6. Телеметрия и вывод print

ST-058. Живая телеметрия во время движения (реальный робот)

Приоритет: P1 Шаги:

Ожидаемый результат: значения (скорость, положение и т.п.) обновляются в реальном времени, без заметного запаздывания больше секунды.

ST-059. print() появляется в консоли построчно и без потерь

Приоритет: P1 Шаги:

Ожидаемый результат: все строки появляются в консоли в правильном порядке; счётчик непрочитанного растёт, пока консоль свёрнута.

ST-060. Индикатор непрочитанных сообщений в свёрнутой консоли

Приоритет: P3 Шаги:

Ожидаемый результат: на кнопке консоли появляется бейдж-счётчик; при ошибке бейдж окрашен как «есть ошибка» (иным цветом/классом).

ST-061. Печать без завершающего перевода строки не теряется и не ломает разбор

Приоритет: P3 Предусловия: проект в режиме Python Шаги:

Ожидаемый результат: обе части выводятся корректно (сцепленно или раздельно, но без потери текста и без лишних переносов строк, которых не было в программе).

ST-062. NO SIGNAL после потери сигнала телеметрии (реальный робот)

Приоритет: P2 Предусловия: робот подключён, идёт телеметрия Шаги:

Ожидаемый результат: индикатор «нет сигнала» появляется не раньше ~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 мм (пример из редактора учителя), виртуальный робот Шаги:

Ожидаемый результат: 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 Шаги:

Ожидаемый результат: «Ошибка отступов. Проверь пробелы в начале строк.»

ST-067. NameError → «Переменная не определена»

Приоритет: P2 Шаги:

Ожидаемый результат: «Переменная не определена. Проверь название.»

ST-068. ZeroDivisionError → «Деление на ноль»

Приоритет: P2 Шаги:

Ожидаемый результат: «Деление на ноль.»

ST-069. AttributeError → «У объекта нет такого метода или свойства»

Приоритет: P3 Шаги:

Ожидаемый результат: «У объекта нет такого метода или свойства.»

ST-070. Исключения rubrick.py показываются на русском без переупаковки

Приоритет: P1 Предусловия: удалось вызвать собственное исключение библиотеки rubrick.py (например, попытка команды движения при заблокированном модуле/аварии) Шаги:

Ожидаемый результат: показанное сообщение — уже готовая русская фраза библиотеки, показанная дословно, без прогона через таблицу общих ошибок (протокол требует именно verbatim-показ, когда exc.rubrick == true).

ST-071. Неизвестный тип исключения — общий запасной вариант

Приоритет: P3 Шаги:

Ожидаемый результат: запасное сообщение вида «❌ Ошибка: <последняя строка трассировки>», а не пустой экран или необработанное состояние.

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, например 192.168.1.20:50506».

ST-086. Смена отпечатка сервера — предупреждение о подмене

Приоритет: P1 Предусловия: устройство уже было сопряжено; сервер переустановлен с новым сертификатом (или эмулировать иначе, если возможно на стенде) Шаги:

Ожидаемый результат: полноэкранное предупреждение «Приложение учителя ответило другим отпечатком безопасности…», короткие формы «было/сейчас», без опции «доверять всё равно» и без показа полного отпечатка; текст рекомендует позвать учителя.

ST-087. Отвязка от учителя — подтверждение в два клика

Приоритет: P2 Предусловия: устройство сопряжено Шаги:

Ожидаемый результат: первый клик только показывает подтверждение («Точно отвязаться?»); отвязка происходит только после явного второго клика.

ST-088. Учитель отозвал доступ устройства

Приоритет: P2 Предусловия: teacher-app отозвал токен этого устройства Шаги:

Ожидаемый результат: «Учитель отозвал доступ этого устройства» + кнопка «Попробовать сопрячься заново».

ST-089. Заморозка (freeze) от учителя во время работы

Приоритет: P1 Предусловия: ученик работает в мастерской, есть запущенная программа Шаги:

Ожидаемый результат: полноэкранная панель «Учитель приостановил работу» с обратным отсчётом (если задан срок); активная программа на роботе останавливается до появления панели.

ST-090. Автоматическое снятие заморозки по таймауту

Приоритет: P3 Предусловия: заморозка активна, учитель недостижим 30+ минут (или ускоренный тестовый таймаут, если есть) Шаги:

Ожидаемый результат: заморозка снимается сама; всплывает уведомление об истечении.

ST-091. Блокировка ученика (student_lock) — возврат к выбору карточки

Приоритет: P2 Предусловия: учитель блокирует конкретного ученика Шаги:

Ожидаемый результат: «Твой профиль заблокирован учителем» и строка «Причина: Контрольная» на панели и после возврата к выбору карточки внутри своей группы (не к общему списку групп). Причина блокировки ученика видна только этому ребёнку: другой ученик, нажавший ту же карточку, видит заблокированную карточку без причины; экран PIN для заблокированной карточки не открывается; после возврата назад или нового входа на экран выбора причины нет. Блокировка без причины работает как раньше, строки «Причина» нет.

ST-092. Блокировка класса (class_lock) — возврат к списку групп

Приоритет: P2 Шаги:

Ожидаемый результат: «Твоя группа заблокирована учителем» и «Причина: Обед» на панели и затем на списке групп. У одноклассника на карточке и на экране PIN тоже «Причина: Обед». После включения Wi-Fi блокировка доходит вместе с обновлением класса, и причина видна на списке групп и на карточках. Блокировка без причины работает как раньше. После разблокировки строки «Причина» нет.

ST-093. Учитель офлайн — индикатор синхронизации честно показывает разрыв, урок не прерывается

Приоритет: P1 Предусловия: устройство сопряжено и синхронизировано Шаги:

Ожидаемый результат: через несколько секунд статус меняется на «сопряжено, нет связи»; текст в настройках согласован с индикатором в шапке; текущий урок/программа не прерывается.

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 Шаги:

Ожидаемый результат: проект перемещён в папку; список группируется по папкам, «без папки» — отдельная группа сверху.

ST-100. Сортировка списка проектов

Приоритет: P3 Шаги:

Ожидаемый результат: порядок списка меняется корректно в обоих режимах.

ST-101. Импорт курса файлом (флешка = файл с флешки)

Приоритет: P3 Предусловия: на учителе доступен пакет курса на внешнем носителе Шаги:

Ожидаемый результат: курс доходит до ученика тем же путём, что и обычная синхронизация — отдельного «USB-режима» на ученике не требуется.


11. Обновления приложения

ST-102. Проверка обновлений — «установлена последняя версия»

Приоритет: P2 Предусловия: установлена актуальная версия Шаги:

Ожидаемый результат: «Установлена последняя версия.», ниже — строка «Проверено в ЧЧ:ММ» с текущим временем; на время работы кнопка подписана «Проверяем…».

ST-102a. На самостоятельном устройстве проверка объясняет себя и предлагает файл

Приоритет: P2 Предусловия: самостоятельный режим (D-123), устройство не сопряжено с учителем, адрес портала не задан Шаги:

Ожидаемый результат: «Обновления недоступны: приложение не подключено к учителю, а адрес портала не задан — обновление можно поставить из файла». Фразы «ни один источник обновлений не ответил» нет: спрашивать было некого, и это штатное состояние ноутбука, унесённого домой, а не поломка. Про отсутствующий интернет тоже не пишем — он ни при чём. После повторного нажатия время в строке «Проверено в …» меняется, даже если само сообщение осталось прежним.

Была ошибка (до D-125): сообщение говорило про молчащие источники, а повторное нажатие не меняло на экране ничего — тот же дефект, который QA нашла в панели учителя.

ST-103. Доступно обновление — скачивание и установка раздельны

Приоритет: P1 Предусловия: доступна более новая версия Шаги:

Ожидаемый результат: скачивание показывает прогресс в процентах; после скачивания статус «готово» с подсказкой по установке; установка запускается отдельным явным кликом, не автоматически сразу после скачивания.

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 Шаги:

Ожидаемый результат: нет диалогов вида «нет подключения к интернету»; отсутствие интернета — норма продукта, не сбой (см. «Что НЕ является багом» в TESTER-GUIDE.md).

ST-110. Работа с реальным роботом полностью офлайн (без учителя и без интернета)

Приоритет: P1 Предусловия: реальный робот, ни teacher-app, ни интернет недоступны Шаги:

Ожидаемый результат: программа выполняется на реальном железе так же, как при наличии сети — BT-путь к роботу не зависит ни от LAN, ни от интернета (D-086).

ST-111. Возврат сети/учителя после автономной работы — синхронизация без потерь

Приоритет: P2 Предусловия: ученик поработал офлайн, накопил проекты/прогресс Шаги:

Ожидаемый результат: накопленные локально проекты и прогресс не теряются и (если применимо) доезжают до учителя при следующей синхронизации.

ST-112. Индикатор синхронизации в шапке приложения честен в офлайне

Приоритет: P3 Шаги:

Ожидаемый результат: индикатор синхронизации в шапке не утверждает ложного «синхронизировано»; текст согласован с тем, что видно в «Настройки → Синхронизация».


13. Отказоустойчивость: реальное железо

Раздел целиком требует физического робота. Каждый кейс моделирует реальный сбой, который случится на школьном уроке.

ST-113. Обрыв Bluetooth во время выполнения программы (реальный робот)

Приоритет: P1 Предусловия: робот подключён, идёт выполнение программы с движением Шаги:

Ожидаемый результат: UI отражает разрыв связи (статус меняется на «Переподключение…» или «Не подключено»); программа на телефоне не обрывается принудительно ноутбуком — по протоколу робот не должен замереть мгновенно посреди манёвра, но и не должен продолжать движение бесконечно (лиза непрерывного движения ограничивает его ~800 мс без keepalive).

ST-114. Переподключение после обрыва — повторное присоединение к запущенной программе

Приоритет: P1 Предусловия: ситуация из ST-113, программа на телефоне продолжает выполняться Шаги:

Ожидаемый результат: приложение переподключается и заново показывает статус текущего запуска (в том числе «выполняется», если программа ещё не закончилась) — без необходимости заново нажимать «Старт».

ST-115. Отключение телефона (выключение) во время выполнения (реальный робот)

Приоритет: P1 Шаги:

Ожидаемый результат: робот доканчивает текущее позиционное движение и останавливается (лиза), не продолжает крутиться бесконечно; ноутбук показывает потерю связи, не зависает и не выдаёт неинформативную ошибку.

ST-116. Отключение USB-кабеля модуля во время работы (реальный робот)

Приоритет: P1 Предусловия: телефон подключён к ноутбуку по BT, кабель телефон↔модуль на месте, программа запущена Шаги:

Ожидаемый результат: BT-канал к ноутбуку не рвётся сам по себе; следующая команда движения завершается понятной русской ошибкой (обрыв связи с модулем), а не тихим зависанием; статус связи с модулем на странице «Робот» отражает link: none.

ST-117. Восстановление USB-кабеля — работа продолжается без перезапуска приложений

Приоритет: P2 Предусловия: ситуация из ST-116 Шаги:

Ожидаемый результат: новая программа выполняется нормально без необходимости перезапускать приложение робота или переподключаться по BT заново.

ST-118. Разряженный/низкий заряд аккумулятора робота (реальный робот с низким зарядом)

Приоритет: P2 Предусловия: аккумулятор модуля разряжен близко к минимуму (готовится заранее) Шаги:

Ожидаемый результат: значение напряжения показано честно и низко; поведение при критически низком заряде не приводит к неожиданному/опасному поведению робота (либо документированно отказывает).

ST-119. Второй ученик пытается подключиться к тому же роботу во время урока

Приоритет: P2 Предусловия: реальный робот уже подключён к первому ноутбуку, второй телефон/ноутбук пробует тот же робот Шаги:

Ожидаемый результат: второй получает «Rubrick занят»; первое соединение и его текущий запуск не затронуты.

ST-120. Уход робота за пределы Bluetooth-радиуса и возврат (реальный робот, требуется место)

Приоритет: P2 Шаги:

Ожидаемый результат: аналогично 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 Шаги:

Ожидаемый результат: приложение запускается; если Gatekeeper блокирует — задокументированный обходной путь работает (например, через «Открыть» из контекстного меню).

ST-126. Разрешение сети на Windows для первого запуска

Приоритет: P1 Предусловия: первый запуск на «чистой» Windows-машине, требуется LAN-сопряжение с учителем Шаги:

Ожидаемый результат: после этого обнаружение учителя по сети работает; если поставить только «частные» — школьный Wi-Fi (обычно определяется как общественный) блокирует обнаружение без явной ошибки (известное ограничение, зафиксированное в TESTER-GUIDE.md).

ST-127. Bluetooth-разрешение на macOS — запрашивается один раз

Приоритет: P2 Шаги:

Ожидаемый результат: запрос показывается один раз; повторные поиски больше не спрашивают разрешение.

ST-128. Windows показывает два одинаковых пункта на один сопряжённый телефон

Приоритет: P2 Предусловия: сопряжение через параметры Windows (случай no-network-manual) Шаги:

Ожидаемый результат: возможно появление двух неотличимых записей на одно устройство (известный факт, отражённый в Connect Guide — ST-042); подключение срабатывает хотя бы через одну из них при переборе по очереди.

ST-129. Расположение файла базы данных различается по ОС

Приоритет: P3 Шаги:

Ожидаемый результат: файл существует по документированному для платформы пути; сценарии сброса базы (TESTER-GUIDE.md) работают на обеих ОС.

ST-130. Внешний вид (скругления, тема) одинаков на обеих ОС

Приоритет: P3 Шаги:

Ожидаемый результат: визуальных расхождений между macOS и Windows нет; на обеих ОС приложение светлое, включая Blockly и редактор Python.


Как сообщать о находках

См. «Часть 6. Как сообщать о находках» в ../TESTER-GUIDE.md — формат находки (ветка/кейс, шаги, ожидание, факт, скриншот, окружение) общий для обоих документов.