簡體   English   中英

如何從我的java應用程序中運行JUnit測試?

[英]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輕松完成(此類提供此簡單報告)。

請注意使用這種方法的幾個並發症:

  1. 測試任何“測試框架”,包括如此小的測試框架,雖然很簡單,但可能會令人困惑。 例如,如果您想測試當其中一個測試失敗時您的“測試框架”是否返回失敗結果,您可以(應該?)創建始終失敗的示例JUnit測試並使用“測試框架”執行該測試。 在這種情況下,失敗的測試用例實際上是測試數據,不應該作為“普通”JUnit執行。 有關此類測試的示例,您可以參考JUnit的內部測試用例。

  2. 如果你要准備/顯示自定義報表,應該寧可注冊自己的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM