由于某些测试天生会产生依赖环境的结果,我们提供了指定备用 “预期”结果文件的方法。每个回归测试都可以有多个比较文件, 用来展示不同平台上的可能结果。对于每个测试应使用哪个比较文件,有两种 相互独立的判定机制。
第一种机制允许针对特定平台选择比较文件。有一个映射文件 src/test/regress/resultmap,用于定义每个平台应使用 哪个比较文件。要为某个特定平台消除虚假的测试“失败”, 你需要先选择或创建一个变体结果文件,然后在resultmap 文件中增加一行。
映射文件中的每一行都采用如下形式:
testname:output:platformpattern=comparisonfilename
测试名就是相应回归测试模块的名称。输出值指明要检查哪个输出文件。 对标准回归测试而言,这里始终是out。该值对应于 输出文件的扩展名。平台模式是 Unix 工具expr风格 的模式(也就是在开头隐含^锚点的正则表达式)。 它会与config.guess打印出的平台名进行匹配。 比较文件名则是替代结果比较文件的基名。
例如:某些系统会把极小的浮点数值解释为零,而不是报告下溢错误。这会导致float8回归测试出现一些差异。因此,我们提供了一个变体比较文件float8-small-is-zero.out,其中包含这些系统上的预期结果。为了消除虚假的“失败”消息,在OpenBSD平台上,resultmap包含以下内容:
float8:out:i.86-.*-openbsd=float8-small-is-zero.out
如果一台机器上的config.guess输出匹配i.86-.*-openbsd,就会触发该规则。resultmap中的其他行会为其他适用的平台选择变体比较文件。
第二种用于选择变体比较文件的机制更加自动化:它只是在多个提供的比较文件 中选取“最佳匹配”。回归测试驱动脚本既考虑某个测试的标准 比较文件, 也考虑名为 testname.out 的变体文件(其中testname_digit.outdigit可以是任一单个数字 0-9)。如果其中任何一个文件 完全匹配,就认为测试通过;否则,会使用生成最短 diff 的那个文件来创建 失败报告。(如果resultmap为该特定测试包含一项, 那么基础testname就是 resultmap中给出的替代名称。)
例如,对于char测试,比较文件 char.out包含在C和 POSIX区域设置中应当出现的结果,而文件 char_1.out则包含在许多其他区域设置中出现的排序结果。
最佳匹配机制原本是为了解决依赖区域设置的结果问题,但它也可以用于任何 仅凭平台名无法轻易预测测试结果的场景。该机制的一个局限是,测试驱动器 无法判断哪一个变体对当前环境才真正“正确”;它只会选择 看起来最合适的那个。因此,最安全的做法是只对那些你愿意在所有上下文中 都视为同样有效的变体结果使用这种机制。