你怎么测试雷克瑟?
我想知道如何有效地测试lexer(tokenizer)。源文件中的令牌组合数量可能很大,我发现的唯一方法是生成一批具有代表性的源文件,并期望每个源文件都有一个特定的
解答动态
您的语法可能对每个标记都有一些生成规则(例如,{表示块
开始标记,或者字符串文字标记由“";”字符分隔)。开始为这些规则编写测试,并验证lexer在每种情况下都生成正确的令牌。
一旦对每个令牌进行了测试,就可以为感兴趣的令牌组合添加一些测试。集中在这里的令牌组合,将揭示一个错误,在您的lexer。对于您的语言的解析器来说,令牌组合不一定有意义,因此使用+12作为输入并期望令牌INCREMENT、INCREMENT、PLUS、INTEGER_LITERAL(12)作为输出是完全有效的。
最后,请确保您对错误输入进行了一些测试,因为lexer将无法识别令牌。尽管我最后提到了它们,但它们不一定是您创建的最后一个测试。您也可以从这些开始。
如果您自己编写lexer,这似乎是测试驱动开发的理想情况。
虽然“源文件中令牌的组合数量可能很大”,但源代码中分支的数量是有限的。其思想是,在代码中添加一个特性(例如lexer要处理的边缘情况)之前,首先要编写测试。
如果您使用的是一个现有的lexer,它提供了特定的规则,那么也可以应用类似的方法。换句话说,你从非常简单的语法开始(这没有任何用处),添加越来越多的测试,同时也使规则复杂化。
其他人没有提到的另一种方法是使用测试生成方法,如Haskell的QuickCheck,从你定义的语法生成边缘案例。
现在,一旦生成了这些条件,您就可以手工编写一些可能会失败的附加条件(例如assertRaises)。
这样做的好处是可以随着语法的更改自动更新,减少维护测试所花费的时间。它还有一个有趣的元副作用,即您将为您的测试维护人员维护测试;)- End
免责声明:
本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。