2014-01-08 57 views
1

是否有Java測試庫支持以下場景?JUnit:尋找@before方法和個人測試方法之間的通信路徑

假設您必須爲基於數據庫的Web應用程序(例如使用Selenium)編寫Web瀏覽器測試。一個典型的測試將具有以下流程:

  • 插入測試數據,以DB
  • 運行測試邏輯(打開網頁瀏覽器,瀏覽地方,操縱的東西,是否顯示正確的事情驗證,驗證如果DB狀態改變正確)
  • 清除DB

尤其是在這種集成測試的情況下,你經常會需要一套複雜多樣的對象只是剛剛運行的Web應用程序(例如,您需要一個用戶帳戶,業務與產品相關的東西,oders,.. )。爲保持測試彼此獨立並且能夠並行運行測試,您希望爲每個測試創建此對象網絡,可能使用僞隨機對象屬性(如user.name="user_123")。

現在,在我看來,做好每個測試都要重複的事情的好地方,是一種註解方法。但是,如果@Before方法插入DB狀態,測試方法將不知道如何訪問該狀態,例如,如何找到用戶對象創建的方法@Before。最好有一種測試方法上下文,它由@Before方法設置,並且可以被測試方法使用。

我想過自己實現這樣的東西,也許是一個簡單的靜態hashmap,測試方法名稱爲key,但可能已經有一個庫提供此功能並且您知道它;-)。

+1

我不明白你的想法。你希望你的測試獨立並且平行地運行。每個測試前都會運行'@ Before'內的代碼。因此,只測試可以在'@ before'方法中創建的所有測試共用的數據。爲什麼你不能在測試方法本身內創建非常特定於個別測試的其他測試數據? – thiyaga

+0

因爲即使_common_數據不是特定測試的對象,也可能受測試方法的影響。考慮用戶帳戶和兩項測試:1)一項測試(作爲副作用)導致用戶帳戶被停用,2)測試創建訂單。如果兩個測試都依賴於相同的用戶對象,則測試不會是獨立的,儘管用戶對象不是這些測試的主題。因此,我想擁有不同的用戶帳戶對象,但不希望在每個測試中重複創建(即使不是輔助方法)。這就是爲什麼我想使用@before方法 – rainer198

回答

0

rainer198,而不是「清除數據庫」,你可以回滾TX。我用這種方式來解決這個問題,它更加乾淨,但顯然它依賴於你的行爲。

在春天,我使用

@Transactional //This annotation tells the Spring test runner to always roll back each transaction it creates. 
@TransactionConfiguration(defaultRollback = true) 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = "/spring/common-main-test.xml") 
+0

也想過這個。但是,它在我的集成測試場景中真的有用嗎?請注意,我有兩個事務:測試方法和測試運行的已部署Web應用程序中的一個:只要未提交測試事務,應用程序就不會看到測試數據,對嗎? – rainer198

+0

是的,它看不到!但是,您可以將隔離級別(僅用於測試)設置爲在ordre中未提交以允許DIRTY READ。 – venergiac

+0

好的,但後來我終於在骯髒的測試依賴關係再次;-) – rainer198

1

你實際上是在那裏。事實上,我們在我們的產品(HP ALM)中使用完全相同的技術進行集成測試。

在您的測試類中,將由@Before方法生成的任何標記存儲在成員中,並在測試中使用它們。

爲了不對每個集成測試類重複這一點,我們定義了一個包含所有上下文和初始化邏輯的基類,並且我們只是使用測試代碼進行擴展。

此基類可以擴展您可能正在使用的任何其他測試基礎(例如AbstractJUnit4SpringContextTests)。