node.js - 创建一个单元测试两个检查两个 psql 模式是否相同

标签 node.js database postgresql unit-testing

我的这个项目有一个巨大的数据库架构,有时会更新。

所以我有一个名为 schema.sql 的文件,其中包含当前架构,以及一个包含我随时间部署的所有补丁的目录(称为 patches/20160710.sql,带有一个名为 origin.sql 的第一个模式的文件。

如果我进行全新安装,我会使用 schema.sql,否则我会在更新时应用补丁。

我有测试服务器,在更新生产模式之前我会在其中进行测试,并且我已经自动化了几乎所有的事情。到目前为止效果很好。

不幸的是,一旦我写了一个不同的东西去 schema.sql 并在补丁中。我的单元测试仅针对新数据库运行,因此测试没有失败,我只是在测试服务器上尝试补丁时才发现错误。

我想编写一个采用 schema.sql 的单元测试,部署它,并将该架构与应用于 origin.sql 的所有补丁生成的架构进行比较.

我还需要检查一些表是否具有相同的值。

数据库是postgresql,软件是node.js。

测试由 Gitlab CI 使用自定义 docker 图像运行,所以我真的可以用更好的语言进行测试。

当然,补丁和 schema.sql 都有相同的数据库名称,所以我想我必须应用 schema.sql,以某种方式转储它, 然后删除数据库并从补丁中重新创建它,再次转储它并比较结果。

这种方法是否有意义,或者是否有更好的方法来实现我正在做的事情?

如果这有意义,转储两个数据库并进行比较的好方法是什么?

最佳答案

感谢Abelisto的提示我做了一个类似于这个的脚本(我的 bash-fu 不太好,所以请随意改进它):

#!/bin/bash
ORIGINAL_DB="tmp1"
INCREMENTAL_DB="tmp2"
SCHEMA="schema"

function clean_up {
  sudo -u postgres dropdb ORIGINAL_DB
  sudo -u postgres dropdb INCREMENTAL_DB
  sudo -u postgres createdb ORIGINAL_DB
  sudo -u postgres createdb INCREMENTAL_DB
}

function import_schemas {
  sudo -u postgres psql ORIGINAL_DB < database/sql/schema.sql

  for f in database/sql/patches/*.sql ; do
    [[ -f "$f" ]] || continue
    sudo -u postgres psql INCREMENTAL_DB < $f
  done
}

function compare_schemas {
  sudo -u postgres pg_dump ORIGINAL_DB --schema=SCHEMA --schema-only > foo1.sql
  sudo -u postgres pg_dump INCREMENTAL_DB --schema=SCHEMA --schema-only > foo2.sql
  line_diff=$(diff foo1.sql foo2.sql | egrep '^<|>' | wc -l)

  if [ $line_diff -ne 0 ]
  then
    diff foo1.sql foo2.sql
    exit -1
  fi
}

function compare_values {
  sudo -u postgres psql ORIGINAL_DB -c "SELECT * FROM roles_permissions ORDER BY idrole, idpermission;" > data1.txt
  sudo -u postgres psql INCREMENTAL_DB -c "SELECT * FROM roles_permissions ORDER BY idrole, idpermission;" > data2.txt

  line_diff=$(diff data1.txt data2.txt | egrep '^<|>' | wc -l)

  if [ $line_diff -ne 0 ]
  then
    exit -1
  fi
}

clean_up
import_schemas
compare_schemas
compare_values

exit 0

关于node.js - 创建一个单元测试两个检查两个 psql 模式是否相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38291121/

相关文章:

javascript - 使用多行时 Json 解析问题

java - Java 中的 DriverManager.getConnection 使用相对路径

php - 有没有一种方法可以在不运行MAMP的情况下访问mysql数据库?

sql - 在一个输出中合并两个表

javascript - 函数不返回 pg-pool 结果

javascript - 直接调用类而不是通过实例变量

sql - 如何以数据透视格式获取 sql 查询?

python - 即使我在环境变量上添加了 pg_config 的路径,仍然出现错误 : pg_config executable not found.

postgresql - 临时表创建在 jasperserver 中不起作用(无法在只读事务中执行 CREATE TABLE)

javascript - 忽略 Node 中 HTTP 请求的 header 验证