2010-03-30 64 views
37

是否可以從我的Java應用程序中運行JUnit測試?如何從我的Java應用程序內部運行JUnit測試?

是否有我可以使用的測試框架(如JUnit.jar?),還是我強制查找測試文件,調用方法並自行跟蹤異常?

我問的原因是我的應用程序需要大量的工作來啓動啓動(大量的依賴和配置等),並使用外部測試工具(如JUnit Ant任務)需要很多工作來設置向上。

啓動應用程序更容易,然後在應用程序內運行我的測試。

有沒有一個簡單的測試框架,運行測試和從java應用程序內輸出結果,或者我被迫寫我自己的框架?

+0

你可以嘲笑你的資源或其他什麼,在java應用程序中運行測試對我來說沒有任何意義..看看jmock.org – ant 2010-03-30 08:59:11

回答

74

是的,你可以。我曾多次在生產系統中運行診斷/煙霧測試。這是代碼調用的JUnit的重要組成部分的一個片段:

JUnitCore junit = new JUnitCore(); 
Result result = junit.run(testClasses); 

切勿使用JUnit.main你的應用程序中,它調用System.exit後,測試完成,因此它可能會停止JVM進程。

您可能想要捕獲JUnit的「常規」控制檯輸出(點和簡單報告)。這可以通過註冊TextListener輕鬆完成(本課提供這個簡單的報告)。

也請注意使用這種方法的一些併發症:

任何「測試框架」的
  1. 測試,包括這麼小一個,雖然是很簡單的可能會產生混淆。例如,如果要測試其中一個測試失敗時「測試框架」是否返回失敗結果,則可以(應該?)創建始終失敗的樣本JUnit測試,並使用「測試框架」執行該測試。在這種情況下,失敗的測試用例實際上是測試數據,不應該作爲「正常」的JUnit執行。對於這種測試的例子,您可以參考JUnit的內部測試用例。

  2. 如果您想準備/顯示您的自定義報告,則應該註冊您自己的RunListener,因爲JUnit返回的Result不包含(直接)關於通過的測試和測試方法的信息(它只是「硬編碼」測試Description的一部分)。

+0

這太棒了。我試圖讓自定義的JUnit測試套件在自定義的Web服務器上運行,因此我可以設置一些cronjob來啓動單元測試並每晚彙報結果;這正是我希望找到的。 – 2015-05-01 20:55:13

+1

以下是在您的主體中啓動JUnit並在標準輸出中具有基本輸出的代碼: 'JUnitCore junitCore = new JUnitCore(); junit.addListener(new TextListener(System.out)); junit.run( .class);'抱歉的格式,但這是我能做的最好的評論。 :) – RobMcZag 2016-04-12 15:44:18

11

由於在JUnit FAQ記載:

public static void main(String args[]) { 
    org.junit.runner.JUnitCore.main("junitfaq.SimpleTest"); 
} 
10

之所以我問的是我的 的應用需要大量的工作 開始啓動(大量依賴和 配置等),並使用 外部測試工具(如JUnit的螞蟻 任務)需要大量的工作來設置 。

您需要從您正在測試的代碼中刪除這些依賴關係。編寫測試框架時,依賴關係和配置正是你想要避免的。對於每項測試,您都應該瞄準應用程序中最小的可測試部分。

例如,如果您需要數據庫連接來執行您正在測試的類中的某個進程 - 從您的類中分離數據庫處理對象,通過構造函數或setter方法將其傳遞,並在測試中使用像JMock這樣的工具(或者寫一個存根類)來構建一個假的數據庫處理對象。通過這種方式,您可以確保測試不依賴於特定的數據庫配置,而只是測試您感興趣的代碼的一小部分,而不是整個數據庫處理層。

它看起來像很多工作,但這種重構正是你的測試框架應該充實的東西。您可能會發現將軟件測試的書作爲解耦您的依賴關係的參考很有用。它會比試圖從正在運行的應用程序中引導JUnit更多。

相關問題