test: less fragile - use semantic locators\helpers

This commit is contained in:
2026-09-25 17:40:58 +05:00
parent 16d4288912
commit 5313567e70
26 changed files with 436 additions and 274 deletions
+6 -5
View File
@@ -20,13 +20,14 @@
| `AGENTS.md` | Краткий обязательный контракт для агента | active |
| `docs/plan-codebase-quality.md` | План quality gates, тестов и lint-правил | draft |
| `docs/agent-workflow.md` | Подробный порядок исследования, изменения и проверки | active |
| `docs/testing-strategy.md` | Locator, fixture, i18n и fixme-policy для e2e | active |
| `docs/quality-gates.md` | Команды проверки, warnings и CI | active |
| `docs/backlog.md` | Продуктовые, UX- и инфраструктурные задачи | active |
| `docs/roadmap.md` | Общие направления развития | active |
| `docs/plan-redesign.md` | Новый дизайн production UI | active |
| `docs/plan-seo.md` | SEO/GEO-план | active |
| `docs/plan-platform.md` | PWA/API/WASM-план | active |
| `docs/checklist-manual-testing.md` | Ручная приёмка preview | active |
| `docs/checklist-manual-testing.md` | Ручная приёмка production UI | active |
| `docs/tools-map.md` | Живая карта инструментов | active |
| `web/eslint-plugins/README.md` | Детали custom lint rules и token policy | active |
| `docs/archive/README.md` | Правила архивирования и удаления старых документов | active |
@@ -50,17 +51,17 @@
только если темы нет в существующем документе; иначе обновляется источник
истины.
## Текущий baseline Q3
## Текущий baseline Q4
На момент фиксации Q3:
На момент фиксации Q4:
- production registry содержит 122 инструмента;
- `pnpm --dir web check` проходит без ошибок и предупреждений;
- `pnpm --dir web test` — 39 test files / 422 tests;
- `pnpm --dir web test` — 39 test files / 425 tests;
- `pnpm --dir web test:rules` — 4 test files / 74 tests;
- `pnpm --dir web lint:all` — 0 errors и 0 i18n warnings; остаются 4 unused
design tokens от token audit;
- `pnpm verify` проходит; production E2E — 105 passed, 5 skipped.
- `pnpm verify` проходит; production E2E — 105 passed, 4 skipped.
Baseline и следующий шаг поддерживаются в `docs/plan-codebase-quality.md`.
+4 -1
View File
@@ -54,6 +54,9 @@ E2E запускается отдельно от быстрых проверок
- Поведенческий тест проверяет пользовательский контракт, а не текущую
реализацию.
- Сначала предпочитать `role`, `aria-*`, label, stable id или href.
- `data-testid` ограничен source/result/verdict/empty-state; общие
locator-паттерны собраны в `web/e2e/helpers/page.ts`, policy — в
`docs/testing-strategy.md`.
- `data-testid` использовать только там, где семантического locator нет.
- Не фиксировать абсолютное число инструментов, если проверка не связана с этим
инвариантом.
@@ -72,7 +75,7 @@ E2E запускается отдельно от быстрых проверок
- обязательное поведение агента — `AGENTS.md`;
- индекс и карта документов — `docs/README.md`;
- качество и точные команды — `docs/quality-gates.md`;
- тестовая архитектура — `docs/testing-strategy.md` после Q4;
- тестовая архитектура — `docs/testing-strategy.md`;
- lint implementation — `web/eslint-plugins/README.md`;
- продуктовые решения — backlog и активные планы.
+1 -4
View File
@@ -132,10 +132,7 @@
`resizeSize: "Width and/or height must be positive"`). Проверяется на
resize-png / crop-png. Ожидание: человекочитаемое сообщение на текущем языке.
Fixme: `web/e2e/known-issues.spec.ts` (тест «error message localized»).
5. **Theme storage key в e2e устарел** — production использует ключ `theme`, а
`web/e2e/navigation.spec.ts:30-48` проверяет `easy-png-tools:theme`.
Ожидание: исправить тест на фактический контракт и снять `test.fixme`.
6. **Reset и auto-run требуют решения** — `pipeline.spec.ts:55-63` ожидает
5. **Reset и auto-run требуют решения** — `pipeline.spec.ts:55-63` ожидает
очистку результата, но текущий `SchemaToolView.svelte:162-173` может сразу
перезапустить обработку. Нужно определить семантику Reset, затем исправить
тест и снять `test.fixme`.
+7 -10
View File
@@ -1,13 +1,13 @@
# Чек-лист ручного тестирования preview
# Чек-лист ручного тестирования production UI
> Вспомогательный документ к `docs/archive/plan-testing-preview.md` и e2e-тестам
> (`web/e2e/`, `pnpm --dir web test:e2e`). Автоматизированная часть закрывает
> Вспомогательный документ к e2e-тестам (`web/e2e/`, `pnpm --dir web test:e2e`)
> и стратегии `docs/testing-strategy.md`. Автоматизированная часть закрывает
> «нет падений/ошибок»; здесь — то, что руками, и что Playwright не покрывает.
>
> Перед прогоном: `pnpm --dir web build`, поднять локально `web/` (dev или build
> → `node scripts/serve-static.mjs`).
>
> Критерий приёмки большинства пунктов: **нет зависит, нет «залипания»,
> Критерий приёмки большинства пунктов: **нет зависаний, нет «залипания»,
> сообщения об ошибках человекочитаемые**.
## A. Краевые PNG-файлы
@@ -23,8 +23,8 @@
- [ ] Анимированный/APNG, если попадётся — не ломает конвейер.
- [ ] Повреждённый/не-PNG файл — понятная ошибка, нет краша (авто-чека в
pipeline.spec.ts).
- [ ] PNG с битой CRCh / 16-bit — как ведут себя анализаторы (ориентация,
размер, прозрачность).
- [ ] PNG с битой CRC / 16-bit — как ведут себя анализаторы (ориентация, размер,
прозрачность).
### Файлы (`tests/fixtures/manual-edge-cases/`)
@@ -59,8 +59,7 @@
красного alert-текста в виде `errors.*`.
- [ ] Невалидные цвета в плашках/градиентах (мисс-спелл `#xyz`, короткие hex,
именные цвета) — silent repair или понятная ошибка.
- [ ] Пустой text-source на text-инструменте — run пропускается, ошибок нет
(кейс из плана п.14).
- [ ] Пустой text-source на text-инструменте — run пропускается, ошибок нет.
- [ ] Смена параметра после Reset — авто-перезапуск работает (Debounce 200 мс).
## C. Буфер обмена и drag-n-drop
@@ -111,8 +110,6 @@
alert. `docs/backlog.md`, `web/e2e/known-issues.spec.ts`.
- [ ] **Локализация ошибок:** получить человекочитаемое сообщение на текущем
языке вместо сырого i18n-ключа. `docs/backlog.md`, `web/e2e/i18n.spec.ts`.
- [ ] **Theme persistence:** переключить тему и проверить сохранение в ключе
`theme`. `docs/backlog.md`, `web/e2e/navigation.spec.ts`.
- [ ] **Reset/auto-run:** проверить выбранную семантику Reset и автоматический
перезапуск после изменения параметров. `docs/backlog.md`,
`web/e2e/pipeline.spec.ts`.
+25 -31
View File
@@ -1,9 +1,9 @@
# План: линтеры, тесты и качество кодовой базы
> Статус: **draft — Q0–Q3 готовы к ревью; Q4 — следующий этап**.
> Статус: **draft — Q0–Q4 готовы к ревью; Q5 — следующий этап**.
>
> Источник: `docs/backlog.md`, аудит конфигурации `web/`, e2e-тестов и
> инфраструктурных скриптов. Q0–Q3 выполнены; Q4–Q8 выполняются отдельными
> инфраструктурных скриптов. Q0–Q4 выполнены; Q5–Q8 выполняются отдельными
> атомарными шагами.
>
> Цель: сделать качество кодовой базы воспроизводимым, убрать ложную «зелёность»
@@ -152,36 +152,30 @@ pnpm --dir web test:e2e
- Проверены production build, verify и отдельный E2E smoke production-маршрутов.
**Результат:** `/v1/**`, UI-v1-файлы и legacy-конфигурация отсутствуют;
следующий этап — Q4.
следующий этап — Q5.
### Q4. Тестовый контракт e2e
**Оценка:** M. **Зависимости:** Q0–Q3, решение по i18n и генераторам.
**Статус:** выполнен. **Проверено:** `pnpm verify` и полный Playwright smoke
проходят; 105 тестов passed, 4 known-issue теста skipped. **Оценка:** M.
**Зависимости:** Q0–Q3.
- Основной locator: `role`, `aria-*`, `getByLabel`, stable `id`/`href`.
- `data-testid` использовать только там, где семантического API недостаточно:
source, result, empty-state, download.
- Убрать зависимость от:
- абсолютных чисел `TOTAL`/`GROUPS`;
- точного количества fuzzy-search результатов;
- внутренних CSS-классов;
- `img[alt="Result image"]`;
- полных локализованных предложений.
- Для каталога проверять конкретные инструменты и согласованность отображённых
карточек общему числу, а не фиксированное число `122`.
- Централизовать helpers для открытия инструмента, загрузки, результата, ошибки
и download.
- Зафиксировать locator/i18n/fixture/fixme-политику в
`docs/testing-strategy.md`; детали конкретных тестов оставлять рядом с ними.
- В unit-тестах проверять ключи через `t()` и i18n helpers. В e2e проверять
поведение и отдельный i18n smoke; `data-i18n-key` добавлять только при
реальной необходимости тестировать ключ в DOM.
- Убрать нестандартные символы из поведенческих ожиданий (`→`, длинные тире,
`×`); названия тестов не переписывать механически без необходимости.
- Исправить stale-проверки темы, source-locator и locale assertions.
- Добавлен `docs/testing-strategy.md` с locator, fixture, i18n и `test.fixme`
policy.
- В production markup добавлены только разрешённые hooks для source/result/
verdict/empty-state; текстовые элементы получили accessible labels, фильтры —
`aria-pressed`, а каталог — семантические heading/status landmarks.
- E2E переведён на `role`, label и stable `href`; удалены `TOTAL`/`GROUPS`,
exact fuzzy counts, internal CSS selectors, `alt`-locators и полные verdict
strings. Точные verdict-переводы перенесены в unit-тесты.
- Helpers централизованы в `web/e2e/helpers/page.ts`; исправлены stale
theme/source/locale checks. Theme fixme снят.
- Q5-фиксы resize/crop, generator, Reset и error-сценария не смешивались с этим
этапом.
**Готово, когда:** изменение формулировки, класса или порядка элементов не
ломает поведенческий тест без изменения пользовательского контракта.
**Результат:** изменение формулировки, класса или порядка элементов не ломает
поведенческий тест без изменения пользовательского контракта; следующий этап —
Q5.
### Q5. Закрыть известные preview-баги
@@ -379,9 +373,9 @@ refactor, новые i18n-правила и исправление продук
## 7. Решения, которые нужно принять на ревью
- Какие semantic locators и допустимые `data-testid` закрепить в Q4?
- Какие browser/e2e проверки должны быть обязательными для PR, а какие —
отдельным ночным прогоном?
- Какой default выбрать для `resize-png` и `crop-png` при загрузке?
- Подтверждаем ли auto-run генераторов без кнопки Generate?
- Что именно должен делать Reset при включённом auto-run?
- Какие i18n-сценарии проверяются в e2e, а какие остаются unit-проверками?
- Какой независимый invalid-input сценарий заменит resize-dependent error test?
- Какие browser/e2e проверки должны быть обязательными для PR, а какие —
отдельным ночным прогоном?
+2 -1
View File
@@ -27,7 +27,8 @@ pnpm verify
## E2E
E2E не входит в `verify`, потому что Playwright поднимает build и статический
сервер:
сервер. Locator, fixture, i18n и `test.fixme`-политика описаны в
`docs/testing-strategy.md`:
```text
pnpm --dir web test:e2e
+87
View File
@@ -0,0 +1,87 @@
# Стратегия e2e-тестирования
> Статус: **active**. Канонические правила для `web/e2e/`; продуктовые решения и
> известные баги остаются в `docs/backlog.md` и
> `docs/checklist-manual-testing.md`.
## 1. Что проверяем
E2E проверяет пользовательский контракт production UI: открытие маршрута,
доступность элемента, загрузку или ввод данных, появление результата, ошибку,
скачивание и переключение локали. Внутренняя реализация, порядок карточек,
CSS-классы и конкретный формат временного URL не являются контрактом.
Точные переводы проверяются в unit-тестах i18n. В e2e проверяется поведение и
отдельный RU/EN smoke, а не полный локализованный текст каждого verdict.
## 2. Приоритет locator-ов
1. `getByRole()` с доступным именем и `getByLabel()`.
2. Стабильные `href` или `id`, если семантического API нет.
3. Разрешённые `data-testid` только для визуальных границ, которые нельзя
надёжно назвать через accessibility API:
- `source-image`;
- `result-image`;
- `result-verdict`;
- `empty-state`.
4. `input[type="file"]` и download-button допускаются только внутри
`web/e2e/helpers/page.ts`.
Нельзя добавлять `data-testid` для счётчиков, групп, metadata, verdict текста,
кнопок темы или переключателя языка без отдельного обоснования.
## 3. Запрещённые зависимости
В e2e не фиксируются:
- абсолютные `TOTAL`, `GROUPS` и другие snapshot-числа каталога;
- точное число fuzzy-search результатов или порядок карточек;
- внутренние CSS-классы и HTML-структура, если есть role/label/href;
- `alt` как способ найти результат или источник;
- полные локализованные предложения и длинные тире в ожиданиях;
- локализованные имена контролов в общих сценариях без явной установки `en`.
Поведенческий тест может проверять, что известный инструмент видим или скрыт,
ошибка имеет текст и не является сырым i18n-ключом, результат доступен для
скачивания. Это не требует повторять словарь в e2e.
## 4. Локаль и fixtures
Обычные сценарии запускаются с `en` через `useEnglish()` или `openTool()`. RU/EN
проверяется отдельным `i18n.spec.ts`; после смены локали locator не должен
зависеть от старого accessible name.
Изображения создаются воспроизводимыми helpers в `web/e2e/helpers/fixtures.ts`.
Тесты не добавляют большие бинарные файлы и не зависят от локальных
пользовательских файлов. `toPass()` допускается только для ограниченного
ожидания hydration или асинхронного результата; он не должен превращать проверку
продукта в бесконечный retry.
## 5. Helpers и `test.fixme`
`web/e2e/helpers/page.ts` владеет общими операциями `openTool`, `uploadImage`,
`resultImage`, `sourceImage`, `verdictStatus`, `textResult`, `errorAlert`,
`emptyState`, `rangeInput` и `downloadResult`. Специфика должна вызывать эти
helpers, а не повторять raw-селекторы.
`test.fixme` допускается только для зарегистрированной проблемы в backlog или
checklist. В комментарии указывается ссылка на неё; Q4 не исправляет продуктовое
поведение. После исправления тест и ссылка обновляются вместе.
## 6. Проверки
Для изменений e2e выполняются:
```text
pnpm --dir web check
pnpm --dir web test:rules
pnpm --dir web lint:all
pnpm --dir web exec prettier --check .
pnpm check:docs
pnpm --dir web test:e2e
pnpm verify
```
`verify` не включает Playwright: E2E остаётся отдельным тяжёлым gate. В CI
non-blocking E2E не считается заменой локальному smoke; перед ревью фиксируются
число passed, skipped и известные fixme.