文法生成器:基于文法的随机测试生成器

grammarinator的Python项目详细描述


antlrv4基于语法的测试生成器

https://badge.fury.io/py/grammarinator.svghttps://travis-ci.org/renatahodovan/grammarinator.svg?branch=masterhttps://ci.appveyor.com/api/projects/status/0f1vm5x9j9j31hpo/branch/master?svg=truehttps://coveralls.io/repos/github/renatahodovan/grammarinator/badge.svg

grammariator是创建测试用例的随机测试生成器/模糊器 根据输入ANTLRv4语法。背后的动机 基于语法的方法是利用 可用ANTLR v4 grammars

要求

  • Python>;=3.4
  • pip和setuptools python包(后者由 皮普)。
  • ANTLRv4

安装

快捷方式:

pip3 install grammarinator

或者克隆项目并运行setuptools:

python3 setup.py install

用法

作为第一步,grammariator接受一个ANTLR v4语法并创建一个测试 python3中的生成器脚本。这样的生成器可以在以后的子类中 如果需要,可以进一步定制。

创建测试生成器的示例用法:

grammarinator-process <grammar-file(s)> -o <output-directory> --no-actions

注释

语法分析器使用ANTLR v4语法格式作为输入,这使得 现有语法(词法分析器和语法分析器规则)易于重用。但是,因为 一个fuzzer和一个解析器内在不同的目标,内联代码 (操作和条件、头和成员块)很可能不是 可重用,甚至阻止正确执行。第一次实验 现有语法文件^ {TT1}$支持命令行 选项--no-actions,在fuzzer期间跳过所有此类代码块 一代人。一旦内联代码被调整为模糊化,这个选项可能会被忽略。

在生成并可选地定制了一个fuzzer之后,可以执行它 通过grammarinator-generate脚本或通过实例化它 手动操作。

grammarinator-generate

的示例用法
grammarinator-generate -l <unlexer> -p <unparser> -r <start-rule> -d <max-depth> \
-o <output-pattern> -n <number-of-tests> \
-t <one-or-more-transformer>

注释

现实生活中的语法经常使用递归规则来表示某些模式。 然而,当使用这样的规则进行生成时,我们很容易在 意外的深度调用堆栈。使用--max-depth-d选项,这个 深度——以及生成的测试用例的大小——是可以控制的。

antlr文法的另一个特点是它们支持所谓的 隐藏的标记。这些规则通常描述目标的这些元素 基本上可以放在任何地方而不破坏语法的语言。这个 最常见的例子是注释或空白。但是,当使用这些 语法-不明确定义空格可能出现或可能不出现的位置 在规则中-要生成测试用例,我们必须插入缺少的空格 手动操作。这可以通过应用各种变压器(使用^{tt7})来实现$ 选项)到输出测试的树表示。简单的变压器- 在每个unparser规则之后插入一个空格-由语法分析器提供 (grammarinator.runtime.simple_space_transformer)。

最后,我们不能忘记语法的最初目的 是各种输入的语法验证。因此,这些 语法只编码语法期望,而不是语义规则。如果我们 仍然想在生成的测试中添加语义知识,那么我们可以 从生成的fuzzer继承自定义fuzzer并重新定义方法 以编码所需的 知识(例如:HTMLCustomUnparser)。

工作示例

存储库包含生成html文件的最小example。给它 尝试一下,先运行处理器:

grammarinator-process examples/grammars/HTMLLexer.g4 \
examples/grammars/HTMLParser.g4 -o examples/fuzzer/

然后,使用生成器生成测试用例:

grammarinator-generate -l examples/fuzzer/HTMLCustomUnlexer.py \
-p examples/fuzzer/HTMLCustomUnparser.py -r htmlDocument \
-o examples/tests/test_%d.html -t HTMLUnparser.html_space_transformer -n 100 -d 20

兼容性

grammaringator测试时间:

  • Linux(ubuntu 16.04/18.04)
  • Mac OS X(Sierra 10.12/高Sierra 10.13/莫哈韦10.14)

引文

关于grammaringator的背景发表在(r.hodovan,a.kiss,t.gyimothy: “语法师:基于语法的开源模糊器”,A-test 2018)。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java窗口。位置和窗口。公开问题   java如何从存储在ArrayList<Node>中的动态生成的文本字段中获取文本?   java如何立即关闭InputStream?   如何重新启动Java程序以激活环境变量   java搜索字符串是否相差一个字符   java CFB模式输出与CTR输出相同;我做错什么了吗?   java如何在javaFX中将实例化对象添加到Stage   java如何在jtextarea上打印来自不同类的文本消息   java以编程方式确定IOException的原因?   限制Java NIO通道(文件或socket)中的可用内容   javajaxb与JDOM:是否可以使用JAXB更新xml文件   批处理文件到java测试   JavaFX:stage的作用是什么。可设置大小(false)是否会导致额外的页边距?   java有没有办法告诉IntelliJ按需堆叠参数?   java Seam会话范围的组件在下一个请求中消失   java Google Web Toolkit对开发复杂的java脚本有用吗?   安卓 studio java ArrayList正在检索最高值   java为什么递归地用随机数填充LinkedList时会出现StackOverflowException?