回归测试是PostgreSQL的测试方法之一。
回归测试,需要事先定义好测试脚本(通常是SQL脚本,放在sql目录中),同时定义好调用执行测试脚本的预期正确输出文件(通常放在expected目录中)。
测试使用make check或make installcheck进行,它会通过pg_regress程序调用sql目录中的SQL,并收集输出结果(通常放到results目录中),最后pg_regress会对expected目录和results目录中的文件使用diff进行一一比较。
如果比较发现文件内容不一致,会将不一致的结果输出到regression.diffs文件中,并返回这个TEST CASE failed。
但是这种测试方法实际上有一些需要注意的地方,例如我们使用不同的本地化设置,时区可能得到的结果和期望的结果就不一样。另外有些不可预知的结果,例如随机值,数据的顺序,执行计划和优化器相关参数有关。这些因素都可能导致测试结果和预期不一致,那么我们就需要人为去修复这种failed。

PostgreSQL的主代码测试文件在src/test/regress目录中。
这个目录的结构如下:


```bash
postgres@digoal-> ll -rt
total 1.2M
-rw-r--r-- 1 postgres postgres  579 Jun 10 03:29 standby_schedule    测试standby的调度配置, 其实就是调度sql里的文件名
-rw-r--r-- 1 postgres postgres 2.3K Jun 10 03:29 serial_schedule   串行测试的调度配置
-rw-r--r-- 1 postgres postgres  937 Jun 10 03:29 resultmap  不同的测试平台的结果映射文件,因为不同平台某些测试结果可能不相同,所以一个expected文件不能支持所有的平台。例如浮点数测试。
-rwxr-xr-x 1 postgres postgres 4.4K Jun 10 03:29 regressplans.sh
-rw-r--r-- 1 postgres postgres  20K Jun 10 03:29 regress.c
-rw-r--r-- 1 postgres postgres  159 Jun 10 03:29 README
-rw-r--r-- 1 postgres postgres 2.7K Jun 10 03:29 pg_regress_main.c
-rw-r--r-- 1 postgres postgres 1.6K Jun 10 03:29 pg_regress.h
-rw-r--r-- 1 postgres postgres  69K Jun 10 03:29 pg_regress.c
-rw-r--r-- 1 postgres postgres 3.6K Jun 10 03:29 parallel_schedule  并行测试的调度配置
-rw-r--r-- 1 postgres postgres  624 Jun 10 03:29 Makefile
-rw-r--r-- 1 postgres postgres 5.6K Jun 10 03:29 GNUmakefile
drwxrwxrwx 2 postgres postgres 4.0K Jun 10 03:38 output
drwxrwxrwx 2 postgres postgres 4.0K Jun 10 03:38 input
drwxrwxrwx 2 postgres postgres 4.0K Jun 10 03:38 data   一些测试数据
drwxrwxrwx 2 postgres postgres 4.0K Sep  7 14:51 sql   测试用到的SQL
drwxrwxr-x 2 postgres postgres 4.0K Sep  7 14:52 results   通过pg_regress调用sql目录中的脚本,得到的结果
drwxrwxrwx 2 postgres postgres 4.0K Sep  7 14:51 expected   执行sql目录中的文件对应的正确返回结果

*上层目录结构如下,其中包含了一些其他的测试目标,例如隔离级别的测试,本地化测试,性能测试,线程安全测试。等。这些我会在后面blog中一一介绍

postgres@digoal-> cd /opt/soft_bak/postgresql-9.4.4/src/test
postgres@digoal-> ll
total 36K
drwxrwxrwx  2 postgres postgres 4.0K Jun 10 03:38 examples
drwxrwxrwx  4 postgres postgres 4.0K Jun 10 03:41 isolation
drwxrwxrwx  6 postgres postgres 4.0K Jun 10 03:38 locale
-rw-r--r--  1 postgres postgres  389 Jun 10 03:29 Makefile
drwxrwxrwx  4 postgres postgres 4.0K Jun 10 03:38 mb
drwxrwxrwx  4 postgres postgres 4.0K Jun 10 03:38 performance
drwxrwxrwx  2 postgres postgres 4.0K Jun 10 03:38 perl
drwxrwxrwx 10 postgres postgres 4.0K Sep  7 19:17 regress
drwxrwxrwx  2 postgres postgres 4.0K Jun 10 03:38 thread

接下来我们看看PostgreSQL的回归测试程序pg_regress的用法,它不会安装到PGHOME/bin中,只在src/test/regress中存在。

$ cd src/test/regress
$ src/test/regress/pg_regress --help
PostgreSQL regression test driverUsage:pg_regress [OPTION]... [EXTRA-TEST]...Options:--config-auth=DATADIR     update authentication settings for DATADIR--create-role=ROLE        create the specified role before testing--dbname=DB               use database DB (default "regression")--debug                   turn on debug mode in programs that are run--dlpath=DIR              look for dynamic libraries in DIR--encoding=ENCODING       use ENCODING as the encoding--inputdir=DIR            take input files from DIR (default ".")--launcher=CMD            use CMD as launcher of psql--load-extension=EXT      load the named extension before running thetests; can appear multiple times--load-language=LANG      load the named language before running thetests; can appear multiple times--max-connections=N       maximum number of concurrent connections(default is 0, meaning unlimited)--outputdir=DIR           place output files in DIR (default ".")--schedule=FILE           use test ordering schedule from FILE(can be used multiple times to concatenate)--temp-install=DIR        create a temporary installation in DIR--use-existing            use an existing installationOptions for "temp-install" mode:--extra-install=DIR       additional directory to install (e.g., contrib)--no-locale               use C locale--port=PORT               start postmaster on PORT--temp-config=FILE        append contents of FILE to temporary config--top-builddir=DIR        (relative) path to top level build directoryOptions for using an existing installation:--host=HOST               use postmaster running on HOST--port=PORT               use postmaster running at PORT--user=USER               connect as USER--psqldir=DIR             use psql in DIR (default: configured bindir)The exit status is 0 if all tests passed, 1 if some tests failed, and 2
if the tests could not be run for some reason.Report bugs to <pgsql-bugs@postgresql.org>.

回归测试用法:
在PostgreSQL源码根目录,或者源码的regress目录中执行如下

make check    // 测试时需要初始化数据库集群
make installcheck  // 使用以及启动的数据库集群测试,不需要初始化数据库集群

接下来我们看看调度文件以及sql脚本目录

postgres@digoal-> pwd
/opt/soft_bak/postgresql-9.4.4/src/test/regress
postgres@digoal-> less serial_schedule
# src/test/regress/serial_schedule
# This should probably be in an order similar to parallel_schedule.
test: tablespace
test: boolean
test: char
test: name
test: varchar
test: text
test: int2
test: int4
test: int8

来实际的试一下吧:

postgres@digoal-> pwd
/opt/soft_bak/postgresql-9.4.4/src/test/regress
postgres@digoal-> make installcheck-parallel  //并行测试,使用已经开启的现有的数据库集群
make -C ../../../src/port all
......
../../../src/test/regress/pg_regress --inputdir=. --psqldir='/opt/pgsql9.4.4/bin'    --dlpath=.  --schedule=./parallel_schedule
(using postmaster on /data01/pg_root_1921, port 1921)
============== dropping database "regression"         ==============
DROP DATABASE
============== creating database "regression"         ==============
CREATE DATABASE
ALTER DATABASE
============== running regression test queries        ==============
test tablespace               ... ok
......
parallel group (19 tests):  limit conversion sequence returning without_oid polymorphism copy2 xml prepare plancache rowtypes temp domain with truncate largeobject rangefuncs alter_table plpgsqlplancache                ... oklimit                    ... okplpgsql                  ... okcopy2                    ... oktemp                     ... okdomain                   ... okrangefuncs               ... FAILEDprepare                  ... okwithout_oid              ... okconversion               ... oktruncate                 ... okalter_table              ... oksequence                 ... okpolymorphism             ... FAILEDrowtypes                 ... okreturning                ... oklargeobject              ... okwith                     ... FAILEDxml                      ... ok
test stats                    ... ok
......
=========================22 of 145 tests failed.
=========================The differences that caused some tests to fail can be viewed in the
file "/opt/soft_bak/postgresql-9.4.4/src/test/regress/regression.diffs".  A copy of the test summary that you see
above is saved in the file "/opt/soft_bak/postgresql-9.4.4/src/test/regress/regression.out".make: *** [installcheck-parallel] Error 1

有些测试失败了,diff文件已经输出到/opt/soft_bak/postgresql-9.4.4/src/test/regress/regression.diffs,我们可以查看一下看看为什么测试结果和预期结果不一致。

postgres@digoal-> less regression.diffs
*** /opt/soft_bak/postgresql-9.4.4/src/test/regress/expected/pg_lsn.out 2015-06-10 03:29:38.000000000 +0800
--- /opt/soft_bak/postgresql-9.4.4/src/test/regress/results/pg_lsn.out  2015-09-07 22:45:04.413922536 +0800
***************
*** 72,92 ****generate_series(1, 5) kWHERE i <= 10 AND j > 0 AND j <= 10ORDER BY f;
!                                 QUERY PLAN
! --------------------------------------------------------------------------
!  Sort
!    Sort Key: (((((i.i)::text || '/'::text) || (j.j)::text))::pg_lsn)
!    ->  HashAggregate
!          Group Key: ((((i.i)::text || '/'::text) || (j.j)::text))::pg_lsn->  Nested Loop->  Function Scan on generate_series k
!                ->  Materialize
!                      ->  Nested Loop
!                            ->  Function Scan on generate_series j
!                                  Filter: ((j > 0) AND (j <= 10))
!                            ->  Function Scan on generate_series i
!                                  Filter: (i <= 10)
! (12 rows)SELECT DISTINCT (i || '/' || j)::pg_lsn fFROM generate_series(1, 10) i,
--- 72,90 ----generate_series(1, 5) kWHERE i <= 10 AND j > 0 AND j <= 10ORDER BY f;
......

对于主代码,如果我们需要自定义测试SQL,我们可以修改regress/sql目录下的文件,或者新增文件。同时修改regress/expected目录下的对应期望文件,或者现在期望文件。
如果是新增文件的情况,我们还需要修改调度文件regress/serial_schedule和regress/parallel_schedule,把测试加入调度。

PostgreSQL回归测试工具regress使用相关推荐

  1. php 启动管理工具下载,phpPgAdmin|PostgreSQL管理工具(phpPgAdmin)下载v5.0.4 开源版 - 欧普软件下载...

    phpPgAdmin是一款功能强大的PostgreSQL数据库管理工具,可以对数据库进行多种操作,适用于PostgreSQL多种版本,新版本修复了bug,兼容性和代码清理功能得到了很大的改进,有需要的 ...

  2. 【0173】推荐6款最好使用的PostgreSQL GUI工具

    文章目录 1. 为什么使用GUI工具? 2. PostgreSQL GUI工具 2.1 工具一(开源免费) 2.1.1 使用教程 2.2 工具二(社区免费) 2.2.1 使用教程 2.3 工具三(开源 ...

  3. PostgreSQL数据库管理工具pgAdmin4界面如何设置为中文显示

    首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485130&idx=1 ...

  4. PostgreSQL 管理工具之 pgAdmin

    文章目录 pgAdmin 简介 pgAdmin 特性 下载安装 设置中文界面 连接数据库 我们知道,PostgreSQL 是世界上最先进的开源关系数据库.不过,今天给大家介绍的是一款 PostgreS ...

  5. PostgreSQL 常用工具

    文章目录 管理/开发工具 备份与恢复 集群和复制 驱动和接口 PostgreSQL 衍生版 PostgreSQL 扩展插件 外部数据库 存储过程相关 管理/开发工具 pgAdmin4,基于 Web 的 ...

  6. android 回归测试,自动遍历回归测试工具

    一.Monkey 随机点击200个事件:adb shell monkey -p com.xxxxx.android  200 每秒10个随机事件:adb shell monkey -p com.xue ...

  7. PostgreSQL备份工具pg_dump和pg_dumpall

    PostgreSQL使用 pg_dump 和 pg_dumpall 进行数据库的逻辑备份,pg_dumpall 是对整个数据库集群进行备份,pg_dump 可以选择一个数据库或者部分表进行备份. pg ...

  8. pg数据库日志 linux,Linux下postgresql回归测试

    Note: 如果执行如下步骤出错的话,可以把源代码tar.gz重新解压一下,然后再执行 ./configure --prefix=/home/gaoxueyu/pgsql make 然后在重新执行. ...

  9. PostgreSQL psql工具使用方法

    列出所有数据库 psql -l 连接数据库 psql -h <host or ip> -p <port> [数据库名称] [用户名称] 这些也可以通过环境变量指定:示例如下 ` ...

