Javascript语法测试案例

8
我正在创建一个文本编辑器,刚刚编写了高亮算法,使每个语法出现在不同的颜色中,并使用正确的解析树在正确的位置呈现。
我想知道是否有人可以提供测试用例或一系列测试用例的位置,以确保没有问题。测试案例应涵盖Web上使用的所有JavaScript语法,包括边缘情况(即包括语法,如throw,尽管很少使用),DOM创建和操作等。
我已添加了以下静态测试用例。它应该涵盖所有语法。
有几件事需要注意:由于代码在语法级别上被递归地解析,因此只需要基本情况。例如,对于编辑器:
a [1];和a [1] [2] [3] [4] [5];将是相同的语法。由于第二行只是递归地更多的子代,因此与第一行相同。
我创建的测试用例已移至下面的答案。
4个回答

2
有趣的问题。如果没有其他有趣的建议,我认为我的初始方法是从一些主要的JavaScript库中获取一些代码。我想到的是jQuery、Mootools、Prototype等。
然后,一旦你完成了几个主要的库,就可以做一些较小的库。我会看看Github。也许看看Underscore、HeadJS,以及https://github.com/languages/JavaScript上的其他一些库。
我还会拿一些压缩过的库,通过JSBeautifier运行它们。不确定美化的JS是否与原始代码略有不同。
最后,我会考虑将其中一些库通过JSLint运行,并手动修改源代码以显式地遵循JSLint规定的一些“规则”。
编辑:我所说的“命中”,是指确保你涵盖每条规则提供的两种情况,而不仅仅是“干净”的版本。

正如您在下面所说的那样:JSLint 可能会非常严格,它甚至不喜欢 ++--,这些都是完全有效的(并且在我看来很合理)。 - Marcel Korpel
@Marcel Yep,这就是为什么我建议明确地遵守其中一些规则,以确保覆盖这些情况。 我的意思不是建议使用该工具来确保代码“干净”。已编辑以澄清。 - Matt
同样适用于Node.js应用程序,因为它们也是JavaScript,但它们不是DOM相关的。 - jcolebrand
我已经对自己的代码库进行了大规模测试,但也许我会手动检查一些大型库并构建自己的测试。 - GAgnew
@Greg 使用来自其他库的代码的好处在于不同的人有不同的编码标准,因此代码会有轻微的变化。 - Matt
@Matt 好的,我会确保使用多样化的库。 - GAgnew

1

这是我能想到的迄今为止最好的测试用例。

编辑:添加了正则表达式和throw。这个案例在语法上是有效的,应该涵盖了JS的所有情况。如果您发现有任何遗漏,请直接向我发送消息,以便我可以在此处添加。

a = 1;
b = { 'a' : a };
c = 'a';
d = this;
var patt1=/w3ghouls/i;
throw "Err3";
function e(a,b,c){
    d += a + b + c++;
    return d;
}
this.xy.z = function(a, b){
    var x = null;
}
var f = function(a,b){
    if(a == b || (b === a && a)){
        var f = [a,b];
        try{
            f = f.slice(0);
        }catch(e){
            console.log(e * e + '');
        }
    }else if(a){
        a = null;
        a = undefined;
        b = typeof a;
        b = true;
        b = false;
    }else{
        switch(c){
           case 'c':
             break;
           default:
             null;
             break;
        }
    }
}
for(var i =0; i <= a.length; i++){
    do{
       continue;
       null;
      }while(a != b);
}
if(a == b)
  (a) ? null : null;
/* This is a finished 
   test case */

1
一种可能的方法:有各种应用程序可以从语言的BNF语法(例如this one)生成随机代码片段,并且有适用于JavaScript的语法文件
这并不一定会为您提供静态测试用例,您可以使用已知的预期结果脚本测试,但这可能是测试解析器是否遇到意外(但合法)字符串并确保它不会中断的好方法。

这是一个非常有趣的想法。我从未考虑过使用随机生成的代码作为测试用例,而且这可能并不高效,因为我已经覆盖了常见情况。不过,我可能会在编辑器的第二个方面使用这个生成器。谢谢。 - GAgnew

0
一个好的开始是通过JSLint运行它,以查看您的JavaScript是否有效。这是我知道的最好的检查工具,但我不确定它在检查代码是否损坏方面的效果如何。:(
希望这有所帮助。

2
JSLint是一个不错的工具,但它会抱怨很多仍然“有效”的东西,而这些东西在编辑器的目的上仍应被视为有效。 - Matt
JavaScript已经被证明是有效的,我只担心可能会错过一些有效的情况。 - GAgnew
@Matt 是的,我知道让 JSLint 满意很难。 :) @Greg 很抱歉这次帮不上忙。 - Oliver Spryn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接