2016-03-04 19 views
0

我們有一個奇怪的問題。我們正在使用自動測試工具。 DSL在斯卡拉實施。我們用這個工具測試的系統是用Java編寫的,兩個組件之間的接口是RMI。事實上,自動測試工具的界面部分也是Java(其餘部分是Scala)。我們完全控制這些組件的源代碼。Scala中的零星java.lang.NoClassDefFoundError

我們已經擁有了數千個測試用例。我們每天晚上自動執行這些測試用例,在Linux服務器上使用Jenkins。問題是我們偶爾會收到java.lang.NoClassDefFoundError例外。這通常發生在嘗試從Scala代碼訪問Java工件時發生。

如果我們手動執行相同的測試用例,或者檢查下一次夜間運行的結果,那麼問題通常會自動解決,但有時它會再次發生在完全不同的地方。在某些運行情況下,根本不會出現這種問題。最大的問題是錯誤不可重現;此外,正如在自動運行情況下發生的那樣,我們幾乎沒有關於確切情況的任何信息,只是測試用例和日誌。

有人遇到過這樣的問題嗎?你有什麼想法如何繼續?任何提示或信息都將有所幫助,不僅是問題的解決方案。謝謝!

+0

你如何構建你的Scala組件和Java? Java工件有時可能還沒有被編譯,而Scala代碼有,並且正在嘗試運行它。 – diginoise

+0

我們使用Maven完成構建和運行過程。感謝提示!我將檢查是否可能發生測試用例在一個進程中運行,而另一個進程只是編譯Java代碼。理論上這不應該發生,但是,理論和實踐可能會有所不同...... –

+0

請確保將每種語言的構建器附加到相應的Maven構建階段。這是一個使用scala插件的例子:http://davidb.github.io/scala-maven-plugin/example_java.html – diginoise

回答

0

我找到了錯誤的原因(99%肯定)。我們有以下2項詹金斯工作:

  1. Job1:執行完全乾淨的構建測試系統,用Java編寫的,則執行完全乾淨的構建DSL,最後執行測試用例。這是一項長期工作(約5小時)。
  2. Job2:執行測試系統的完全清理版本,然後執行其他操作。 DSL不涉及。這是一個較短的工作(〜1小時)。

我們有一個單一的Maven倉庫所有的工作。此外,被測組件的某些部分是這兩個組件之間接口的一部分。

考慮到時間戳以下事情發生了:

  1. Job1執行這兩個組件的全力打造,並開始包含若干測試用例的測試套件,執行持續約半小時。
  2. 垃圾收集器可能會掃出尚未使用的組件。
  3. Job2開始構建,它還重建了接口部分,包括由垃圾回收器Job1掃出的部分。
  4. Job1到達了一個測試案例,它使用了一個已經被清除的接口組件。

解決方案是以下幾點:我們搬到Job2到一個較早的時間;現在它在Job1開始測試之前完成作業。