![](/img/trans.png)
[英]How do I programmatically run all the JUnit tests in my Java application?
[英]How do I run JUnit tests from inside my java application?
是否可以從我的java應用程序中運行JUnit測試?
是否有我可以使用的測試框架(例如JUnit.jar?),或者我是否強制查找測試文件,調用方法並自己跟蹤異常?
我之所以要問的是我的應用程序需要大量的工作來啟動啟動(許多依賴項和配置等),並且使用外部測試工具(如JUnit Ant任務)需要大量的工作來設置。
啟動應用程序更容易,然后在應用程序內運行我的測試。
是否有一個簡單的測試框架,可以在java應用程序中運行測試和輸出結果,還是我被迫編寫自己的框架?
是的你可以。 我正在做幾次在生產系統中運行診斷/煙霧測試。 這是調用JUnit的代碼的關鍵部分的片段:
JUnitCore junit = new JUnitCore();
Result result = junit.run(testClasses);
不要在應用程序中使用JUnit.main
,它會在測試完成后調用System.exit
,因此可能會停止JVM進程。
您可能想要捕獲JUnit的“常規”控制台輸出(點和簡單報告)。 這可以通過注冊TextListener
輕松完成(此類提供此簡單報告)。
請注意使用這種方法的幾個並發症:
測試任何“測試框架”,包括如此小的測試框架,雖然很簡單,但可能會令人困惑。 例如,如果您想測試當其中一個測試失敗時您的“測試框架”是否返回失敗結果,您可以(應該?)創建始終失敗的示例JUnit測試並使用“測試框架”執行該測試。 在這種情況下,失敗的測試用例實際上是測試數據,不應該作為“普通”JUnit執行。 有關此類測試的示例,您可以參考JUnit的內部測試用例。
如果你要准備/顯示自定義報表,應該寧可注冊自己的RunListener
,因為JUnit的返回結果中不包含有關通過測試和測試方法(直接)的信息(這是唯一的“硬編碼”作為測試的一部分Description
)。
如JUnit FAQ中所述 :
public static void main(String args[]) {
org.junit.runner.JUnitCore.main("junitfaq.SimpleTest");
}
我之所以要問的是我的應用程序需要大量的工作來啟動啟動(許多依賴項和配置等),並且使用外部測試工具(如JUnit Ant任務)需要大量的工作來設置。
您需要從正在測試的代碼中刪除這些依賴項。 依賴關系和配置正是您在編寫測試框架時要避免的。 對於每個測試,您應該定位應用程序中最小的可測試部分。
例如,如果您需要數據庫連接來執行您嘗試測試的類中的某個進程 - 將數據庫處理對象與類分離,通過構造函數或setter方法傳遞它,並在測試中使用像JMock這樣的工具(或編寫存根類)來構建虛假的數據庫處理對象。 這樣您就可以確保測試不依賴於特定的數據庫配置,並且您只測試您感興趣的一小部分代碼,而不是整個數據庫處理層。
一開始看起來似乎很多工作,但這種重構正是你的測試框架應該充實的。 您可能會發現將軟件測試書作為解耦依賴關系的參考資料很有用。 與嘗試從正在運行的應用程序中引導JUnit相比,它將獲得更多回報。
在JUnit 5中,您可以使用Launcher API實現此目標。
final LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request()
.selectors(
selectPackage("path_to_folder_with_tests")
)
.build();
final Launcher launcher = LauncherFactory.create();
final boolean pathContainsTests = launcher.discover(request).containsTests()
if (!pathContainsTests) {
System.out.println("This path is invalid or folder doesn't consist tests");
}
final SummaryGeneratingListener listener = new SummaryGeneratingListener();
launcher.execute(request, listener);
final TestExecutionSummary summary = listener.getSummary();
final long containersFoundCount = summary.getContainersFoundCount();
System.out.println("containers Found Count " + containersFoundCount);
final long containersSkippedCount = summary.getContainersSkippedCount();
System.out.println("containers Skipped Count " + containersSkippedCount);
final long testsFoundCount = summary.getTestsFoundCount();
System.out.println("tests Found Count " + testsFoundCount);
final long testsSkippedCount = summary.getTestsSkippedCount();
System.out.println("tests Skipped Count " + testsSkippedCount);
根據JUnit API,JUnitCore有幾種方法可以在Java中執行測試。
感謝Tomislav Nakic-Alfirevic指出它。
http://junit.sourceforge.net/javadoc/org/junit/runner/JUnitCore.html
Result result = JUnitCore.runClasses(classes);
請參閱http://junit.sourceforge.net/javadoc/org/junit/runner/JUnitCore.html#runClasses(java.lang.Class ...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.