3

很久以前,我不得不测试一个生成 postscript 文件图像的程序。确定程序是否产生正确的预期输出的一种快速方法是对结果进行 md5 以与我事先检查的“已知良好”输出的 md5 进行比较。

不幸的是,Postscript 包含文件中的当前时间。当然,这个时间会根据测试运行的时间而有所不同,因此即使获得了预期的输出,也会改变结果的 md5。作为修复,我只是用 sed 去掉了日期。

这是一个美好而简单的场景。我们并不总是那么幸运。例如,现在我正在编写一个编写器程序,它创建一个包含一堆匿名节点和 uuid 的大型 RDF 文件。用一个简单的 md5 基本上不可能检查整个程序的功能,唯一的办法就是用阅读器读取文件,然后通过这个阅读器验证输出。正如您可能意识到的那样,这打开了一个新的蠕虫罐:首先,您必须编写一个阅读器(这可能很耗时),其次,您假设阅读器在功能上是正确的,同时与编写器同步。如果读取器和写入器同步,但假设不正确,读取器会说“没问题”,但文件格式实际上是错误的。

当您必须对文件格式执行功能测试时,这是一个普遍问题,并且文件格式不能通过您提供的输入完全重现。你如何处理这个案子?

4

2 回答 2

1

过去,我使用第三方应用程序来验证此类输出(最好将其转换为可以机械验证的其他格式)。使用第三方可以确保我的假设至少被其他人共享,如果不是严格正确的话。至少这种方法可以用来验证语法。语义正确性可能需要为测试数据创建消费者,这可能总是容易出现您提到的“不正确假设”陷阱。

于 2009-12-09T18:03:48.970 回答
1

随机性总是在同一个地方吗?即大部分文件是固定的,但有些部分总是会改变?如果是这样,您可能能够获取多个输出并使用编程差异来确定非确定性部分。一旦知道这些,您就可以使用这些信息来导出掩码,然后进行比较(md5 或直接比较)。考虑预处理文件以删除(或用确定性数据覆盖)不确定的部分。

如果整个文件是不确定的,那么您将不得不提出不同的解决方案。我对非确定性的 MPEG-2 解码器进行了测试。在这种情况下,我们能够进行 PSNR,但如果它高于某个阈值则失败。根据您的数据,这可能会或可能不会起作用,但可能会有类似的事情。

于 2009-12-12T09:33:04.247 回答