如何测试CSS解析器?

9

我正在编写一个解析CSS的解析器。

我开始修改CSS参考文法,以使用我正在使用的第三方解析器生成工具支持的语法和词法分析器语法。

我认为我已经完成了语法编码:解析器生成器现在能够为我的语法生成状态转换表。

结果(来自解析器生成器的输出)大约有116个“规则”,对应于switch语句中的116种情况。这些规则/switch语句的示例包括:

  1. 样式表以指定字符集开头
  2. 样式表以未指定字符集开头:
  3. 样式表为空
  4. 样式表以空格开头
  5. ...等等...

解析器生成器已经尽其所能为我做了,现在我开始手动编写各种case的switch语句,这将构建人们所谓的“抽象语法树”。

我的问题是关于如何测试这个。我认为我想要的是一组CSS文件,可以练习各种组合和可能性:例如一个指定字符集的CSS文件;另一个没有指定字符集的文件等。
  • 是否有一种通用的方法来自动生成这组输入数据,针对任意语法或规则集?

  • 或者,是否有一组特定的CSS文件,其目的是覆盖标准CSS语法允许的组合和可能性?

如果我做错了,请随时评论。

目前我不需要:

  • 测试处理非法输入(即不符合语法的文件)的文件

  • 基于它们解析CSS的各种浏览器呈现的测试

3个回答

4

Microsoft的链接已经失效。 - Dan Oberlam

2

2

一个无上下文文法暗示了一组(解析)树的无限集合。每个提议的树都有一组叶子,在该文法所接受的语言中形成具体的句子。通过探索提出的树的集合(例如,根据可能的替代方案扩展每个非终端),您可以生成任何任意的语言实例。您可以通过遍历树的建议并进行随机选择来生成一组测试。一个更专注的方法是使用迭代加深搜索来按大小排序生成句子。对于任何有趣的语法,你可能会得到大量的实例,但是,嘿,这就是自动化测试的用途。

我不会从生产语法中生成这样的句子,因为您生成的句子将是根据定义接受的那些句子 :-{。您应该使用参考文法构建句子生成器,以利用它所接受的内容和您已经实现的内容可能不同的事实。


我的语法中有大约55个非终结符。如果我将其评估为自顶向下的解析器,则与顶级非终结符关联的方法会调用与较低级别非终结符关联的方法,以此类推。每个非终结符方法通过方法内的switch语句调用大约1到3个较低级别的方法,并由1或有时2个不同的更高级别的方法调用。即使只是获得完整的代码覆盖率也是一件很棒的事情:确保至少测试了每种可能性一次(不希望每种可能性的每种组合),... - ChrisW
可能需要大约(55 x 3 =)150个测试用例。我认为我同意你的看法,从语法自动产生这些测试用例的收益不大。然而,我之所以问这个问题是因为在学校里我从未正式学习过解析,而其他人却学过:我想知道您是否学过一些针对测试解析器的著名算法。 - ChrisW
没有人教过我如何测试解析器,无论是在学校还是在外面。这不在课程中。我建造了很多解析器,但大多数情况下依赖于来自真实代码的无数测试用例,因为大多数编译器的参考语言与编译器开发人员实际实现的不匹配(见证微软和C#;他们费尽心思制定了一个标准,但并未实现它!)。你似乎很幸运,拥有一个真正的参考文法。 - Ira Baxter
关于大量测试用例,当您拥有“足够”的测试用例时,可以停止生成它们,即使您没有获得完全的覆盖率。如果您使用迭代加深策略,您可以停止一百万个测试用例,并且可以相当确信已经具备了良好的覆盖率 :-} 运行这些测试用例不会花费太长时间。 - Ira Baxter

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