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(此类提供此简单报告)轻松完成.
请注意使用这种方法的几个并发症:
测试任何"测试框架",包括如此小的测试框架,虽然很简单,但可能会令人困惑.例如,如果您想测试当其中一个测试失败时您的"测试框架"是否返回失败结果,您可以(应该?)创建始终失败的示例JUnit测试并使用"测试框架"执行该测试.在这种情况下,失败的测试用例实际上是测试数据,不应该作为"普通"JUnit执行.有关此类测试的示例,您可以参考JUnit的内部测试用例.
如果要准备/显示自定义报告,则应该注册自己的报告RunListener,因为JUnit返回的结果不包含(直接)有关传递的测试和测试方法的信息(它仅作为测试的一部分"硬编码" Description).
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相比,它将获得更多回报.
在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)