2011-06-11 101 views
0

我有集成測試(該碼頭下運行),我打開頁面(通過使用Selenium)不可見的,您對本活動的該記錄被添加到數據庫(HSQL)。但它不起作用 - JPA(Hiberante)添加了記錄(我在日誌中看到它),但是當我執行SELECT查詢時根本沒有記錄。功能測試:在數據庫更改測試

測試用例:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { 
    "classpath:spring/DispatcherServletContext.xml" 
}) 
@TransactionConfiguration(defaultRollback = false) 
public class WhenUserOpenNotExistingPage 
    extends WhenUserAtAnyPage<NotFoundErrorPage> { 

    private final String currentUrl; 

    @Autowired 
    private SuspiciousActivityDao suspiciousActivities; 

    private String generateRandomUrl() { 
     return String.format(
      "/tests/page-does-not-exists-%s.htm", 
      RandomStringUtils.randomNumeric(5) 
     ); 
    } 

    public WhenUserOpenNotExistingPage() { 
     currentUrl = generateRandomUrl(); 
     page.open(currentUrl); 
    } 

    @Test 
    @Transactional(readOnly = true) 
    public void incidentShouldBeLoggedToDatabase() { 
     SuspiciousActivity activity = 
      suspiciousActivities.findByPage(currentUrl); 

     assertNotNull(activity); 
    } 
} 

而且WhenUserOpenNotExistingPage()(constructorr)調用兩次(我不知道爲什麼會發生,可能是我的問題的根源)。

你能幫我嗎? 在此先感謝!

回答

0

我假設你要添加的東西在測試情況下,數據庫和同一數據庫正在使用由碼頭上運行應用程序。如果您的數據庫使用任何高於read uncommited的隔離級別,則在測試用例完成之前,您在測試用例中所做的更改將不可見。這是因爲您的數據庫代碼會加入在測試開始時創建的事務。

默認該測試事務回滾測試完成後回來,所以變化是當前測試(事務)內可見的,但是不可見的外部(由不同的線程/連接)和被回滾。您可以利用defaultRollback = false屬性更改默認的行爲,但只有改變了你在一個測試做出這種手段是不是由Web應用程序(不同的數據庫連接)可見,但將是可見的在後續的測試(提交後)。不是很有用。

您有幾種選擇:

  • 擺脫春季事務性測試的支持。這意味着Spring不會在每次開始測試時創建一個新的事務,並且不會執行提交/回滾。現在,在實際啓動SElenium測試之前,何時開始事務並提交它將由您決定。

這可以很容易地通過更換@TransactionConfiguration來完成:

@TestExecutionListeners({DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class}) 

這將覆蓋默認的測試執行監聽器,從堆棧

  • 你可以從不同的運行安裝程序代碼來移除TransactionalTestExecutionListener螺紋或者與傳播REQUIRES_NEW

  • 最後,您應該考慮在JUnit之外進行設置。也許你可以從應用程序本身進行設置?

至於構造函數 - 每個測試創建JUnit測試類的新實例。 JUnit的作者聲稱,通過在運行每個測試之前清理測試類,它使得測試更具可預測性和無狀態性(測試之間沒有依賴關係)。在實踐中,尤其是在集成測試中,這比一個優勢更加痛苦。

通過如果你在測試一些數據庫操作並提交更改,注意測試依賴的方式。在JUnit中不保證執行測試的順序。這意味着一個測試中的更改不應該影響其他測試。