2016-11-05 65 views
1

我正在研究一個集中使用集成測試的應用程序,因爲我們使用的核心框架在數據庫上運行。彈性集成測試清理衝突的配置上下文

我有使用配置上下文類如此測試類:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = ConfigA.class) 
public A_Test(){ 

} 

大多數測試使用相同的上下文等的上方。我們有超過200多個這樣的測試。但最近,我們需要一些使用情況下,一些額外的配置,以及像這樣:現在

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {ConfigA.class, ConfigB.class}) 
public B_Test(){ 

} 

問題是,當我們與Maven,或IDE亞軍,爲ConfigA不再起作用加載緩存執行所有測試。 Spring試圖爲ConfigA重新創建一個上下文,因爲我們已經配置了H2數據庫,並且Spring試圖創建模式,而這些模式卻無法實現。

爲了克服,我們開始在所有測試中使用@DirtiesContext。結果超過1H構建時間,這顯着降低了開發人員的生產力。

問題:是否可以清除像B_Test這樣的測試的上下文? @DirtiesContext(ClassMode = AFTER_CLASS)沒有幫助,因爲測試的順序不能保證(實際上我們不想這樣)。當B_Test測試的類型最後運行時,它會失敗。相同的@DirtiesContext(ClassMode = BEFORE_CLASS)反之亦然

是否有可能在一堆測試中同時模擬@DirtiesContext(ClassMode = AFTER_CLASS)和@DirtiesContext(ClassMode = BEFORE_CLASS)?

或者還有其他方法可以解決這個問題嗎?

我們試着到目前爲止:

  1. Junit的套房:沒有什麼幫助與Spring上下文
  2. ContextHierarchies:沒跟B_Type測試也弄髒的背景下
  3. 測試的情況下幫助排序:沒有人真的很高興重構所有的測試,使其神奇
+0

能否請您添加您的連接字符串? –

回答

2

如何使用@DirtiesContext(ClassMode = AFTER_CLASS)和@DirtiesContext(我thodMode = BEFORE_METHOD)?

當你這樣做時,Spring會在調用用@DirtiesContext(MethodMode = BEFORE_METHOD)註解的測試方法之前重新加載上下文ConfigA.class和ConfigB.class。 然後,在完成B_Test的所有測試後,Spring關閉上下文(並且SpringJUnit4ClassRunner的下一個測試類將加載它的上下文)。

+0

嗯,我們仍然有彈簧版本4.1.9實際上從來沒有能夠嘗試before_claass。我會試試 –

0

這實質上是Make Spring Boot Recreate Test Databases的重複。

總之,您可能只需確保爲每個使用ConfigA類創建的嵌入式數據庫使用唯一名稱。

請點擊這裏閱讀我的意見的細節:https://stackoverflow.com/a/28867247/388980

而且,看到的評論中SPR-8849進一步的細節。

問候,

山姆(Spring的TestContext框架的作者)

+0

我檢查過,但我認爲在我的情況下的基本問題是這樣的:'@ContextConfiguration(classes = {ConfigA.class,ConfigB.class})'爲此,Spring不會重用已緩存的ConfigA.class以前用'@ContextConfiguration(classes = ConfigA.class)'進行的測試。我認爲確定緩存Spring使用'classes'作爲整體的關鍵。難以分開識別緩存嗎? –