我们最近升级到了 JavaScript 缩小库的更新版本。
在测试团队进行了大量的质量保证工作后,我们发现我们的 minifier 的新版本存在一个问题,改变了代码块背后的意图和含义。
(人生教训:除非你真的确信你需要新版本,否则不要升级 JS 缩小器。)
minifier 用于客户端 JavaScript 代码,重点强调 DOM 相关活动,而不是“业务逻辑”。
缩小器升级破坏的简化示例:
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 交互(数据输入等)的影响很大,如果没有用户测试(非自动化),很难进行彻底的测试。我们曾考虑使用像 Esprima 这样的 JS 到 AST 库,但考虑到可以对缩小代码进行的更改的性质,它会产生太多的误报。
我们还考虑尝试编写具有代表性的测试,但这似乎是一项永无止境的任务(并且可能会漏掉案例)。
仅供参考:这是一个非常复杂的 Web 应用程序,包含数十万行 JavaScript 代码。
我们正在寻找一种方法来测试缩小过程,而不是“再次彻底地测试所有内容,然后重复”。我们想在这个过程中应用更多的严谨/科学。
理想情况下,如果我们有更好的科学测试方法,我们可以尝试多个 minifier,而不必担心每个 minifier 都会以新的微妙方式破坏我们的代码。
更新:
我们的一个想法是:
- 用旧版本缩小
- 美化它
- 用新版本缩小,
- 美化,和
- 视觉上的差异。
这看起来确实是个好主意,但是差异如此普遍,以至于差异工具几乎将每一行都标记为不同。