JUnit之JUnitCore详解

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


JUnit之JUnitCore详解_第1张图片
图1

如图1所示,JUnitCore的执行过程,大致可以分为四部分,分别是Test,Request,Runner,Result。JUnitCore的执行过程可根据图1的时序图简单列举出来,主要可以分为以下几个步骤即:

1). 接收需要测试的各种Request;

2). 根据不同的Request查找对应的Runner;

3). 通过具体的Runner执行相应的Test;

4). 生成相应的Result,并将Result进行反馈。


JUnit之JUnitCore详解_第2张图片
图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 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所示。


JUnit之JUnitCore详解_第3张图片
图3

public Runner buildRunner(Class 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等等。


JUnit之JUnitCore详解_第4张图片
图4

Test

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


JUnit之JUnitCore详解_第5张图片
图5

Result

执行完各种Test之后,便会对相应的执行结果Result进行反馈,代码如下,通过判断TestResult的执行结果,并对执行结果进行反馈,退出测试进程。

public synchronized boolean wasSuccessful() {

return failureCount() == 0 && errorCount() == 0;

}

private static void killAllThreads(Result result) {

System.exit(result.wasSuccessful() ? 0 : 1);

}


JUnit之JUnitCore详解_第6张图片
图6

你可能感兴趣的:(JUnit之JUnitCore详解)