2011-10-09 106 views
7

我是一個Web開發人員,最終在一些Java EE開發(Richfaces,Seam 2,EJB 3.1,JPA)中工作。要測試JPA,我使用超音速和Mockito。但是我缺乏更深入的EJB知識。在TDD中,爲什麼要使用OpenEJB以及爲什麼使用Arquillian?

有人可能會爭辯說,我們應該使用OpenEJB和Arquillian,但爲什麼? 我什麼時候需要做容器依賴性測試?我需要OpenEJB和Arquillian的可能測試場景是什麼?

請賜教:)

回答

11

在這種情況下有兩個方面。

  1. 單元測試。這些旨在非常快速(在幾秒鐘內執行整個測試套件)。他們測試你的代碼的非常小的塊 - 即一種方法。爲了達到這種粒度,你需要使用Mockito來模擬整個環境。你不感興趣:
    • 調用的EntityManager並把實體到數據庫中,
    • 測試交易,
    • 使異步調用,
    • 擊中JMS端點等

你嘲笑這整個環境,只是單獨測試每種方法。 單元測試細化爲,速度非常快。這是因爲您可以在每次對代碼進行重要更改時執行它們。如果它們更加複雜和耗時,開發者不會像他應該那樣頻繁地點擊'測試'按鈕。

  1. 積分測試。這些速度較慢,因爲您要測試模塊之間的集成。你想測試,如果他們適當地「講」給對方,即:
    • 是你期望的方式傳播的交易,
    • ,如果你沒有交易調用你的業務方法都發生了什麼,
    • 是否從您的WebServices客戶端發送更改,確實遇到了您的端點方法,並將數據添加到數據庫?
    • 如果我的JMS端點拋出ApplicationException - 它會正確回滾所有更改嗎?

正如你看到的,集成測試是粗粒度和他們在容器正在執行(或基本上是:在生產環境中)他們要慢得多。這些測試通常不會在每次代碼更改後由開發人員執行。

當然,您可以在嵌入模式下運行EJB容器,就像您可以在Java SE中執行JPA一樣。重點在於人工環境爲您提供了基本的服務,但您將以調整爲結束,並且仍然以比實際容器更少的靈活性結束。

Arquillian使您能夠在您選擇的容器上創建生產環境,並在此環境中執行測試(使用數據源,JMS目標以及您期望在生產環境中看到的大量其他配置)。 )

希望它有幫助。

+0

謝謝,perf等答案。 JMS部分對我來說尤其有趣。 –

+0

很高興我可以有任何幫助:-) –

+2

良好的寫作。我很好奇「關鍵在於人爲環境給你提供的基本服務,但你最終會調整它,並且仍然以比實際容器更少的靈活性結束」的意思是。 EJBContainer API背後的想法是,您正在使用真正的EJB容器。遵守或行爲不應有任何差異。 –

0

今年我參加了Devoxx,並有機會回答JBOSS問題。 一些測試場景(我所管理的東西塗抹下):

  • 容器的配置
  • 集裝箱集成
  • 事務邊界
  • 實體回調方法
  • 集成測試
  • 硒錄音
相關問題