mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-11-13 17:08:20 +00:00
test: less fragile - use semantic locators\helpers
This commit is contained in:
+6
-5
@@ -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`.
|
||||
|
||||
|
||||
@@ -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
@@ -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`.
|
||||
|
||||
@@ -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`.
|
||||
|
||||
@@ -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, а какие —
|
||||
отдельным ночным прогоном?
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user