JUnit之JUnitCore详解

来源:互联网 发布:苹果mac双系统切换 编辑:程序博客网 时间:2024/06/06 19:56
前两篇文章“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)
0 0