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

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

是否可以从我的Java应用程序内部运行JUnit测试?

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

我要问的原因是我的应用程序需要大量的工作来启动启动(很多依赖项和配置等),而使用外部测试工具(如JUnit Ant任务)将需要大量的工作来设置。

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

是否有一个简单的测试框架可以从Java应用程序内部运行测试并输出结果,还是我不得不编写自己的框架?

corgrath asked 2020-01-18T11:27:25Z

6个解决方案

85 votes

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

JUnitCore junit = new JUnitCore();

Result result = junit.run(testClasses);

不要在应用程序内部使用RunListener,它会在测试完成后调用RunListener,因此它可能会停止JVM进程。

您可能想要捕获JUnit的“常规”控制台输出(点和简单报告)。 通过注册RunListener(此类提供了此简单的报告),可以轻松完成此操作。

还请注意使用这种方法的一些并发症:

任何“测试框架”(包括很小的框架)的测试虽然非常简单,但可能会造成混淆。 例如,如果要测试其中一个测试失败时“测试框架”是否返回失败结果,则可以(应该吗?)创建始终失败的示例JUnit测试,并使用“测试框架”执行该测试。 在这种情况下,失败的测试用例实际上是测试数据,不应将其作为“常规” JUnit执行。 有关此类测试的示例,可以参考JUnit的内部测试用例。

如果要准备/显示定制报告,则应该注册自己的RunListener,因为JUnit返回的结果不(直接)包含有关已通过的测试和测试方法的信息(作为测试Description的一部分,它只是“硬编码”的) )。

kopper answered 2020-01-18T11:28:16Z

14 votes

如JUnit常见问题解答所述:

public static void main(String args[]) {

org.junit.runner.JUnitCore.main("junitfaq.SimpleTest");

}

Tomislav Nakic-Alfirevic answered 2020-01-18T11:28:36Z

10 votes

我问的原因是我的   应用程序需要很多工作才能完成   开始启动(很多依赖项和   配置等)并使用   外部测试工具(如JUnit Ant   任务)需要很多工作才能完成   设定。

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

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

乍看起来可能需要做很多工作,但是这种重构正是您的测试框架应该充实的。 您可能会发现,获得一本有关软件测试的书作为解耦依赖项的参考很有用。 与尝试从正在运行的应用程序内部引导JUnit相比,这将带来更多收益。

seanhodges answered 2020-01-18T11:29:11Z

5 votes

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

makson answered 2020-01-18T11:29:31Z

2 votes

根据JUnit API,JUnitCore具有几种在Java内部执行测试的方法。

感谢Tomislav Nakic-Alfirevic指出这一点。

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

corgrath answered 2020-01-18T11:30:00Z

1 votes

Result result = JUnitCore.runClasses(classes);

参见[http://junit.sourceforge.net/javadoc/org/junit/runner/JUnitCore.html#runClasses(java.lang.Class ...)]

Raffi Khatchadourian answered 2020-01-18T11:30:20Z

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值