2017-01-30 65 views
4

我用遷飛來管理我的Spring MVC應用我的數據庫的狀態測試之間的數據庫。Spring MVC的 - 清潔利用遷飛

我已經在我的servlet上下文XML文件中配置完全相同的their docs

<bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate"> 
    <property name="dataSource" ref="..."/> 
    ... 
</bean> 

<!-- The rest of the application (incl. Hibernate) --> 
<!-- Must be run after Flyway to ensure the database is compatible with the code --> 
<bean id="sessionFactory" class="..." depends-on="flyway"> 
    ... 
</bean> 

的建議我想要做的兩件事情在我的JUnit測試 -

  1. 一次,前所有測試,刪除並重新創建數據庫並讓其重新遷移。這爲每個測試套件創建一個乾淨的數據庫。

  2. 每次測試之前,清理所有的數據庫表。在其他框架(例如RSpec/Rails)中,我通過事務性地運行DB語句來完成此操作,以便在測試結束時回滾。不確定Spring MVC世界中的最佳實踐。

我不知道從哪裏開始實施上述,所以任何指導表示讚賞。

謝謝!

回答

8

首先,你可以前每個測試像下面清理數據庫:

@Autowired 
Flyway flyway; 

@Before 
puublic void init(){ 
    flyway.clean(); 
    flyway.migrate(); 
} 

其次,你可以利用JdbcTestUtils的從表中刪除所有行。 請在這裏找到的文檔:JDBC測試支持https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html

,你還可以使用@Rollback @Commit和運行測試方法事務

@Rollback指示是否交易對於事務性測試方法,應在測試方法完成後回滾。如果爲true,則交易回滾;否則,交易被提交(另見@Commit)。即使未明確聲明@Rollback,Spring TestContext框架中集成測試的回滾語義也會默認爲true。

+0

我發現人工清理遷移最可靠和防彈第一種選擇。它解決了如果在每次測試之前數據庫沒有返回到原始狀態,那麼測試可能會相互影響的問題。 – alebu

2

我的團隊使用SpringBoot。它具有內置的Flyway集成。以下任何內容都不一定依賴於SpringBoot,但使用SpringBoot確實可以使其中一些更容易。

對於使用Flyway進行集成測試,我們使用Spring Test以及內存H2數據庫。我們使用Spring Profiles來定義它具有H2 JDBC配置一個「integation測試的個人資料。爲每個測試啓動容器。因此,每個測試都會得到由Flyway創建的乾淨架構。因爲,它在H2的記憶中都沒有清理。也不需要可能影響測試行爲的事務欺騙。

有一個Flyway/Spring Test annotation library,如果你真的想跳上牀,所以在你的集成測試說話,用遷飛。

+0

@FlywayTest註釋對於清除每個測試之間的數據庫狀態並不好,因爲它必須(當前)明確地添加到每個需要以乾淨的版本開始的測試中。將它添加到測試類將只運行一次,大概在第一次測試之前。看來,那麼https://stackoverflow.com/a/41929329/854151將是這種用例的更好解決方案。 –