Что именно мерил прибор
Гейт разбирал разметку и искал в ней формулировки: прямой ответ в начале, вопрос и ответ рядом, конкретику вместо общих слов. Разбор показал перекос между тем, что правило хочет проверить, и тем, что оно проверяет на самом деле.
| Правила гейта | Сколько | Куда сдвигает вердикт |
|---|---|---|
| Опираются на видимый текст | 4 из 5 | затронуты все четыре |
| Из них — в сторону пропуска дефекта | 3 | текст спрятан, вердикт зелёный, читатель ничего не видит |
| Из них — в сторону ложной тревоги | 1 | текст читателю доступен, прибор краснеет |
| Проверяют фактическую видимость | 0 | — |
Тот же класс независимо всплыл в описании нашего конвейера сборки — формулировкой почти дословно той же: текст под скрывающим стилем для гейта видим, и зелёный вердикт не гарантирует, что читатель видит текст. Две команды пришли к одному выводу с разных сторон, что для нас признак реального дефекта, а не частного случая.
Наивная починка была бы хуже дефекта
Первый напрашивающийся критерий: раз текст скрыт стилями — значит, читателю недоступен. Прогнали оба варианта на одной выборке.
| Критерий | RED на 358 страницах | Что было бы дальше |
|---|---|---|
| Принятый (с проверкой достижимости) | 30 | красные — это правда красные |
| Наивный («скрыто стилями = невидимо») | 52 (+22, +73%) | порядка +120 ложных RED на полной базе |
Хуже всех вело себя одно правило: с 3 находок оно уходило на 32 — в десять раз. Разбор причины простой и воспроизводимый на любом публичном сайте с раскрывающимся блоком вопросов и ответов: свёрнутый аккордеон скрыт стилями ровно до клика. Читателю текст доступен, прибору по наивному критерию — нет.
Ловушка симметрии. Дефект «прибор не видит скрытое» и починка «всё скрытое считать невидимым» выглядят зеркально, поэтому вторая кажется бесплатной. По замеру она добавляла шума больше, чем снимала слепоты.
Состязательная проверка: 40 страниц глазами браузера
Спорить о критерии можно бесконечно, поэтому взяли независимый источник истины — реальный рендер в браузере — и сверили с ним вердикты.
- 40 страниц, прогон вердиктов против фактического рендера. Ложных тревог — 0.
- Второй проход того же набора: 17 страниц из 40 «теряют» при рендере до 45% статического текста.
- Разбор каждого из семнадцати случаев поимённо: аккордеоны, вкладки, модальные окна. Каждый случай легитимен — текст доступен читателю по клику.
Цифра «до 45% текста не показано» в отрыве от разбора выглядит как катастрофа вёрстки. После разбора — как нормальная работа интерфейса. Разница между двумя прочтениями стоила одного прохода руками по семнадцати страницам.
Чем закрыли и чем проверили, что закрыли
Отдельный модуль проверки достижимости текста — 561 строка. Приёмка велась не по факту «код написан», а по перепрогону тестов, которые обязаны ловить дефект.
| Проверка | До фикса | После |
|---|---|---|
| Мутационных кейсов в наборе | 30 | 44 |
| Провалов на коде до фикса | 7, выход с ошибкой | — |
| Провалов на новом коде | — | 0 |
Что забрать себе
- Спросить у своего прибора, что он читает. Разметку, рендер или сеть — это три разные реальности, и правило почти всегда написано про одну, а работает на другой.
- Починку критерия мерить тем же способом, что и дефект. Наивный вариант на выборке давал +73% красного — без замера он ушёл бы в работу как улучшение.
- Держать независимый источник истины. Браузер разрешил спор о видимости за один прогон по сорока страницам.
- Прогонять новые тесты на старом коде. Пока они там не покраснели, приёмка не начата.