【发布时间】:2012-08-10 20:07:00
【问题描述】:
我正在尝试解决以下问题:
我有一个 Java 应用程序(不是我编写的),其目的是获取 2 个报告文件(只是逗号分隔的表格输出),并将文件的每一行和每一列逐个单元格地相互比较 -基本上,用于回归测试。
-
我想用以下功能增强它:
假设我做了一个软件更改,导致 C1 列中的所有值都增加了 100%。
在比较特定列“C1”时,软件当前会报告 C1 中 100% 的值发生了变化。
-
我想要做的是 能够将回归测试器配置为不简单地比较“第 1 行中的 C1 在两个文件中是否相同”,而是应用预先配置的比较规则/公式到现场,例如"确保文件#2 中的 C1 值是文件#1 中 C1 值的 2 倍"。这样,我不仅可以抑制 100% 的虚假回归错误,即每行的 C1 列不匹配,而且还可以使用新软件捕获 C1 列不完全 100% 大的任何实际错误。
李>
以前在 Perl 中编写此类功能时,解决方案非常简单 - 只需将自定义的每列比较器配置编码到存储在配置文件中的 Perl 哈希中,哈希键是列和哈希值是 Perl 子例程,用于以任何我想要的复杂方式比较 2 个值。
显然,这种方法不适用于 Java,因为我无法在 Java 中编写自定义比较器逻辑,并让 Java 在不同的运行时评估/编译/执行这些比较器。
这意味着我需要提出一些特定领域的可解释语言,我的不同之处将解释/评估/执行。
由于我对 Java 生态系统和库不是很熟悉,所以我问:
为可配置的比较器逻辑实现此 DSL 有什么好的解决方案?
我的要求是:
解决方案必须“像啤酒一样免费”
-
解决方案必须是“收缩包装”。例如。一个现有的库,我可以简单地放入我的代码中,添加配置文件,然后让它工作。
要求我编写自己的 BNF 语法并提供我必须编写自己的解释器的通用语法解析器的东西是不可接受的。
-
就数据处理和语法丰富而言,解决方案必须相当灵活。例如:
您至少应该能够从 DSL 中传入和引用/寻址一整行数据作为哈希
它应该有相当完整的语法;至少进行基本的字符串操作(连接、子字符串,理想情况下是某种级别的正则表达式匹配和替换);基本算术,包括在浮点 #s 上执行
abs(val1 - val2) > tolerance的能力;以及基本的流程控制/逻辑,例如条件和理想循环。
解决方案应该相当快,并且必须是可扩展的。例如。比较 100x100 大小的文件与 10-20 个自定义列不应该花费 10 分钟。
如果重要的话,目标环境是 Java 1.6
【问题讨论】:
-
尝试一种可嵌入的脚本语言,例如 SISC 或 Jython。
标签: java interpreter dsl evaluation