Сибирь AI

Как мы проверяем
свою работу

Мы не считаем сделанным то, что не падало на контрольном примере. Здесь описано, как устроена проверка, и приведены настоящие случаи, когда она ловила наши собственные ошибки.

Обновлено .

Правило, из которого все остальное

Изменение засчитывается, только если есть проверка, которая падала до правки. Не «тесты зеленые», а показанный вход, на котором проверка краснеет.

Звучит занудно, а работает так. Инструмент перевода AVI в MP4 обещал на странице, что при старом звуке сам сделает второй заход с пересжатием. Проверка смотрела, есть ли в готовом файле дорожка видео и дорожка звука. Дорожки были, проверка была зеленой, а инструмент обещания не выполнял: он переносил старые кодеки в новую оболочку, и получался файл, который телевизор не откроет.

Починила не правка кода, а другая проверка: в нее записали, какие кодеки обязаны быть внутри, и записали до прогона. Она покраснела на одном случае из двадцати и назвала его.

Посев: проверяем сами проверки

Отчет «проверено сорок, подтвердилось сорок, расхождений ноль» заполнить проще, чем проверить. Поэтому в собственные проверки мы подсаживаем известные поломки и смотрим, сколько поймается.

Пример. Распознаватель QR-кода не должен выдумывать: если код испорчен и не вытягивается, надо сказать «не прочитался», а не показать правдоподобную строку. Чтобы это проверить, мы портим коды по возрастающей и считаем, сколько раз появится строка, которой в коде не было.

Четыреста прогонов, порча от трех до ста модулей: сто шесть кодов вытянуто избыточностью, остальные отвергнуты, выдуманных строк ноль.

Отдельно ломаем сам распознаватель, четырьмя способами, и смотрим, что проверки при этом краснеют. Проверка, которая не краснеет на сломанном коде, не проверяет ничего.

Сверка с чужой реализацией

Своя программа, проверенная только собой, ничего не доказывает: так проверяется согласованность двух своих ошибок.

Генератор QR-кодов написан у нас с нуля. Мы сверили его матрицы с матрицами независимой библиотеки при тех же версии, уровне избыточности и маске. Совпадение должно быть бит в бит, потому что QR-код однозначен.

Сверка нашла ошибку, которую не нашло бы ничто другое: в порождающем многочлене для кодов исправления коэффициенты шли в обратном порядке. Данные при этом были верные, проверочные байты неверные. Код выглядел бы настоящим и не читался ни одним считывателем.

Тем же способом сверена таблица блоков на все сорок версий: двадцать версий, набранные у нас руками, совпали с чужой таблицей до байта. Сходятся обе, значит верны обе, и это не эхо: писались они порознь.

Проверяем там, где потребитель

Правка в репозитории не на сайте, пока не выложена. Поэтому проверки гоняются по рабочему сайту, а не по копии на диске, и копия отдельно сверяется с сайтом побайтно.

Одна из проверок долго умела работать только по копии: она забирала готовый файл чтением ссылки из кода страницы, а на сайте это запрещено политикой безопасности. Мы переделали ее на настоящее скачивание, как делает человек, и только после этого она стала что-то значить.

Зеленое проверяем на честность

Молчание неотличимо от успеха, и это самый частый способ обмануть себя.

Инструмент проверки записи обещает, что запись никуда не уходит. Посев подсаживал три способа ее увести, и все три отмечались пойманными. На деле один не ловился вовсе: отправку файла через форму браузер наружу не показывает, а правило было построено на размере тела запроса. Отмечалось «поймано» потому, что в окно наблюдения попадало постороннее обращение счетчика посещаемости.

Нашлось это не потому, что мы умные, а потому, что посев выровняли с проверкой и стали сверять причину срабатывания с подсаженной. Правило перестроено, и теперь оно лежит одной функцией, которую посев берет оттуда же: второй экземпляр правила расходится с первым молча.

Красное тоже проверяем

Упасть может проверка, а не предмет.

Проверки сайта мы прогнали в движке Сафари. Инструмент проверки записи там не определял длительность. Могло показаться, что сломан инструмент. На деле в собранном для проверок движке нет части кодеков, и настоящий Сафари, скорее всего, эту запись открывает.

Чинить все равно стоило, но в другую сторону: у формата WAV длительность лежит в заголовке открытым текстом, и спрашивать ее у проигрывателя незачем. Разбор заголовка сверен со сторонним средством на четырех записях с разной частотой и разным числом каналов.

Снимок до и после

Автоматика не видит, что элемент стал невидимым. Разметка правильная, цвета из переменных оформления, проверки зеленые, а на экране неверно.

Схемы QR-кода и штрих-кода в темной теме показывали код наоборот: светлые полосы на темном. Настоящий код это темные элементы на светлом, иначе считыватель его не прочтет. Видно было только на снимке.

Там же нашлось, что при печати страницы четыре листа из семи выходили пустыми: разделы появлялись по прокрутке, а до нижних человек не долистывает перед тем, как нажать печать.

Числа, а не слова

На сегодня по сайту работают:

  • 24 набора проверок инструментов, каждый доводит дело до готового файла и разбирает его сторонним средством;
  • проверка готовности страниц, четырнадцать признаков, с посевом на каждый;
  • проверка карты сайта против самого сайта;
  • проверка того, что у страницы один адрес, а не несколько;
  • замер попарной схожести страниц между собой;
  • приемка кеша и сжатия по заголовкам, которые видит браузер.

Каждый набор запускается по адресу рабочего сайта одной командой и сообщает три числа: сколько проверок, сколько плохих, какие именно.

Чего мы не проверяем

Этот раздел обязателен. Пустой список непроверенного означает, что о проверке не думали.

  • Файрфокс. В нашей среде он не запускается, и обходить это ограничение мы не стали.
  • Настоящий Сафари на айфоне. Движок на стенде это не то же самое, и мы на этом уже один раз споткнулись.
  • Браузеры старше трех лет. Инструменты на них не рассчитаны, и проверок нет.
  • Экранный диктор. У схем есть названия для читалки, но проверка была глазами, а не читалкой.
  • Настоящие снимки с телефона для распознавания кодов: все проверки идут на ровном свете, без бликов и смаза.