最新文章

  1. js空对象undefined
  2. iOS开发-Certificates、Identifiers和Profiles详解
  3. (0004) iOS 开发之CocoaPods 升级过程
  4. 覆盖你 80 % 网络生活的,竟是这样一家神秘实验室
  5. pythonslice_shift_Pandas 解决dataframe的一列进行向下顺移问题
  6. kotlin使用代码javaClass或class.java报错:unresolved reference
  7. python math.sinh_Python numpy.sinh()用法及代码示例
  8. python 如何匹配一撇字符_python,yaml如何解析包含撇号的字符串
  9. 《每日一剂》适配器刷新报错adapter.notifyDataSetChanged()解决
  10. Ford-Fulkerson Edmonds-Karp算法
  11. iso硬盘安装 凤凰os_凤凰os系统下载_凤凰系统phoenix os官方下载-188软件园
  12. boll指标详解教了哪些窍门BOLL指标详解之注意事项是什么
  13. 前序遍历 (preorder traversal) - 中序遍历 (inorder traversal) - 后序遍历 (postorder traversal)
  14. Java生成Excel同个表格内换行
  15. 2345王牌浏览器如何使用小窗播放?
  16. 【STM32】:RCC时钟系统
  17. 笔记本能搜索到别人家的WiFi但唯独搜索不到自家的
  18. python怎么撤销_关于Python:Python-如何删除/取消导入之前已导入的库
  19. STG2Seq:多步乘车需求预测的时空图序列模型
  20. Unity3d如何实现四格漫画动态播放

热门文章

  1. 树莓派计算器c语言,树莓派与Python实验9——Tkinter计算器实验
  2. 华为v30怎么升级鸿蒙系统,这四款华为手机可升级到鸿蒙系统,老机型居多,最低只需千元!...
  3. 使用Python处理声音文件(三):剪辑与淡入淡出
  4. 2019TFE计算机科学排名,2019TFE美国会计专业研究生排名前50
  5. Altium Designer(七)已有原理图生成原理图库
  6. Instrument 之 time Profiler
  7. Docker容器修改端口映射
  8. 论文word排版技巧
  9. 物联网是什么?_物联网怎么定义
  10. 用计算机怎么求反三角函数图像及性质,反三角函数图像及性质