如何测试JavaScript缩小输出

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

我们最近升级到JavaScript缩小库的更新版本。

在测试团队进行了大量质量保证工作之后,我们发现新版本的minifier存在一个问题,它改变了代码块背后的意图和含义。

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 to AST库,但考虑到可以对缩小代码进行更改的性质,它会产生太多的误报。

我们也考虑尝试编写具有代表性的测试,但这似乎是一个永无止境的任务(很可能会错过)。

仅供参考:这是一个非常复杂的Web应用程序,包含数十万行JavaScript代码。

我们正在寻找一种测试缩小过程的方法,即“再次测试一切,彻底并重复测试”。我们希望在这个过程中应用更多的严谨/科学。

理想情况下,如果我们拥有更好的科学测试方法,我们可以尝试使用多个缩减器,而不用担心每种方法都会以新的细微方式破坏我们的代码。

我们有一个想法是:

  1. 用旧版本进行缩小
  2. 美化它
  3. 用新版本缩小,
  4. 美化
  5. 视觉差异。

它似乎确实是一个好主意,但是差异非常普遍,差异工具几乎将每一行标记为不同。

提问于
用户回答回答于

听起来像你需要在CI(持续集成环境)中开始使用自动单元测试。QUnit已经被抛弃了,但是真正的QUnit是一个相当弱的测试系统,它的断言至少是准系统(它甚至没有真正使用好的基于断言的语法)。它只能勉强符合TDD的要求,也不能很好地处理BDD。

就我个人而言,我会推荐JasmineJsTestDriver(它可以使用其他UT框架,或者它自己的,并且速度非常快......虽然它有一些我确实希望他们修复的稳定性问题),并且可以检查设置单元测试通过多重比较缩小过程。

一些比较可能需要是:

  • 原始代码及其功能按预期行事
  • 与缩小代码相比(这是BDD进入的地方,期望在缩小代码中具有相同的功能性能/结果)
  • 我甚至会更进一步(取决于您的缩小方法),然后进行测试,然后美化缩小并进行另一次比较(这会使您的测试更加稳健,并且更有效地保证其有效性)。

这些类型的测试就是为什么你可能会从像Jasmine这样的支持BDD的框架中受益,而不仅仅是纯TDD(ala你发现的视觉差异的结果是一团糟),因为你正在测试行为和比较,功能/行为的先前/后期状态,而不仅仅是如果a是真的并且在被解析后仍然是真的。

设置这些单元测试可能需要一段时间,但其与大codebase的迭代方法...测试您最初的关键瓶颈或脆弱点的快速和早期,然后扩展测试一切(我总是设置方法我的团队的是,希望从这个角度上任何不考虑完整,RC,除非它有单元测试...任何旧有没有单元测试,必须更新/触摸/维持必须的时候都感动写单元测试,这样您就可以不断改进和缩小未经测试的代码数量,同时提高代码覆盖率)。

一旦你在CI中运行了单元测试并运行,你就可以将它们绑定到你的构建过程中:没有单元测试的失败构建,或者单元测试失败时发出警报,主动监视每次登录等。使用JSDoc3等自动生成文档

你正在描述的问题是CI和单元测试是为什么构建的,更具体地说,这种方法最大限度地减少了代码库大小的影响......这个大小并没有使它更复杂,只是将持续时间设置为更长时间地进行全面测试。

然后,将其与JSDoc3相结合,你的样式比大多数前端商店的90%都要好。它在这一点上对工程师来说非常强大和有用,并且变得自我延续。

我真的可以继续谈论这个话题,你如何接近它并让团队集结在一起并使之自我形成和自我延续,最重要的是编写可测试的代码。但是从概念层面来说...... 编写单元测试并自动化它们。总是。

长期以来,前端开发人员一直在半开发中,而没有采用实际的工程严谨性和纪律。随着前端越来越强大,越来越热,它必须改变,并且正在发生变化。为前端/ RIA应用提供经过良好测试,覆盖范围广泛,自动化测试和持续集成的概念是这一变化的巨大需求之一。

用户回答回答于

你有没有考虑过单元测试框架,比如QUnitjs?编写单元测试将是一项相当大的工作,但最终你会有一个可重复的测试过程。

扫码关注云+社区