很久以前,我不得不测试一个生成postscript文件图像的程序。找出程序是否产生正确的预期输出的一种快速方法是将结果的md5与我事先检查过的“已知良好”输出的md5进行比较。
不幸的是,Postscript包含文件中的当前时间。当然,这个时间根据测试运行的时间而不同,因此即使获得预期的输出也会改变结果的md5。作为修复,我只是用sed剥离了日期。
这是一个很好的简单方案。我们并不总是那么幸运。例如,现在我正在编写一个编写程序,它创建了一个包含大量匿名节点和uuids的大胖RDF文件。用简单的md5检查整个程序的功能基本上是不可能的,唯一的方法是用读取器读取文件,然后通过这个阅读器验证输出。正如您可能已经意识到的那样,这会打开一个新的蠕虫:首先,您必须编写一个读取器(这可能非常耗时),其次,您假设读取器在功能上是正确的,同时与编写器同步。如果读者和作者都是同步的,但是在不正确的假设下,读者会说“没问题”,但文件格式实际上是错误的。
当您必须执行文件格式的功能测试时,这是一个常见问题,并且文件格式无法通过您提供的输入完全重现。你是如何处理这个案子的?
答案 0 :(得分:1)
过去我使用第三方应用程序验证此类输出(最好将其转换为其他可以机械验证的格式)。如果不严格正确,使用第三方可确保我的假设至少由他人共享。至少这种方法可用于验证语法。语义正确性可能需要为测试数据创建一个消费者,这可能总是容易出现你提到的“错误的假设”陷阱。
答案 1 :(得分:1)
随机性总是在同一个地方吗?即大多数文件是固定的,但有些部分总是会改变?如果是这样,您可以采用多个输出并使用编程差异来确定不确定性部分。一旦知道这些,您就可以使用这些信息来获得一个掩码,然后进行比较(md5或直接比较)。考虑预处理文件以删除(或用确定性数据覆盖)非确定性的部分。
如果整个文件是非确定性的,那么你将不得不想出一个不同的解决方案。我测试了非确定性的MPEG-2解码器。在那种情况下,我们能够进行PSNR并且如果它超过某个阈值就会失败。根据您的数据,这可能会或可能不会起作用,但类似的东西可能是可能的。