Недавно мы обновили до новой сборки библиотеки миниатюр JavaScript.
После того, как команда тестирования провела значительную работу по обеспечению качества, было обнаружено, что в новой версии нашего minifier была проблема, которая изменила намерение и значение за блоком кода.
(Урок Life: не обновляйте JS minifiers, если вы действительно не уверены, что вам нужна новая версия.)
minifier используется для кода JavaScript на стороне клиента с большим вниманием к деятельности, связанной с DOM, а не почти так же "бизнес-логикой".
Упрощенный пример того, что было нарушено при обновлении minifier:
function process(count)
{
var value = "";
value += count; //1. Two consecutive += statements
value += count;
count++; //2. Some other statement
return value; //3. Return
}
Недопустимо неверно присвоено значение:
function process(n){var t="";return t+n+n,n++,t}
Хотя мы могли бы написать некоторые модульные тесты, чтобы уловить некоторые из возможных проблем, учитывая, что JavaScript тяжелый для взаимодействия с DOM (ввод данных и т.д.), очень сложно тщательно протестировать без тестирования пользователя (неавтоматизированным). Мы размышляли об использовании библиотеки JS в AST, такой как Esprima, но учитывая характер изменений, которые могут быть внесены в минифицированный код, это создало бы слишком много ложных срабатываний.
Мы также подумали о том, чтобы попытаться написать репрезентативные тесты, но это похоже на бесконечную задачу (и, вероятно, пропустит случаи).
FYI: это очень сложное веб-приложение с несколькими сотнями тысяч строк кода JavaScript.
Мы ищем методологию для тестирования процесса миниатюризации, а не "просто повторить все, тщательно и повторить". Мы хотели бы применить к процессу немного более строгое/научное.
В идеале мы могли бы попробовать несколько minifiers, не опасаясь, что каждый из них будет разбит наш код новыми тонкими способами, если бы у нас был лучший научный метод тестирования.
Обновление:
Одна из наших идей заключалась в следующем:
- принять предупреждение со старой версией
- украсить его
- minify с новой версией,
- украсить, и
- визуально diff.
Это казалось хорошей идеей, однако различия были настолько распространены, что инструмент diff помечен почти каждой строкой как отличающийся.