有没有办法生成单元测试来测试我的语法
Is there a way to generate unit test to test my grammar
我使用 antlr4 创建了我的语法,但我想测试健壮性
有没有自动工具或好方法可以快速做到这一点
谢谢:)
我发现为语法创建单元测试的唯一方法是根据给定语言的书面规范创建大量示例。这既不快,也不完整,但我没有其他办法。
您可能会想直接从语法创建测试用例(为此编写一个工具并不难)。但是想一想。那你会测试什么?你的单元测试总是会成功,除非你使用从早期版本的语法生成的测试用例。
一种特殊情况是,当您为一种语言编写语法时,该语言已有另一种解析器生成工具的语法。在那种情况下,您可以使用原始语法生成测试用例,然后您可以使用这些测试用例来测试新语法的一致性。
但是,我不知道有什么工具可以为您生成测试用例。
更新
与此同时,我有了另一个可以进行更好测试的想法:有一个句子生成器,可以根据您的语法生成随机句子(我目前正在 Visual Studio Code ANTLR4 extension 中研究一个)。然后可以使用启发式方法检查生成的句子的有效性:
- 确认基本结构。
- 检查必填关键字及其正确顺序。
- 检查标识符和字符串是否有效。
- 注意根据语言无效的异常结构。
- ...
这已经涵盖了该语言的大部分内容,但有其局限性。匹配代码并生成它不是 1:1 操作。匹配特定(有效)输入的语法规则可能会产生更多(并且可能会产生无效输入)。
因为很难找到真正的 ANTLR 单元测试,所以我写了 2 篇关于它的文章:
A Lexer 测试 检查给定的文本是否被读取并转换为预期的令牌序列。例如,避免歧义错误很有用。
A 解析器测试 获取一个标记序列(即,它在较小的部分之后开始)并检查 标记序列 遍历预期规则( java 方法)。
Boris Beizer 在他的书 'Software Testing Techniques' 的一章中谈到了 'syntax testing' 的主题。基本思想是(在精神上或实际上)采用语法并将其表示为语法图(又名铁路图)。对于系统测试,将覆盖此图:输入与元素匹配的良好情况,但也包括每个节点的不良情况。迭代和递归调用将像循环一样处理,即零、一、二、小于最大值、最大值、一次超过最大迭代次数的情况(即相应句法元素的出现)。
我使用 antlr4 创建了我的语法,但我想测试健壮性
有没有自动工具或好方法可以快速做到这一点
谢谢:)
我发现为语法创建单元测试的唯一方法是根据给定语言的书面规范创建大量示例。这既不快,也不完整,但我没有其他办法。
您可能会想直接从语法创建测试用例(为此编写一个工具并不难)。但是想一想。那你会测试什么?你的单元测试总是会成功,除非你使用从早期版本的语法生成的测试用例。
一种特殊情况是,当您为一种语言编写语法时,该语言已有另一种解析器生成工具的语法。在那种情况下,您可以使用原始语法生成测试用例,然后您可以使用这些测试用例来测试新语法的一致性。
但是,我不知道有什么工具可以为您生成测试用例。
更新
与此同时,我有了另一个可以进行更好测试的想法:有一个句子生成器,可以根据您的语法生成随机句子(我目前正在 Visual Studio Code ANTLR4 extension 中研究一个)。然后可以使用启发式方法检查生成的句子的有效性:
- 确认基本结构。
- 检查必填关键字及其正确顺序。
- 检查标识符和字符串是否有效。
- 注意根据语言无效的异常结构。
- ...
这已经涵盖了该语言的大部分内容,但有其局限性。匹配代码并生成它不是 1:1 操作。匹配特定(有效)输入的语法规则可能会产生更多(并且可能会产生无效输入)。
因为很难找到真正的 ANTLR 单元测试,所以我写了 2 篇关于它的文章:
A Lexer 测试 检查给定的文本是否被读取并转换为预期的令牌序列。例如,避免歧义错误很有用。
A 解析器测试 获取一个标记序列(即,它在较小的部分之后开始)并检查 标记序列 遍历预期规则( java 方法)。
Boris Beizer 在他的书 'Software Testing Techniques' 的一章中谈到了 'syntax testing' 的主题。基本思想是(在精神上或实际上)采用语法并将其表示为语法图(又名铁路图)。对于系统测试,将覆盖此图:输入与元素匹配的良好情况,但也包括每个节点的不良情况。迭代和递归调用将像循环一样处理,即零、一、二、小于最大值、最大值、一次超过最大迭代次数的情况(即相应句法元素的出现)。