PostgreSQL7.0手册-管理员手册-33. 数据库恢复 34. 蜕变测试
本节需要有人来写.愿做志愿者吗?(译注:在(升级)安装,配置和磁盘存储等章节有一些相关内容可以参考,不过确实缺乏灾难恢复的材料。:()
--------------------------------------------------------------------------------
第三十四章. 蜕变测试
内容
蜕变测试环境
蜕变测试过程
蜕变分析
平台相关的比较文件
蜕变测试指导和分析.
PostgreSQL 蜕变测试是由一套复杂完整的测试,用来测试嵌入在 PostgreSQL 里的的SQL实现.它同时测试标准 SQL 操作和 PostgreSQL 的扩展SQL.
蜕变测试有两种不同的运行方式:"串行"方式和"并行"方式.串行方式顺序运行每个测试脚本,而并行方式同时启动多个服务器进程以并行运行多组测试.并行测试使我们对进程内部通讯和锁的正确工作有足够的信心.另一个主要区别是串行方式测试过程使用一套已经安装了的 postmaster,而并行测试过程测试一套已经制作完成但是还没有安装的系统.(并行测试脚本实际上安装到一个临时目录然后在那里启动一个私有的 postmaster.)
有一些正确安装并且具有完整功能的 PostgreSQL 可能会在蜕变测试中失效,这些主要是因为浮点数的形式和时区支持的问题.目前的测试只是简单的用 "diff" 算法进行评估,因而对一些细小的系统区别很敏感.当一项测试报告"failed"("失败")时,只要检查一下预期和实际的结果,你就会发现区别区别并不大.
蜕变测试最初是由 Jolly Chen 和 Andrew Yu 开发的,并且由 Marc Fournier 和 Thomas Lockhart 做了大量的修改/封装。从 PostgreSQLv6.1 开始,每个官方发布的版本都带有蜕变测试.
蜕变测试环境
下面的蜕变测试做了如下假设 (除注明的以外):
命令是 Unix-兼容的.见下面的注释.
除了注明的以外,使用的是缺省值.
postgres 用户是 Postgres 超级用户.
源文件路径是 /usr/src/pgsql (也可以是其他路径).
运行时间路径是 /usr/local/pgsql (其他路径也可能).
通常,蜕变测试应该以 postgres 用户身份运行,因为 'src/test/regress' 目录和子目录是由 postgres 所有的.如果你要以其他用户身份运行蜕变测试,那么该用户应该对目录 'src/test/regress' 有写权限.
以前必须把系统时区设置为 PST 运行 postmaster,不过现在不需要这样了。你可以在你自己的正常的 postmaster 配置里运行蜕变测试。测试脚本将设置 PGTZ 环境变量以确保与时区无关的测试将产生预期的结果。不过,你的系统必须提供对 PST8PDT 时区的库支持,否则时区无关测试将失败。要证实你的系统的确包括这个支持,键入:
setenv TZ PST8PDT
date
上面的 "date" 命令应该返回当前系统在 PST8PDT 时区的时间.如果 PST8PDT 的数据库不可用,那么你的系统应该以 GMT 返回时间.如果 PST8PDT 时区不可获得,你可以显式设置时区规则:
setenv PGTZ PST8PDT7,M04.01.0,M10.05.03
蜕变测试的目录布局如下:
表 34-1. 目录布局
目录 描述
目录 描述
input 利用 make all 将 .source 文件转换成的 'sql' 子目录里面的一些 .sql 文件
output 利用 make all 将 .source 文件转换成的在 expected 子目录里面的 .out 文件
sql 用于执行蜕变测试的 .sql 文件
expected 代表我们*期望看到*的结果的 .out 文件
results 表示结果的*实际*样子的 .out 文件同时还用于表拷贝测试的临时存储空间
tmp_check 并行测试脚本创建的临时安装目录
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
蜕变测试过程
下面命令在 RedHat Linux v 4.2 上用 bash shell 测试过.除了注明的外,它们应该可以在大多数系统上工作.象 ps 和 tar 这样的命令在不同平台上的参数可能有较大的不同.根据常识 使用这些命令.
Postgres 蜕变测试
用下面命令制作蜕变测试所需要的文件:
cd /usr/src/pgsql/src/test/regress
gmake clean
gmake all
如果是你第一次运行测试,你不需要键入 "gmake clean" .如果这是你第一次运行蜕变测试,你可以忽略 "gmake clean".
这个步骤把一个带有 PostgreSQL 的 C 程序编译成共享库.本地化的 SQL 脚本和输出比较文件同样也为测试而创建.本地化把源文件里的宏替换为绝对路径名和用户名.
如果你想使用"串行"测试过程(它测试一个已经安装的 postmaster),先确保 postmaster 已经运行了,可以在一个窗口里键入
postmaster
或者通过键入下面命令把 postmaster 守护运行在后台
cd
nohup postmaster > regress.log 2>&1 &
后者可能更好一些,因为蜕变测试日志将会相当长( 在下Postgres 7.0 里,60K左右),如果出错了,你可以查看这些日志.
注意:不要以 root 身份运行 postmaster.
运行蜕变测试.对于串行测试,键入
cd /usr/src/pgsql/src/test/regress
gmake runtest
对于并行测试,键入
cd /usr/src/pgsql/src/test/regress
gmake runcheck
串行测试使用你的已经在运行的 postmaster 运行测试脚本.并行测试将进行一次完整的 Postgres安装,把 postgres 安装到一个临时目录里,然后在那里运行一个自己的 postmaster,再运行测试脚本.最后它会卸载自己的 postmaster (不过临时目录不会自动删除).
你将在屏幕上(和输出文件 ./regress.out)获取一系列标明哪项测试通过和那些失败的输出.请注意因为平台相关的变化,有些测试"失败"是很正常的.参阅下一节获取关于那些失败是真正重要的描述.
有些测试,尤其是 "numeric",可能要花相当长的时间,尤其是在慢的平台上.请保持耐心.
在测试和检查结果完成后,键入
cd /usr/src/pgsql/src/test/regress
gmake clean
以回收测试使用的临时磁盘空间,如果你运行了一个串行测试,还要键入
dropdb regression
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
蜕变分析
实际测试结果在 ./results 目录里的文件里.这些结果会与 ./expected 目录里的预期结果用 'diff'进行对比.任何区别都为你保存在 ./regression.diffs 里。(或者如果你愿意地话,你可以自己手工运行diff)
这些文件可能不能精确地匹配.测试脚本把任何区别当作“失败”报告,“失败” 的测试的失败原因可能是因为微小的跨平台的错误信息,数学库,或输出格式等的差别.这类"失败" 并不表明 Postgres 有问题.
因此,有必要对每个“失败”的测试的实际差别进行检查,以发现这是否是一个真正的问题。下面的段落会试着提供一些判断这些区别的重要与否的指导。
错误信息差别
有一些蜕变测试涉及到有意的非法输入值.错误信息可能会来自 Postgres 代码或来自主机平台系统路径.对于后者,信息可能在平台之间区别比较大,但应该反映相似的信息.这些信息上的差别将会导致一个"失败"的蜕变测试,我们可以通过检查文件发现这一点.
日期和时间差别
大多数日期和时间结果依赖于时区环境变量。参考文件是为时区 PST8PDT (伯克利,加州)准备的,因而如果测试没有设置为那个时区是显然会失败的。蜕变测试的驱动器把环境变量 PGTZ 设置为 PST8PDT 以保证正确的测试。
如果你在改为夏时制的日切日或者该天的前天或者后天测试时,在 "timestamp" 测试里的一些查询可能失败.这些查询假设昨天午夜,今天午夜和明天午夜之间的间隔是精确的 24 小时... 如果是夏时制开始或结束的日切日,这些(假设)是错的.
有些系统不能接受我们推荐的显式设置时区的语法;在这样的机器上你可能要用不同的 PGTZ 设置。
有些使用旧的时区库的系统在对 PDT 1970 年前的时间使用夏时制时会出毛病,导致 PDT 1970年以前的时间显示为 PST。这会导致在测试结果里的本地化区别。
浮点数差别
有些测试涉及到对表中的数据列进行 64位 (float8)计算的问题.我们观察了涉及到 计算 float8 字段的数学函数的结果的差别.float8 和 geometry(几何类型)测试尤其容易在不同平台之间产生小差别。这时需要肉眼对这些差别进行比较,以判断这些差别究竟有多大,我们发现是在小数点右边10位数。
有些系统在 pow() 和 exp() 出错时产生的信号与目前 Postgres 代码里期望的机制不一样.
多边形差别
有些测试涉及到关于加州奥克兰/伯克利街区图的地形数据(译注:原文是'date',怀疑是'data').这些地图数据是用多边形表达的,多边形的顶点使用一对 float8 数据表示的(数字纬度和经度).一开始,先创建一些表再把地理数据装入,然后创建一些用多边形相交的操作符(##)联合的两个表的视图,最后对视图进行选择操作.对比平台不同产生的差异,差异发生在小数点右边第二位和第三位以后.出现问题的 SQL 语句是下面几条:
QUERY: SELECT * from street;
QUERY: SELECT * from iexit;
随机数差别
在 random.out 里至少有一个测试会产生随机结果.这会导致回归测试中的随机测试失败(可能每五次到十次出现一次).键入
diff results/random.out expected/random.out
会产生仅仅一行或几行差别.你不必担心这些,除非随机测试总是失败.(另一方面,如果在多次蜕变测试中随机测试从来不失败,你可能也要担心.)
“预期的”文件
./expected/*.out 文件是从最早的单个的由 Jolly Chen 提供的 expected.input 文件修改出来的.为不同开发平台生成的这些文件的更新版本在经过仔细(?)的检查后代替了原先的.许多这样的开发机运行着在 Ix86 硬件上的 Unix OS 的变种 (FreeBSD,Linux等).最初的 expected.input 文件是在一台使用 postgres5-1.02a5.tar.gz 源码树的 SPARC Solaris 2.4 系统上生成的.我们将它与在一台 I386 Solaris 2.4 系统上生成的文件进行对比,发现只有多边形浮点数小数点右边第三位数后有差别(参阅后文).最初的 sample.regress.out 文件来自 Jolly Chen 构建的 postgres-1.01 版本,我们在这里一起附上以供参考.该文件可能是在一台 DEC ALPHA 机器上创建的,因为 postgres-1.01 版本的Makefile.global 文件里有 PORTNAME=alpha.
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
平台相关的比较文件
因为一些测试天生会产生平台相关的结果,我们提供了一个方法以支持平台相关的结果比较文件。通常,一套文件可用于多个平台;而不是为每个平台提供一套独立的比较文件,因此存在一个定义选用哪个比较文件的映射文件。所以,要消除某特定平台的虚假的测试“失败”,你必须选择或者制作一个结果文件的变种,然后往映射文件里加一行,即是"resultmap"。
映射文件里的每行都有下面形式
testname/platformnamepattern=comparisonfilename
测试名称只是特定蜕变测试模块的名称。平台名称模式是一个 expr(1) 风格的模式(也就是说,一个开头带有显式^锚符号的规则表达式)。它与 config.guess 打印的平台名匹配。比较文件名是替换结果比较文件。
例如:int2 蜕变测试包括一个有意的超过 int2 范围的数值的输入。产生的错误信息是平台相关的;我们的参考平台显示
ERROR: pg_atoi: error reading "100000": Numerical result out of range
但是相当多其他 Unix 平台显示
ERROR: pg_atoi: error reading "100000": Result too large
因此,我们提供一个比较文件的变种,int2-too-large.out,该文件包含这样的错误信息的写法。要消除在 HPPA 平台上的虚假“错误”信息,resultmap 包括
int2/hppa=int2-too-large
这样将在 config.guess 的输出以 'hppa' 开始的任何机器上触发。其他 resultmap 里的行选择对应其他平台合适的比较文件。
--------------------------------------------------------------------------------