用于测试的最小postgres实例

时间:2012-12-07 22:22:45

标签: java postgresql testing jdbc

我有一些代码通过JDBC与postgres数据库交互。但是,出于测试目的,我只想快速创建一个新数据库并连接到它,而无需修改我的全局postgres安装,管理用户等。人们通常如何进行这种测试?

4 个答案:

答案 0 :(得分:7)

我找到initdb可执行文件并使用它来创建当前用户可写的新数据库实例临时存储。由于它是一个测试实例,因此请使用类似initdb --auth=trust --username=postgres -D /path/to/temp/datadir的内容,以便将新数据库设置为接受连接而无需密码。

使用pg_ctl启动服务器,指定一个端口来覆盖生成的postgresql.conf中的默认设置并避免冲突。

连接到新的数据库集群并执行所需的任何工作。您需要先以用户postgres身份进行连接,然后在将控制权转交给测试代码之前运行所有必需的CREATE USERCREATE DATABASE命令。

最后,使用pg_ctl来停止它,最后删除数据目录。

initdb上只需要pg_ctlPATH,以及管理服务器的助手类。

请参阅:

答案 1 :(得分:5)

有几个库可以创建Postgres的临时实例,以便于测试:

所有这些都被设计为关闭并自动删除临时数据库。这是您可以使用pg_tmp(1)从Java创建最小Postgres实例的方法:

import java.io.*;
import java.sql.*;

public class test_pg
{
    public static void main(String args[])
    {
        try {
            Process p = Runtime.getRuntime().exec("pg_tmp -t");
            BufferedReader input = new BufferedReader
                    (new InputStreamReader(p.getInputStream()));
            String pg_uri = "jdbc:" + input.readLine();
            input.close();
            System.out.println("Using " + pg_uri);
            Connection conn = DriverManager.getConnection(pg_uri);
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("select now()");
            while(rs.next()) {
                System.out.print(rs.getString(1));
            }
        } catch(IOException | SQLException e) {
            e.printStackTrace();
        }
    }
}

答案 2 :(得分:0)

您可以在主目录中安装Postgres实例,在不同的端口和用户下运行。请参见此处:

http://www.bacula.org/manuals/en/catalog/catalog/Installi_Configur_PostgreS.html

你也可以在Heroku上测试你的代码,具体取决于它是什么。他们免费为您提供一个小型虚拟Postgres数据库。

答案 3 :(得分:0)

虚拟机

您可以提前配置安装了OSBSD(例如LinuxPostgres等)。将此模板用作要作为虚拟机启动的映像。

您可以使用ParallelsFusionVirtualBox之类的桌面虚拟化在本地执行此操作。

或者您可以在VM服务(例如DigitalOcean.com)中完成此操作。

数据库迁移工具

一旦虚拟机启动并运行(可能需要一分钟),然后使用database migrationFlyway之类的Liquibase工具来安装架构,表,列和数据。

这些工具可以clear your database的内容重复使用。有一个设置可以确保不能在生产环境中使用此功能(!)。

请注意,这些工具可以自动创建数据库 中的所有内容,但不能执行CREATE DATABASE。为此,您将需要执行其他一些脚本编写,或者已经创建了一个空的测试数据库。而且,正如我所说,您可以清除数据库以供重用。