是否可以从我的java应用程序中运行JUnit测试?
我是否可以使用测试框架(例如JUnit.jar?),还是我强制查找测试文件,调用方法并自己跟踪异常?
我之所以要问的是我的应用程序需要大量的工作来启动启动(许多依赖项和配置等)并且使用外部测试工具(如JUnit Ant任务)需要大量的工作来设置
启动应用程序更容易,然后在应用程序内运行我的测试。
是否有一个简单的测试框架可以在java应用程序中运行测试和输出结果,还是我被迫编写自己的框架?
答案 0 :(得分:82)
是的,你可以。我正在做几次在生产系统中运行诊断/烟雾测试。这是调用JUnit的代码的关键部分:
JUnitCore junit = new JUnitCore();
Result result = junit.run(testClasses);
请勿在您的应用程序中使用JUnit.main
,它会在测试完成后调用System.exit
,因此可能会停止JVM进程。
您可能希望捕获JUnit的“常规”控制台输出(点和简单报告)。这可以通过注册TextListener
轻松完成(此类提供了这个简单的报告)。
请注意使用这种方法的几种并发症:
测试任何“测试框架”,包括如此小的测试框架,虽然很简单但可能会令人困惑。例如,如果您想测试当其中一个测试失败时您的“测试框架”是否返回失败结果,您可以(应该?)创建始终失败的示例JUnit测试并使用“测试框架”执行该测试。在这种情况下,失败的测试用例实际上是测试数据,不应该作为“普通”JUnit执行。有关此类测试的示例,您可以参考JUnit的内部测试用例。
如果您要准备/显示自定义报告,则应该注册自己的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)
Result result = JUnitCore.runClasses(classes);
请参见http://junit.sourceforge.net/javadoc/org/junit/runner/JUnitCore.html#runClasses(java.lang.Class...)