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