如何从我的java应用程序中运行JUnit测试?

时间:2010-03-30 08:54:22

标签: java testing junit

是否可以从我的java应用程序中运行JUnit测试?

我是否可以使用测试框架(例如JUnit.jar?),还是我强制查找测试文件,调用方法并自己跟踪异常?

我之所以要问的是我的应用程序需要大量的工作来启动启动(许多依赖项和配置等)并且使用外部测试工具(如JUnit Ant任务)需要大量的工作来设置

启动应用程序更容易,然后在应用程序内运行我的测试。

是否有一个简单的测试框架可以在java应用程序中运行测试和输出结果,还是我被迫编写自己的框架?

6 个答案:

答案 0 :(得分:82)

是的,你可以。我正在做几次在生产系统中运行诊断/烟雾测试。这是调用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)的一部分。

答案 1 :(得分:13)

如JUnit FAQ中所述:

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

答案 2 :(得分:10)

  

我问的原因是我的   应用程序需要大量工作   开始发布(很多依赖和   配置等)并使用   外部测试工具(如JUnit Ant   任务)需要做很多工作   建立。

您需要从正在测试的代码中删除这些依赖项。依赖关系和配置正是您在编写测试框架时要避免的。对于每个测试,您应该定位应用程序中最小的可测试部分。

例如,如果您需要数据库连接来执行您尝试测试的类中的某个进程 - 将数据库处理对象与类分离,通过构造函数或setter方法传入,并在测试中使用像JMock(或写一个存根类)的工具来构建一个虚假的数据库处理对象。这样您就可以确保测试不依赖于特定的数据库配置,并且您只测试您感兴趣的一小部分代码,而不是整个数据库处理层。

起初看起来似乎很多工作,但这种重构正是你的测试框架应该充实的东西。您可能会发现将软件测试书作为解耦依赖关系的参考资料很有用。与尝试从正在运行的应用程序中引导JUnit相比,它将获得更多回报。

答案 3 :(得分:5)

在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);

答案 4 :(得分:2)

根据JUnit API,JUnitCore有几种方法可以在Java中执行测试。

感谢Tomislav Nakic-Alfirevic指出它。

http://junit.sourceforge.net/javadoc/org/junit/runner/JUnitCore.html

答案 5 :(得分:1)