`
jgnan
  • 浏览: 88902 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JUnit 4.7学习笔记(二)——BlockJUnit4ClassRunner分析

阅读更多
前面提到过Junit的核心之一就是Runner,它是具体跑测试用例的人。自然我们就要先分析这个东西。通过Runner的层级视图我发现了不少新东西。不过我知道4.1版本的Runner核心就是org.junit.internal.runners.JUnit4ClassRunner这个类,所以我就先进去看看它的变化。结果发现它已经被deprecated了。而现在4.7取而代之的是我们上一次提到过的org.junit.runners.BlockJUnit4ClassRunner。

看一下这个类的层级图:

会发现它上面还有一个叫ParentRunner的东西,Runner接口的Run方法就是这个类实现的。

来看看这个Run方法:
@Override
public void run(final RunNotifier notifier) {
    EachTestNotifier testNotifier= new EachTestNotifier(notifier,getDescription());
    try {
        Statement statement= classBlock(notifier);
        statement.evaluate();
    } catch (AssumptionViolatedException e) {
        testNotifier.fireTestIgnored();
    } catch (StoppedByUserException e) {
        throw e;
    } catch (Throwable e) {
        testNotifier.addFailure(e);
    }
}

发现它所有的测试,现在是通过Statement类来调用的。看看classBlock(notifier)这个方法:
protected Statement classBlock(final RunNotifier notifier) {
    Statement statement= childrenInvoker(notifier);
    statement= withBeforeClasses(statement);
    statement= withAfterClasses(statement);
    return statement;
}


这个Statement会把一个测试会执行的所有方法都封装起来。其中从childrenInvoker这个方法命名来看,这次我们的junit会支持树级结构的测试哦,所以才会诞生了这次的ParentRunner。

来看看childrenInvoker方法及里面涉及到的一个runChildren:
protected Statement childrenInvoker(final RunNotifier notifier) {
    return new Statement() {
        @Override
        public void evaluate() {
            runChildren(notifier);
        }
    };
}

private void runChildren(final RunNotifier notifier) {
    for (final T each : getFilteredChildren())
        fScheduler.schedule(new Runnable() {			
            public void run() {
                ParentRunner.this.runChild(each, notifier);
            }
        });
    fScheduler.finished();
}


然后这个runChild(each,notifier)方法是由BlockJUnit4ClassRunner实现的:
@Override
protected void runChild(FrameworkMethod method, RunNotifier notifier) {
    //每个测试运行时会往里面添加测试结果,后期这些结果会汇总然后显示出来
    EachTestNotifier eachNotifier= makeNotifier(method, notifier);
    //如果发现测试方法上面带有@Ignore注解,就忽略这个测试方法
    if (method.getAnnotation(Ignore.class) != null) {
        eachNotifier.fireTestIgnored();
        return;
    }

    //通知测试引擎开始测试
    eachNotifier.fireTestStarted();
    try {
        //执行方法
        methodBlock(method).evaluate();
    } catch (AssumptionViolatedException e) {
        eachNotifier.addFailedAssumption(e);
    } catch (Throwable e) {
        eachNotifier.addFailure(e);
    } finally {
        //通知引擎测试已经完成
        eachNotifier.fireTestFinished();
    }
}


看看methodBlock:
protected Statement methodBlock(FrameworkMethod method) {
    Object test;
    try {
        test= new ReflectiveCallable() {
            @Override
            protected Object runReflectiveCall() throws Throwable {
                return createTest();    //这个方法只会去初始化只有一个构造函数的类!
            }
        }.run();    //进行测试实体的初始化
    } catch (Throwable e) {
        return new Fail(e);
    }

    //测试结果封装为InvokeMethod
    Statement statement= methodInvoker(method, test);
    //如果有@expected的话,封装为ExpectException
    statement= possiblyExpectingExceptions(method, test, statement);
    //如果有@timeout的话,封装为FailOnTimeout
    statement= withPotentialTimeout(method, test, statement);
    //如果测试中带有有@Rule注解的字段,没有一个规则就会进行一次特定的监控
    statement= withRules(method, test, statement);
    //如果测试类带有@Before注解,封装为RunBefores
    statement= withBefores(method, test, statement);
    //如果测试类带有@After注解,封装为RunAfters
    statement= withAfters(method, test, statement);
    //返回结果
    return statement;
}

我发现除了传统的方法调用记过,ExpectException结果,RunBefores结果和RunAfters结果这些Statement对象外,还添加了Timeout和Rules的描述。Timeout就直接忽略了,这么简单应该大家都可以不言而喻,下面来重点研究一下这个前所未见的MethodRule规则。

明天继续,要去干其它事情了。。。
  • 大小: 11.5 KB
  • 大小: 9.8 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    junit4.7完整jar包

    Junit4.7是Java编程领域中一个非常重要的单元测试框架,它允许开发者对他们的代码进行自动化测试,确保代码的功能正确性。这个完整的jar包包含了Junit4.7的所有类和方法,使得开发者可以直接在项目中引用,进行单元...

    Junit 4.7完整 全面jar包

    其次,`junit-4.7-src.jar`包含的是JUnit 4.7的源代码,这对于学习和理解JUnit的工作原理非常有用。开发者可以直接查看源码,了解内部实现细节,也可以在遇到问题时参考源码寻找解决方案。这对于想要深入学习和定制...

    junit4.7及相关教程

    JUnit 4.7是这个框架的一个版本,提供了许多增强的功能和改进,使得测试更加灵活和高效。 JUnit的核心概念是测试用例(Test Case),它是测试特定功能或方法的一组相关断言(Assertion)。在JUnit 4.7中,你可以...

    junit4.7

    JUnit 4.7 是一个广泛使用的Java编程语言的单元测试框架,它极大地简化了软件开发中的测试过程。这个版本是JUnit系列的一个重要迭代,引入了许多改进和新特性,旨在提高测试的效率和覆盖率。让我们深入了解一下JUnit...

    junit4.7全套

    JUnit 4.7作为早期版本4.x系列的一部分,引入了许多改进和新特性。 2. **主要特性** - **注解(Annotations)**:JUnit 4.7引入了注解,如`@Test`、`@Before`、`@After`等,用于标记测试方法和设置方法,使得测试...

    junit-4.7.jar下载

    首先,JUnit 4.7是JUnit系列的一个升级版,它在JUnit 4的基础上进行了增强。JUnit 4相较于之前的版本,最大的改变是引入了注解(Annotation)机制,使得测试代码更加简洁,更具可读性。例如,`@Test`注解标记在方法...

    junit4.7单元测试

    JUnit 4.7 是一个流行的开源测试框架,主要用于编写和执行Java程序的单元测试。它在软件开发过程中扮演着至关重要的角色,确保代码的质量和稳定性。这个版本的JUnit是在JUnit 4系列的一个更新,带来了许多改进和新...

    单元测试Junit 4.7

    9. **扩展性**:JUnit 4.7的设计允许开发者通过实现`Runner`接口创建自定义的测试执行策略,增强了框架的可扩展性。 在实际使用中,我们通常会配合构建工具如Maven或Gradle,以及IDE如Eclipse或IntelliJ IDEA来管理...

    junit4.7.zip

    《深入理解JUnit 4.7:Java开发中的单元测试利器》 JUnit是Java开发者进行单元测试最常用的工具之一,尤其在版本4.7中,它提供了丰富的功能和改进,使得测试更加高效、易于理解和维护。本文将深入探讨JUnit 4.7的...

    Java单元测试JUnit4.7

    JUnit 4.7是该框架的一个版本,包含了对之前版本的改进和新功能。 在Java开发中,单元测试是对单个或小部分代码进行的功能验证,通常针对方法。通过单元测试,开发者可以确保代码的正确性,降低bug的出现,并且在...

    Junit4.8.2(Junit4.7)

    1. **测试方法的编写**:通过`@Test`注解标记测试方法,测试类通常继承自`org.junit.runner.RunWith`,例如`RunWith(JUnit4.class)`,表明该类使用JUnit 4运行器。 2. **异常断言**:使用`assertThrows()`方法检查...

    junit-4.7.jar+junit-4.7-src.jar

    4. **断言改进**:JUnit 4.7 提供了更多的断言方法,如 `assertEquals`、`assertNull`、`assertTrue` 等,使得测试结果的判断更加直观和灵活。 5. **测试套件(Test Suites)**:通过 `@Suite` 注解,你可以将多个...

    junit-4.7.jar包

    4. **异常测试**:可以使用`@Test(expected = Exception.class)`注解来检查方法是否抛出了预期的异常。 5. **测试监听器**:通过实现`TestListener`接口或使用`@Rule`注解,开发者可以定制测试执行过程中的行为,如...

    junit4.7以及hamcrest-core-1.3

    JUnit 4.7 和 Hamcrest-Core-1.3 是两个重要的Java单元测试工具,它们在软件开发过程中扮演着至关重要的角色。JUnit 是一个开源的、基于Java的单元测试框架,而Hamcrest是一个匹配器库,提供了丰富的断言方法,使得...

    junit-4.7-src.jar

    junit-4.7-src.jar junit-4.7-src.jar junit-4.7-src.jar junit-4.7-src.jar junit-4.7-src.jar junit-4.7-src.jar junit-4.7-src.jar

    junit-4.7.jar

    junit-4.7.jar 用于java测试的包

    junit 4.7 api chm 中文版

    深圳电信培训中心徐海蛟老师上课用的junit4.7 api chm 速查中文手册.吐血奉献o(∩_∩)o...哈哈

    junit4.7-SNAPSHOT-20090511-2347.rar

    JUnit是Java编程语言中...虽然这个版本是快照版本,但仍然包含了JUnit 4系列的核心功能,对于学习和理解JUnit 4的用法具有很大的参考价值。在实际开发中,我们通常会选择正式发布的稳定版本以获得更好的稳定性和支持。

    struts2_spring3.0_Junit4.7_Maven2.2.1_整合运行说明_培训.pdf )

    本文档主要介绍了如何将Struts2、Spring3.0、JUnit4.7和Maven2.2.1这几种技术框架整合在一起,以构建一个功能完善的Java EE项目。该文档的目标是帮助开发人员理解如何在实际项目中应用这些框架,并确保它们能够协同...

Global site tag (gtag.js) - Google Analytics