如何从Java应用程序内部运行JUnit测试?

dgjrabp2  于 2022-11-11  发布在  Java
关注(0)|答案(6)|浏览(169)

是否可以从Java应用程序内部运行JUnit测试?
有没有我可以使用的测试框架(比如JUnit.jar?),或者我被迫自己查找测试文件、调用方法和跟踪异常?
我这样问的原因是我的应用程序需要大量的工作才能启动(大量的依赖项和配置等),而使用外部测试工具(如JUnit Ant任务)将需要大量的工作来设置。
启动应用程序,然后在应用程序内部运行我的测试会更容易。
是否有一个简单的测试框架可以在Java应用程序内部运行测试并输出结果,或者我是否被迫编写自己的框架?
如何从Java应用程序内部运行JUnit测试?

ztyzrc3y

ztyzrc3y1#

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

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

请勿在应用程序中使用JUnit.main,它会在测试完成后调用System.exit,因此可能会停止JVM进程。

您可能希望捕获JUnit的“常规”控制台输出(点和简单报告),这可以通过注册TextListener(该类提供了这个简单报告)轻松完成。
请注意使用这种方法的几个并发症:
1.测试任何“测试框架”,包括这么小的一个,虽然很简单,但可能会让人感到困惑。例如,如果您想要测试当其中一个测试失败时,您的“测试架构”是否会传回失败结果,您可以(是否应该?)创建总是失败的JUnit测试样例,并使用“测试框架”执行该测试。在这种情况下,失败的测试用例实际上是测试数据,不应该作为“正常”执行JUnit.有关此类测试得示例,您可以参考JUnit得内部测试用例.
1.如果你想准备/显示你的自定义报告,你应该注册你自己的RunListener,因为由JUnit返回的Result不包含(直接)关于通过的测试和测试方法的信息(它只是作为测试Description的一部分被“硬编码”)。

jq6vz3qz

jq6vz3qz2#

如JUnit常见问题解答中所述:

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

qnakjoqk3#

我问这个问题的原因是我的应用程序需要大量的工作才能启动(大量的依赖项和配置等),而使用外部测试工具(如JUnit Ant任务)将需要大量的工作来设置。
您需要从正在测试的代码中删除这些依赖项。依赖项和配置正是您在编写测试框架时要尽量避免的。对于每个测试,您都应该以应用程序中最小的可测试部分为目标。
例如,如果您需要一个数据库连接来执行您正在尝试测试的类中的某个进程--将数据库处理对象从类中分离出来,通过构造函数或setter方法将其传入,并在测试中使用JMock之类的工具(或者写一个stub类)来构建一个假的数据库处理对象,这样你就可以确保测试不依赖于一个特定的数据库配置,并且您只测试了感兴趣的一小部分代码,而不是整个数据库处理层。
一开始可能看起来工作量很大,但是这种重构正是测试框架应该充实的内容。你可能会发现,找一本关于软件测试的书作为解耦依赖关系的参考是很有用的。它比试图从运行的应用程序内部引导JUnit要有更大的回报。

0md85ypi

0md85ypi4#

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

iqih9akk5#

根据JUnit API,JUnitCore有几种方法可以在Java内部执行测试。
感谢托米斯拉夫·纳基奇-阿尔菲雷维奇指出这一点。
http://junit.sourceforge.net/javadoc/org/junit/runner/JUnitCore.html

hk8txs48

hk8txs486#

Result result = JUnitCore.runClasses(classes);

请参阅:http://junit.sourceforge.net/javadoc/org/junit/runner/JUnitCore.html执行类别(java.lang.Class..)

相关问题