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

问题描述

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

公共类 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();
}

这是测试类:

@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 工作。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...