-->

针对Java JUnit测试嵌入式PostgreSQL的(Embedded PostgreSQL f

2019-07-18 04:03发布

是否有一个嵌入的PostgreSQL这样我们就可以单元测试我们的PostgreSQL的驱动程序?

因为PostgreSQL有一些方言,最好使用嵌入式PostgreSQL的本身比其他嵌入式数据库。

嵌入式并不一定意味着它必须嵌入在JVM进程。 它也并不一定需要使用内存中的持久性。 它应该会自动由依赖管理(Maven的,摇篮)被加载,从而使单元测试可以无需安装和配置本地PostgreSQL服务器每台机器上运行。

Answer 1:

没有,没有嵌入的PostgreSQL,在意义上的进程可加载数据库作为一种库。 PostgreSQL是面向过程; 每个后端有一个线程,它产生多个进程做工作。 它不”有意义的图书馆。

该H2数据库支持PostgreSQL的SQL方言的有限子集和使用PgJDBC驱动程序。

可以做的是initdb一个新的临时数据库 ,启动它pg_ctl一个随机端口,因此不会与其他实例相冲突,运行测试,然后使用pg_ctl来阻止它,最后删除临时数据库。

强烈建议你运行一个非默认端口上的临时的Postgres这样你就不会冒险与任何本地安装PostgreSQL的运行测试机器上的碰撞。

在感(有 “内嵌的PostgreSQL ECPG ,本质上嵌入C 源代码作为基础预处理C语言扩展PostgreSQL的客户端 ,它仍然需要一个正在运行的服务器,这是一个有点坏坏地使用,不推荐使用。它主要存在于使从各种其他数据库更容易移植。)



Answer 2:

的是,已被设计为从Java单元测试的“嵌入” PostgreSQL的服务器:

https://github.com/yandex-qatools/postgresql-embedded

嵌入式PostgreSQL将提供在单元测试运行Postgres的二进制的平台中立的方式。 大部分的代码已经从制作梦话OSS的嵌入过程

顺便说一句,也存在类似的项目蒙戈 , Redis的 , Memcached的和的NodeJS 。



Answer 3:

我试图通过@btiernay(Yandex的-qatools)建议项目。 我花了好几天这一点,没有它的过去设计的解决方案,因为我想从内部存储库,而不是去二进制文件下载到公共互联网不以我的情况下工作的任何罪行。 从理论上讲,它支持它,但实际上并非如此。

OpenTable的嵌入式PostgreSQL的组件

最后我用otj-PG-嵌入式和它的作品就像一个魅力。 有人在意见中提到,所以我想我会在这里提到它。

我用它作为独立的数据库,而不是通过两个单元测试和地方发展规律。

相关性:

<dependency>
    <groupId>com.opentable.components</groupId>
    <artifactId>otj-pg-embedded</artifactId>
    <version>0.7.1</version>
</dependency>

码:

@Bean
public DataSource dataSource(PgBinaryResolver pgBinaryResolver) throws IOException {
    EmbeddedPostgres pg = EmbeddedPostgres.builder()
        .setPgBinaryResolver(pgBinaryResolver)
        .start();


    // It doesn't not matter which databse it will be after all. We just use the default.
    return pg.getPostgresDatabase();
}

@Bean
public PgBinaryResolver nexusPgBinaryResolver() {
    return (system, machineHardware) -> {
        String url = getArtifactUrl(postgrePackage, system + SEPARATOR + machineHardware);
        log.info("Will download embedded Postgre package from: {}", url);

        return new URL(url).openConnection().getInputStream();
    };
}

private static String getArtifactUrl(PostgrePackage postgrePackage, String classifier) {
    // Your internal repo URL logic
}


Answer 4:

如果你正在寻找运行从集成(或相似)测试套件的进程内版本的Postgres中, PostgreSQL的嵌入为我工作得很好。

我写了一个小Maven插件 ,可以用来作为围绕PostgreSQL的嵌入的分支版本行家包装。



Answer 5:

您可以使用一个容器的PostgreSQL的实例。

由于旋转的容器是几秒钟的事,这应该是单元测试不够好。 此外,如果你需要保留的数据,例如调查,你并不需要保存整个容器,只有数据文件,它可以在容器外映射。

一个例子是如何做到这一点的,可以发现在这里 。



文章来源: Embedded PostgreSQL for Java JUnit tests