Skip to content

Кросс-проверка. Автотесты. #3

@ykrrop

Description

@ykrrop

Тема: Code Review: Автоматизированное тестирование сервиса межгалактической аналитики

Общая оценка: 90/100


✔️ Выполненные требования (с указанием начисленных баллов)

  1. Покрытие функциональных требований (38/40)

    • Составление тестовых сценариев для всех основных функций — 10/10
      В README и в самом коде чётко описаны сценарии для Generator, Uploader, History и навигации.

    • Реализация тестов для основных сценариев работы — 20/20
      — Generator: проверка рендера, блокировки кнопки, успешной генерации и запуска скачивания.
      — Uploader: проверка начального состояния, активации кнопки, отображения загрузки и прогресса.
      — History: отображение списка, кнопок управления, удаление и полная очистка.
      — Навигация в App: переходы между страницами.

    • Реализация тестов обработки ошибок — 8/10
      — Есть тест на ошибку в Generator.
      — Нет явного теста на ошибку при загрузке (Uploader) и нет негативных сценариев для History/API.

    Итого: 10 + 20 + 8 = 38/40

  2. Оптимальность тестовых решений (25/30)

    • Самый простой и быстрый способ проверки — 16/20
      — В целом используются моки (vi.mock) и jsdom, но во многих местах происходит рендер всей страницы вместо юнит-тестов отдельных функций.

    • Проверяет только заявленную функциональность — 5/5
      — Нет лишних ассёртов, каждый тест сфокусирован на одной вещи.

    • Отсутствие дублирования проверок — 4/5
      — Некоторая дубликация моков useTabStore и конфигураций в разных describe.

    Итого: 16 + 5 + 4 = 25/30

  3. Надёжность и стабильность тестов (17/20)

    • Стабильность при многократном запуске — 8/10
      — Используется cleanup и vi.clearAllMocks, но есть мелкие ошибки в синтаксисе некоторых асинхронных тестов (запятая вместо тела в async () =>), что может сломать раннер.

    • Изоляция тестов — 5/5
      — Каждый describe завершает cleanup, моки не «протекают».

    • Независимость от порядка выполнения — 4/5
      — В целом тесты независимы, но двойное мокаутирование одного и того же модуля в beforeEach + глобально может давать неожиданности в другом порядке.

    Итого: 8 + 5 + 4 = 17/20

  4. Читаемость и структура кода (10/10)

    • Названия тестов — 4/4
      — Чётко отражают проверяемый сценарий.

    • Названия переменных — 3/3
      — Используются понятные имена

    • Логичная группировка по функциональности — 3/3
      — Все тесты организованы в describe по компонентам/страницам.

    Итого: 10/10


❌ Пропущенные или некорректно реализованные пункты

  1. Обработка ошибок в Uploader (–2 балла)

    • Нет теста на ситуацию, когда aggregatedDataReader (или API) выдаёт исключение: нужно проверить, что в UI отображается сообщение об ошибке.
  2. Негативные сценарии для History/API (–2 балла)

    • Не протестирована ситуация, когда чтение истории из localStorage (через useHistoryStore) возвращает пустой объект или падает — должен быть отдельный сценарий.
  3. Некорректный синтаксис в некоторых тестах Uploader (может сломать раннер)

     test("при загрузке файла интерфейс обновляется"),   async () => { /* ... */ }

    Нужно убрать лишнюю запятую перед async.


💡 Рекомендации по улучшению

  1. Добавить негативные тесты для Uploader и History
    — Смоделировать vi.mock так, чтобы aggregatedDataReader возвращал Promise.reject(), и проверить, что компонент показывает ошибку.
    — Для History — тест на пустой список: UI не падает и выводит «Нет истории».

  2. Упростить некоторые тесты до unit-уровня
    — Вместо полного рендера App с MemoryRouter для проверки навигации можно протестировать логику в отдельном Navbar через рендер только этой компоненты и проверку setActiveTab.

  3. Консолидировать моки
    — Вынести общие vi.mock("../src/store/TabStore.js", ...) и прочие моки в отдельный файл setupTests.js, подключаемый в vitest.config.js через setupFiles, чтобы не дублировать их в каждом describe.

  4. Исправить синтаксические опечатки
    — Проверь все async () => тесты и убери лишние запятые, чтобы вся тестовая база могла запускаться без ошибок.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions