簡體   English   中英

使用 Spring Boot 和 Liquibase 時,如何在每次集成測試后清理數據庫表?

[英]How to clean database tables after each integration test when using Spring Boot and Liquibase?

我有一個附帶項目,我正在使用 Spring Boot、Liquibase 和 Postgres。

我有以下測試序列:

test1();
test2();
test3();
test4();

在這四個測試中,我正在創建相同的實體。 由於我沒有在每個測試用例之后從表中刪除記錄,因此出現以下異常: org.springframework.dao.DataIntegrityViolationException

我想通過以下約束來解決這個問題:

  1. 我不想使用@repository來清理數據庫。
  2. 我不想殺死數據庫並在每個測試用例上創建它,因為我正在使用 TestContainers,這樣做會增加完成測試所需的時間。

簡而言之:如何在每個測試用例之后從一個或多個表中刪除記錄,而無需 1)使用每個實體的@repository和 2)在每個測試用例上殺死並啟動數據庫容器?

我發現執行此操作的最簡單方法如下:

  1. 注入一個 JdbcTemplate 實例
@Autowired
private JdbcTemplate jdbcTemplate;
  1. 使用 class JdbcTestUtils 從您需要的表中刪除記錄。
JdbcTestUtils.deleteFromTables(jdbcTemplate, "table1", "table2", "table3");
  1. 在您的測試 class 中使用@After@AfterEach注釋的方法中調用此行:
@AfterEach
void tearDown() throws DatabaseException {
    JdbcTestUtils.deleteFromTables(jdbcTemplate, "table1", "table2", "table3");
}

我在這篇博文中找到了這種方法: 使用 Testcontainers 進行輕松集成測試

使用 @DataJpaTest 注釋您的測試@DataJpaTest 從文檔中:

默認情況下,使用 @DataJpaTest 注釋的測試是事務性的,並在每個測試結束時回滾。 他們還使用嵌入式內存數據庫(替換任何顯式或通常自動配置的數據源)。

例如使用 Junit4:

@RunWith(SpringRunner.class)
@DataJpaTest
public class MyTest { 
//...
}

使用 Junit5:

@DataJpaTest
public class MyTest { 
//...
}

您可以在測試方法上使用 @Transactional。 這樣,每個測試方法都將在其自己的事務括號內運行,並在下一個測試方法運行之前回滾。

當然,這僅在您沒有對手動事務管理做任何奇怪的事情時才有效,並且它依賴於一些 Spring 引導自動配置魔術,因此可能無法在每個用例中使用,但它通常是高性能且非常簡單的隔離測試用例的方法。

我認為這是 postgreSQL 最有效的方法。 你可以為其他數據庫做同樣的事情。 只需找到如何重新啟動表序列並執行它

@Autowired
private JdbcTemplate jdbcTemplate;

@AfterEach
public void execute() {
    jdbcTemplate.execute("TRUNCATE TABLE users" );
    jdbcTemplate.execute("ALTER SEQUENCE users_id_seq RESTART");
}

我個人的偏好是:

private static final String CLEAN_TABLES_SQL[] = {
    "delete from table1",
    "delete from table2",
    "delete from table3"
};

@After
public void tearDown() {
    for (String query : CLEAN_TABLES_SQL)
    {
        getJdbcTemplate().execute(query);
    }
}

為了能夠采用這種方法,您需要使用 DaoSupport 擴展 class,並在構造函數中設置 DataSource。

public class Test extends NamedParameterJdbcDaoSupport

public Test(DataSource dataSource)
{
    setDataSource(dataSource);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM