繁体   English   中英

有没有办法在 postgres 测试容器中删除所有表或截断

[英]Is there a way to drop all tables or truncate inside a postgres testcontainer

我正在寻找一种方法来保持我的组件测试自包含。 因此,为了实现这种行为,在某些测试中,我需要有一个“干净的数据库”或至少一个“干净的表”。 我仍然找不到在测试容器中执行此操作的方法。 所以这是我迄今为止尝试过的:我的容器设置 class:

公共 class PostgreSqlTestContainer 实现 QuarkusTestResourceLifecycleManager {

public static final PostgreSQLContainer<?> POSTGRES = new PostgreSQLContainer<>("postgres:alpine");

@Override
public Map<String, String> start() {
    POSTGRES.start();         
    return some_db_config_as_per_doc;
}

@Override
public void stop() {        
    POSTGRES.stop();
}

这是测试 class:

@QuarkusTest
@QuarkusTestResource(PostgreSqlTestContainer.class)
class UserResourcesTest {

  @Test
  scenario_one(){
     // create a new user
     // do some stuff (@POST.. check HTTP == 201) 
  }

  @Test
  scenario_two(){
     // create new user
     // do some stuff (@POST.. check HTTP == 201) (pass)
     // look for all users on database
     // do more stuff (@GET..  check HTTP == 200) (pass)
     // assert that only 1 user was found
     // since scenario_one should not interfere with scenario_two (fail)
  }

}

第二种情况失败,因为第一次测试中的一些“脏”仍在 db 容器上。 我试图为每个测试停止/启动容器。 (非常非常慢的过程,有时我会出错,然后又很慢)。

    @BeforeEach
    void setup(){
        PostgreSqlTestContainer.POSTGRES.stop();
        PostgreSqlTestContainer.POSTGRES.start();
    }

还尝试截断表/删除整个数据库:

    @Inject
    EntityManager entityManager;

    @BeforeEach
    private void rollBack(){
        truncate();
    }

    void truncate(){
      Query nativeQuery = entityManager.createNativeQuery("DROP DATABASE IF EXISTS db_name");
      nativeQuery.executeUpdate();
    }

我正在寻找解决此问题的任何方法,我只想在每次测试之前以某种方式使用@BeforeEach清理数据库。 我的意思是,我想要的只是为每个测试提供一个干净的环境。

创建一个名为test_template的模板测试数据库。

每次测试后,

  1. 从测试数据库断开所有会话(PostgreSQL v13 不需要):

     SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'test';
  2. 删除数据库

    DROP DATABASE test;

    在 v13 中,使用附加的FORCE选项。

  3. 创建一个新的测试数据库

    CREATE DATABASE test TEMPLATE test_template;

注意:您必须在 JDBC 驱动程序中启用自动提交才能使CREATE DATABASEDROP DATABASE工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM