Bug fingerprinting для UI: почему stack trace не работает и что вместо
Creatman 2 часа назад Bug fingerprinting для UI: почему stack trace не работает и что вместо Сложный 8 мин 3K Тестирование веб-сервисов * Программирование * Алгоритмы * Open source * Искусственный интеллект Аналитика...
Anthropic — What company has the best second artificial intelligence model at the end of June?
В сфере искусственного интеллекта произошло заметное событие. Creatman 2 часа назад Bug fingerprinting для UI: почему stack trace не работает и что вместо Сложный 8 мин 3K Тестирование веб-сервисов * Программирование * Алгоритмы * Open source * Искусственный интеллект Аналитика TL;DR: Sentry дедуплицирует backend-ошибки по хешу (error class + top stack frame + module). Для UI-багов этот рецепт ломается — у expect(button). toBeVisible() нет stack frame в продуктовом смысле, есть локатор + assertion + URL.
В webtest-orch я собрал composite SHA-256 fingerprint из (normalized_selector | assertion type | error class | URL template | message) с тремя rules нормализации (:nth-child, UUID, /users/123 → /users/:id). Это даёт стабильный 8-hex BUG-id который выживает прогоны и даёт diff new / regression / persisting / fixed без БД и embedding’ов. Сразу прошу читателя простить меня но дальше будет много букав и кода.
Технические детали
Когда я писал webtest-orch — Claude Code skill для e2e-тестирования — упёрся в задачу которая на первый взгляд тривиальная. На следующем прогоне — снова. Это тот же баг или новый?
Если тот же — на каком прогоне он впервые появился, и был ли он fixed между ними? Если ответа нет, run-diff невозможен, и любая регрессия теряется в шуме «9 fail’ов сегодня». Backend-задачу решил Sentry — composite hash из error class и top stack frame.
UI-багам этот рецепт не подходит, и в этой статье я разберу почему, и какой fingerprint в итоге работает. Почему рецепт Sentry не подходит для UISentry’s grouping algorithm дедуплицирует backend-ошибки через комбинацию:Тип исключения (TypeError, NullPointerException)Top frame stack trace (module. py:42 → user_handler)Транзитивно — содержание top функцииЭто работает потому что у backend-исключения есть детерминированный stack — одна функция, одна строка, одно исключение.
Отраслевые последствия
UI-баги выглядят иначе. Падает test:Error: expect(locator). toBeVisible() failed Locator: getByRole('button', { name: 'Place Order' }) Expected: visible Actual: not found URL: здесь “top stack frame”?
Технически — Playwright internals (expect. js:128), но для дедупликации это бесполезный носитель. Регрессии будут все из одного и того же expect.
js:128, потому что Playwright использует одну функцию для всех expect(locator). toBeVisible() в мире. То что на самом деле уникально для каждого UI-бага:Что мы искали — locator (getByRole('button', { name: 'Place Order' }))Что мы проверяли — assertion (toBeVisible, toHaveText, toHaveURL)Тип ошибки — class (TimeoutError, AssertionError)Где — URL pattern (без волатильных частей)Содержание — short snippet of error messageЭти пять полей в комбинации идентифицируют bug semantically — не его technical signature, а его product meaning.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





