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

cor*_*ath 53 java testing junit

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

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

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

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

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

kop*_*per 86

是的你可以.我正在做几次在生产系统中运行诊断/烟雾测试.这是调用JUnit的代码的关键部分的片段:

JUnitCore junit = new JUnitCore();
Result result = junit.run(testClasses);
Run Code Online (Sandbox Code Playgroud)

不要JUnit.main在应用程序内部使用,它会System.exit在测试完成后调用,因此可能会停止JVM进程.

您可能想要捕获JUnit的"常规"控制台输出(点和简单报告).这可以通过注册TextListener(此类提供此简单报告)轻松完成.

请注意使用这种方法的几个并发症:

  1. 测试任何"测试框架",包括如此小的测试框架,虽然很简单,但可能会令人困惑.例如,如果您想测试当其中一个测试失败时您的"测试框架"是否返回失败结果,您可以(应该?)创建始终失败的示例JUnit测试并使用"测试框架"执行该测试.在这种情况下,失败的测试用例实际上是测试数据,不应该作为"普通"JUnit执行.有关此类测试的示例,您可以参考JUnit的内部测试用例.

  2. 如果要准备/显示自定义报告,则应该注册自己的报告RunListener,因为JUnit返回的结果不包含(直接)有关传递的测试和测试方法的信息(它仅作为测试的一部分"硬编码" Description).

  • 以下是在main中启动JUnit并在标准输出中具有基本输出的代码:`JUnitCore junitCore = new JUnitCore(); junit.addListener(new TextListener(System.out)); junit.run(<yourTestClass> .class);`抱歉格式,但这是我在评论中可以做的最好的.:) (3认同)

Tom*_*vic 15

如JUnit FAQ中所述:

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


sea*_*ges 10

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

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

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

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


mak*_*son 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);
Run Code Online (Sandbox Code Playgroud)