План тестирования модуля вычисления маршрутов (с пояснениями, коротко). Unit tests (цель — проверка отдельных функций) - Граф и структура данных: - создание/удаление узла/ребра; ожидание целостности. - тест на пустой граф, один узел, изолированные компоненты. - Алгоритмы поиска (Dijkstra, A*, Bellman‑Ford и т.п.): - простой граф 3–5 узлов, проверка корректного пути и стоимости. - граф с несколькими оптимальными путями → проверка допустимого выбора/детерминизма. - отрицательные веса (если поддерживаются) и детекция невозможности (если не поддерживаются). - восстановление пути (path reconstruction) при разных предках. - Оценочные функции (heuristics) для A*: - эвристика допустима (admissible) и согласована (consistent) на контролируемых примерах. - Вычисление стоимости маршрута: - штрафы за трафик, тип дороги, время суток; агрегирование весов. - Валидация входных данных и ошибки: - некорректные координаты, совпадающие точки, нулевые/бесконечные веса. - Кэш и мемоизация: - попадание/промах, инвалидирование кэша при обновлениях. - Граничные арифметические случаи: - переполнение, точность плавающей запятой, сравнение с эпсилон. Integration tests (цель — взаимодействие подсистем) - Парсер карт + граф: - корректная трансформация OSM/GeoJSON → внутренний граф. - Данные трафика + алгоритм: - при изменении трафика веса ребер обновляются и маршруты меняются ожидаемо. - Геокодер/регистр координат + поиск ближайших узлов (snap-to-road): - близлежащие точки, точки вне карты → fallback. - БД/репозитории + модуль: - чтение/запись маршрутов, кэширование, согласованность при рестарте. - Сервис маршрутизации + API слой: - форматы запросов/ответов, обработка параллельных запросов, таймауты. - Тесты на транзакции и откатом данных при ошибках. System / End‑to‑end тесты (цель — поведение системы в целом) - Пользовательский сценарий: запрос маршрута (точка A → B) → получение ответа, визуальная/логическая верификация. - Нагрузочное тестирование: - пиковая нагрузка, длительная стресс‑нагрузка. - Скейлинг: - добавление узлов/реплик сервисов, проверка SLA. - Резилиентность: - отказ компонента (БД, кеш, провайдер трафика) → корректные fallback‑поведения. - Multi‑modal и временные зависимости: - пересадки, расписания, временно-зависимые ребра. - Регрессии при обновлении карты/алгоритма: - контроль качества ключевых сценариев после релиза. - Тесты на согласованность версий карт и индексов. Edge cases (особое внимание, минимальный набор) - Геометрические крайности: - точки на полюсе, международной линии перемены дат (±180°), совпадающие координаты. - Нулевые/бесконечные/очень большие веса: - деление на ноль, overflow. - Графы с петлями и многократными ребрами. - Очень длинные/очень короткие маршруты (миллионы узлов / 1 ребро). - Отсутствие пути (disconnected graph). - Точки на границе карты/вне покрытия. - Конкурентный доступ: race conditions при обновлении путей. - Погрешности FP: сравнение расстояний с эпсилон. - Таймозависимые ребра: переход через границу времени (ночь/день). Метрики качества тестирования (формулы и рекомендуемые пороги) - Покрытие тестами: - statement coverage: Coveragestmt=executed statementstotal statements\text{Coverage}_{stmt} = \frac{\text{executed statements}}{\text{total statements}}Coveragestmt=total statementsexecuted statements (цель ≥80%\ge 80\%≥80%). - branch coverage: Coveragebranch\text{Coverage}_{branch}Coveragebranch (цель ≥70%\ge 70\%≥70%). - Проходимость тестов: - pass rate: PassRate=passed teststotal tests\text{PassRate} = \frac{\text{passed tests}}{\text{total tests}}PassRate=total testspassed tests. - Регрессии: - количество регрессионных багов на релиз. - Производительность: - латентность (мс) — процентные перцентили: p50, p90, p95, p99\mathrm{p}_{50},\ \mathrm{p}_{90},\ \mathrm{p}_{95},\ \mathrm{p}_{99}p50,p90,p95,p99. - пример целевых значений: p95≤300 ms, p99≤1000 ms\mathrm{p}_{95} \le 300\ \text{ms},\ \mathrm{p}_{99} \le 1000\ \text{ms}p95≤300ms,p99≤1000ms. -吞吐имость (throughput): запросов в секунду RPS\text{RPS}RPS. - Достоверность маршрута: - средний растяг (stretch): Stretch=calculated_costoptimal_cost\text{Stretch} = \frac{\text{calculated\_cost}}{\text{optimal\_cost}}Stretch=optimal_costcalculated_cost (целевой порог ≤1.05\le 1.05≤1.05). - процент корректных/ожидаемых маршрутов: correcttotal\frac{\text{correct}}{\text{total}}totalcorrect. - Надёжность/Доступность: - SLA availability: Availability≥99.9%\text{Availability} \ge 99.9\%Availability≥99.9%. - Ошибки и плотность дефектов: - defect density: DefectDensity=defectsKLOC\text{DefectDensity} = \frac{\text{defects}}{\text{KLOC}}DefectDensity=KLOCdefects. - Время реакции на инцидент: - MTTR (mean time to recovery): среднее время восстановления. - Валидация данных: - процент неконсистентных загрузок карты после импорта (должен стремиться к →0%\to 0\%→0%). Рекомендации по автоматизации и приоритетам - Автоматизировать unit + integration в CI с быстрым фидбеком. - Нагрузочные и E2E тесты в nightly/стейдж среде. - Фаззинг / property‑based тесты для генерации неожиданных графов. - Мутационное тестирование для оценки качества тестов. - Поддерживать набор "золотых" сценариев для регрессионного контроля. Если нужно, могу свернуть этот план в чек‑лист с приоритетами и конкретными тест кейсами (формат CSV/JSON).
Unit tests (цель — проверка отдельных функций)
- Граф и структура данных:
- создание/удаление узла/ребра; ожидание целостности.
- тест на пустой граф, один узел, изолированные компоненты.
- Алгоритмы поиска (Dijkstra, A*, Bellman‑Ford и т.п.):
- простой граф 3–5 узлов, проверка корректного пути и стоимости.
- граф с несколькими оптимальными путями → проверка допустимого выбора/детерминизма.
- отрицательные веса (если поддерживаются) и детекция невозможности (если не поддерживаются).
- восстановление пути (path reconstruction) при разных предках.
- Оценочные функции (heuristics) для A*:
- эвристика допустима (admissible) и согласована (consistent) на контролируемых примерах.
- Вычисление стоимости маршрута:
- штрафы за трафик, тип дороги, время суток; агрегирование весов.
- Валидация входных данных и ошибки:
- некорректные координаты, совпадающие точки, нулевые/бесконечные веса.
- Кэш и мемоизация:
- попадание/промах, инвалидирование кэша при обновлениях.
- Граничные арифметические случаи:
- переполнение, точность плавающей запятой, сравнение с эпсилон.
Integration tests (цель — взаимодействие подсистем)
- Парсер карт + граф:
- корректная трансформация OSM/GeoJSON → внутренний граф.
- Данные трафика + алгоритм:
- при изменении трафика веса ребер обновляются и маршруты меняются ожидаемо.
- Геокодер/регистр координат + поиск ближайших узлов (snap-to-road):
- близлежащие точки, точки вне карты → fallback.
- БД/репозитории + модуль:
- чтение/запись маршрутов, кэширование, согласованность при рестарте.
- Сервис маршрутизации + API слой:
- форматы запросов/ответов, обработка параллельных запросов, таймауты.
- Тесты на транзакции и откатом данных при ошибках.
System / End‑to‑end тесты (цель — поведение системы в целом)
- Пользовательский сценарий: запрос маршрута (точка A → B) → получение ответа, визуальная/логическая верификация.
- Нагрузочное тестирование:
- пиковая нагрузка, длительная стресс‑нагрузка.
- Скейлинг:
- добавление узлов/реплик сервисов, проверка SLA.
- Резилиентность:
- отказ компонента (БД, кеш, провайдер трафика) → корректные fallback‑поведения.
- Multi‑modal и временные зависимости:
- пересадки, расписания, временно-зависимые ребра.
- Регрессии при обновлении карты/алгоритма:
- контроль качества ключевых сценариев после релиза.
- Тесты на согласованность версий карт и индексов.
Edge cases (особое внимание, минимальный набор)
- Геометрические крайности:
- точки на полюсе, международной линии перемены дат (±180°), совпадающие координаты.
- Нулевые/бесконечные/очень большие веса:
- деление на ноль, overflow.
- Графы с петлями и многократными ребрами.
- Очень длинные/очень короткие маршруты (миллионы узлов / 1 ребро).
- Отсутствие пути (disconnected graph).
- Точки на границе карты/вне покрытия.
- Конкурентный доступ: race conditions при обновлении путей.
- Погрешности FP: сравнение расстояний с эпсилон.
- Таймозависимые ребра: переход через границу времени (ночь/день).
Метрики качества тестирования (формулы и рекомендуемые пороги)
- Покрытие тестами:
- statement coverage: Coveragestmt=executed statementstotal statements\text{Coverage}_{stmt} = \frac{\text{executed statements}}{\text{total statements}}Coveragestmt =total statementsexecuted statements (цель ≥80%\ge 80\%≥80%).
- branch coverage: Coveragebranch\text{Coverage}_{branch}Coveragebranch (цель ≥70%\ge 70\%≥70%).
- Проходимость тестов:
- pass rate: PassRate=passed teststotal tests\text{PassRate} = \frac{\text{passed tests}}{\text{total tests}}PassRate=total testspassed tests .
- Регрессии:
- количество регрессионных багов на релиз.
- Производительность:
- латентность (мс) — процентные перцентили: p50, p90, p95, p99\mathrm{p}_{50},\ \mathrm{p}_{90},\ \mathrm{p}_{95},\ \mathrm{p}_{99}p50 , p90 , p95 , p99 .
- пример целевых значений: p95≤300 ms, p99≤1000 ms\mathrm{p}_{95} \le 300\ \text{ms},\ \mathrm{p}_{99} \le 1000\ \text{ms}p95 ≤300 ms, p99 ≤1000 ms.
-吞吐имость (throughput): запросов в секунду RPS\text{RPS}RPS.
- Достоверность маршрута:
- средний растяг (stretch): Stretch=calculated_costoptimal_cost\text{Stretch} = \frac{\text{calculated\_cost}}{\text{optimal\_cost}}Stretch=optimal_costcalculated_cost (целевой порог ≤1.05\le 1.05≤1.05).
- процент корректных/ожидаемых маршрутов: correcttotal\frac{\text{correct}}{\text{total}}totalcorrect .
- Надёжность/Доступность:
- SLA availability: Availability≥99.9%\text{Availability} \ge 99.9\%Availability≥99.9%.
- Ошибки и плотность дефектов:
- defect density: DefectDensity=defectsKLOC\text{DefectDensity} = \frac{\text{defects}}{\text{KLOC}}DefectDensity=KLOCdefects .
- Время реакции на инцидент:
- MTTR (mean time to recovery): среднее время восстановления.
- Валидация данных:
- процент неконсистентных загрузок карты после импорта (должен стремиться к →0%\to 0\%→0%).
Рекомендации по автоматизации и приоритетам
- Автоматизировать unit + integration в CI с быстрым фидбеком.
- Нагрузочные и E2E тесты в nightly/стейдж среде.
- Фаззинг / property‑based тесты для генерации неожиданных графов.
- Мутационное тестирование для оценки качества тестов.
- Поддерживать набор "золотых" сценариев для регрессионного контроля.
Если нужно, могу свернуть этот план в чек‑лист с приоритетами и конкретными тест кейсами (формат CSV/JSON).