JUnit之JUnitCore详解

本文详细解析了JUnitCore的工作原理,包括其执行流程、Request与Runner的角色、Test的组织方式以及最终的Result反馈机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前两篇文章“ JUnit之TestCase和TestSuite详解”和“ JUnit之扩展IntrumentationTest框架”主要是讲解了对于JUnit测试和InstrumentationTest测试框架的相关方法以及简单的使用介绍,本篇文章则主要侧重于对JUnitCore的介绍,JUnitCore是JUnit测试的各种测试引擎的启动者,JUnit的测试从JUnitCore的main方法开始。

(图1)
如图1所示,JUnitCore的执行过程,大致可以分为四部分,分别是Test,Request,Runner,Result。JUnitCore的执行过程可根据图1的时序图简单列举出来,主要可以分为以下几个步骤即:
1). 接收需要测试的各种Request;
2). 根据不同的Request查找对应的Runner;
3). 通过具体的Runner执行相应的Test;
4). 生成相应的Result,并将Result进行反馈。

(图2)

Request

第一部分是各种各样的Request,这些Request把所有的待测用例Test实现类包装成一个一个的Request,并根据这些Request提供去寻找相应的测试引擎Runner,这里的Request主要可以分为两部分,即ClassesRequest以及ClassRequest,从名字上来看,两者一个是单数,一个是复数,如图2所示,两者集成都继承自Request类,具有公共的方法getRunner,和TestSuite和TestCase类似,ClassesRequst和ClassRequest也是使用了JAVA的合成设计模式,由ClassesRequest管理多个ClassRequst,并在调用getRunner的时候,首先通过getRunnerClass找到对应的Runner类。

	Class<? extends Runner> getRunnerClass(final Class<?> testClass) {
		if (testClass.getAnnotation(Ignore.class) != null)
			return new IgnoredClassRunner(testClass).getClass();
		RunWith annotation= testClass.getAnnotation(RunWith.class);
		if (annotation != null) {
			return annotation.value();
		} else if (hasSuiteMethod() && fCanUseSuiteMethod) {
			return AllTests.class;
		} else if (isPre4Test(testClass)) {
			return JUnit38ClassRunner.class; 
		} else {
			return JUnit4ClassRunner.class;
		}
	}


通过代码可以发现,在执行测试的时候我们可以通过使用Ignore注解,将不需要测试的用例Ignore掉,除此以外还可以通过使用RunWith注解的方式指定具体的Runner,如Android的JUnit4中,现在推荐的使用的方式:@RunWith(AndroidJUnit4.class),除此之外还有当测试的Test是TestSuite时候使用AllTest执行引擎,其他的Test如TestCase使用JUnit38ClassRunner或JUnit4ClassRunner等。
找到相应的Runner类之后就是创建了,ClassRequest通过buidRunner方法,用反射的方式创建相应的Runner,如图3所示。

(图3)

	public Runner buildRunner(Class<? extends Runner> runnerClass) {
		try {
			return runnerClass.getConstructor(Class.class).newInstance(new Object[] { fTestClass });
		} catch (NoSuchMethodException e) {
			String simpleName= runnerClass.getSimpleName();
			InitializationError error= new InitializationError(String.format(
					CONSTRUCTOR_ERROR_FORMAT, simpleName, simpleName));
			return Request.errorReport(fTestClass, error).getRunner();
		} catch (Exception e) {
			return Request.errorReport(fTestClass, e).getRunner();
		}
	}


Runner

Runner是测试用例的执行引擎,如在介绍ClassRequest的时候介绍过,在执行ClassRequest的getRunner方法的时候会调用getRunnerClass,寻找并创建相应的Runner。Runner大致分为以下几种:Ignore,JUnit38ClassRunner,JUnit4ClassRunner,AllTest这几种系统自带的Runner实现类,除此以外还可以扩展各种各样的Runner,只需要这个扩展类继承自Runner类即可,如Android中的AndroidJUnit4等等。

(图4)
Test

接下来是各种各样的待测试的Test,这些Test主要包含TestSuite以及TestCase及子类共同组成的集体,这些集体统一实现了一个公共接口Test,采用JAVA中的合成设计模式,通过TestSuite进行管理,测试人员只需要关注这一部分就可以了,在前面的文章中也是着重介绍了关于TestSuite和TestCase的使用。如图5所示:

(图5)
Result
执行完各种Test之后,便会对相应的执行结果Result进行反馈,代码如下,通过判断TestResult的执行结果,并对执行结果进行反馈,退出测试进程。
/**
	 * Returns whether the entire test was successful or not.
	 */
	public synchronized boolean wasSuccessful() {
		return failureCount() == 0 && errorCount() == 0;
	}


	private static void killAllThreads(Result result) {
		System.exit(result.wasSuccessful() ? 0 : 1);
	}



(图6)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PentsunWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值