2012-04-27 95 views
5

我有一個JPA/Hibernate/Spring/Tomcat Web應用程序啓用二級數據緩存的性能原因。緩存的功能非常好!休眠第二級數據緩存和集成/驗收測試

我也有一個Cucumber測試套件,它將一些測試數據直接添加到應用程序的數據庫,然後執行一些Selenium步驟。當然,它會失敗,因爲應用程序由於第二級緩存而沒有看到更新。

我知道我可以爲緩存禁用進行特殊構建測試(通過爲Maven過濾或類似方法傳遞一些布爾屬性)但是有很多@Cache註釋實體,所以禁用緩存會導致應用程序失敗,級高速緩存未啓用「。

另一種方法是使用ehcache remoting清除緩存或將其配置爲零對象生存期或類似。

我也只能使用應用程序的UI創建我的測試數據,但是這會增加不必要的複雜性測試案例,所以我寧願試運行之前,並寫入到數據庫。

任何人可以分享他們與二級數據緩存集成測試應用程序的方式啓用?

回答

0

既然你通過Selenium談到功能測試,你應該考慮你的應用程序作爲一個黑盒子,並測試它作爲硒實際上是一個用戶。所以你需要通過Web界面傳遞數據,然後測試應用程序如何處理並在之後顯示。

替代此類應用程序範圍的功能測試將是一個行爲驅動開發,其中包含針對不同組件的測試。這裏的組件是一些從你的控制器開始以DAO結尾的流程(通常DAO在這樣的測試中被模擬,這些測試使它們傳遞得非常快,但沒有測試數據庫的工作情況)。在這種情況下,您有一整套完整的環境測試和大量的BDD測試。

+0

不是所有的,但我的一些BDD測試有以下步驟:創建測試數據,做硒事情,清理。 同意黑盒子,但使用UI創建和清理數據有時非常困難,並且可能使測試彼此依賴(如果與保存有關的UI被破壞,所有其他需要保存的測試也會被破壞) – ike3 2012-04-27 09:10:55

+0

是的,依賴測試會失敗,但主要目的 - 失敗的東西會得到滿足。如果您直接向數據庫填充數據,那麼它本質上不是驗收測試,這不是終端用戶如何使用應用程序。而這樣的測試應該或多或少是粗粒度的。如果您需要更多細粒度的硒,這對Selenium來說可能是一個糟糕的地方。 – 2012-04-27 10:51:29

0

我不得不實施只讀緩存爲少數豆類像國家,地區等的要求..

要檢查,如果他們真的得到緩存我已經寫了集成測試使用的春天。測試不太合適,這只是我想要得到的證明。你可以用它作爲提示並實現你自己的。

您可以瞭解如何編寫使用彈簧集成測試的文章閱讀here

@Configurable(autowire = Autowire.BY_NAME) 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) 
public class HibernateCachingTestIntg { 

    @Autowired 
    private ConfigurationDAO configurationDAO; 

    @Autowired 
    private CountryDAO countryDAO; 

    @Test 
    public void testGetCountries() { 
     for (int i = 0; i < 5; i++) { 
      StopWatch sw = new StopWatch("C"); 
      sw.start(); 
      countryDAO.listCountries(); 
      sw.stop(); 
      System.out.println(sw); 
     } 

    } 

    @Test 
    public void testGetRegionList() { 

     for (int i = 0; i < 5; i++) { 
      StopWatch sw = new StopWatch("R"); 
      sw.start(); 
      configurationDAO.getRegionList(); 
      sw.stop(); 
      System.out.println(sw); 
     } 

    } 
} 

這裏是輸出: -

StopWatch 'C': running time (millis) = 217; [] took 217 = 100% 
StopWatch 'C': running time (millis) = 15; [] took 15 = 100% 
StopWatch 'C': running time (millis) = 16; [] took 16 = 100% 
StopWatch 'C': running time (millis) = 15; [] took 15 = 100% 
StopWatch 'C': running time (millis) = 16; [] took 16 = 100% 

StopWatch 'R': running time (millis) = 201; [] took 201 = 100% 
StopWatch 'R': running time (millis) = 15; [] took 15 = 100% 
StopWatch 'R': running time (millis) = 0; [] took 0 = 0% 
StopWatch 'R': running time (millis) = 16; [] took 16 = 100% 
StopWatch 'R': running time (millis) = 15; [] took 15 = 100% 

正如你可以在這裏看到,查詢需要更多的時間,第一次和更少的時間執行後記。如果您打開查詢記錄器,則可以看到僅第一次觸發了SQL Anywhere 12.0.0.0.0,因此無法啓動SQL查詢記錄器。

+0

謝謝。 Spring-test可以正常工作,因爲它在單個持久性上下文中工作,但驗收測試會在單獨的上下文中插入數據。我的意圖是用一些讀寫緩存實體測試功能邏輯,而不是緩存本身 – ike3 2012-04-27 04:43:05

0

雖然使驗收測試獨立於DB最好它需要太多的改寫,所以我決定目前只創造org.hibernate.cache.Cache和實現org.hibernate.cache.CacheProvider接口非常簡單的實現它什麼都不做充當一個總是空的緩存。

測試版本將這個新的緩存替換爲真正的緩存,使得hibernate註釋和BDD步驟都很開心。

1

如果您需要使用單元測試測試二級緩存,則必須確保關閉會話並在每次調用dao方法時打開它。否則,您將使用僅存在於一個/當前hibernate會話範圍內的第一級緩存。