2012-01-26 49 views
2

我們有幾個非常非常慢的JUnit測試,它們大量使用嘲諷,包括靜態函數的嘲弄。單次測試需要20-30秒,整個「mvn測試」需要25分鐘。使用PowerMock分析JUnit測試?

我想分析哪些時間浪費了,但在分析中幾乎沒有經驗。

我假設從屬模擬對象的初始化花費太長時間。

兩個問題:

1)如何可以迅速得到號碼哪些方法浪費時間?我不需要複雜的高級用戶工具,只需要一些基本的數據。 (證明我們所做的嘲笑是邪惡的)

2)你有什麼設計缺陷會產生如此糟糕的時機嗎?我們測試應該調用模擬服務的JSF支持bean。也許在後臺bean中可能有一些輸入驗證或不重構的業務邏輯,但不能改變(請不要對此進行評論;-))

ad 2)例如,一個測試約有30(! )類準備用@PrepareForTest進行測試。這不好,但我無法解釋爲什麼。

回答

3

下面是對這個我輸入:使用簡單的東西,如Apache Commons StopWatch class

  1. 嘗試。我發現這是一種很容易找到代碼瓶頸的方法,通常當你找到第一個瓶頸時,其餘的更容易找到。我幾乎不會浪費時間去嘗試配置過於複雜的分析工具。

  2. 我覺得很奇怪你在完全模擬單元測試中有這樣的性能缺陷。如果我猜測我會說你缺少一個或兩個模擬組件,而數據庫或外部Web服務實際上是在你不知情的情況下被調用的。當然,我可能是錯的,因爲我不使用PowerMock,並且我決定不要使用任何靜態方法來模擬任何靜態方法。這是您現在最大的設計缺陷,也是在您的代碼上提供良好測試覆蓋率的最大障礙。那麼該怎麼辦?您有2個選項,您可以將靜態方法重構爲更容易被嘲笑的類方法。另一種選擇是將靜態方法包裝到類對象包裝器中,然後模擬包裝器。如果靜態方法來自沒有源代碼的第三方庫,我通常會這樣做。

  3. one test has about 30 (!) classes to be prepared for test with @PrepareForTest. This cannot be good, but I cannot explain why.這真的聽起來像你也可能有方法是做太多了!在大約99%的情況下,這對於單一方法來說太多依賴。這種方法更可能分爲單獨的更容易測試的方法。

希望這會有所幫助。