Junit 3.8.1 源码分析之两个接口

1. Junit源码文件说明

  • runner
  • framework:整体框架;
  • extensions:可以对程序进行扩展;
  • textui:JUnit运行时的入口程序以及程序结果的呈现方式;
  • awtui:JUnit运行时的入口程序以及程序结果的呈现方式;
  • swingui:JUnit运行时的入口程序以及程序结果的呈现方式;

2. Junit 的两个重要接口(TestTestListener)

2.1 Test接口

// Junit源码
// Test.java
public interface Test{
    // 统计测试方法
    public abstract int countTestCases();

    // 对方法进行测试,以及汇总测试结果
    public abstract void run(TestResult result);
}

// TestCase.java(单个测试方法)
// 继承Assert类,实现Test类
public abstract class TestCase extends Assert implements Test{
    ...(略)

    public int countTestCases(){
        return 1;
    }

    public TestResult run(){
        TestResult result = createResult();
        run(result);
        return result;
    }

    // 实现接口的方法
    public void run(TestResult result){
        result.run(this);
    }

    public void runBare() throws Throwable{
        setUp();
        try{
            runTest();
        }finally{
            tearDown();
        }
    }

    ...(略)
}

//TestSuite.java(一组测试方法)
public class TestSuite implements Test{
    private Vector fTests = new Vector(10);
    private String fName;

    public Enumeration tests(){
        return fTests.elements();
    }

    public int countTestCases(){
        int count = 0;
        for(Enumeration e = tests(); e.hasMoreElements(); ){
            Test test = (Test)e.nextElement();
            count = count + test.countTestCases();
        }
        return count;
    }

    public void run(TestResult result){
        for(Enumeration e = tests(); e.hasMoreElements(); ){
            if(result.shouldStop())
                break;
            Test test = (Test)e.nextElement();
            runTest(test, result);
        }
    }

    public void runTest(Test test, TestResult result){
        test.run(result);
    }
}

//Assert类,对测试方法结果的断言
public class Assert{
    // 构造方法
    protected Assert(){
    }

    // 静态方法
    static public void assertTrue(String message, boolean condition){
        if(!condition)
            fail(message);
    }
    static public void assertFalse(String message, boolean condition){
        assertTrue(message, !condition);
    }
    static public void fail(String message){
        throw new AssertionFailedError(message);
    }

    static public void assertEquals(String message, Object expected, Object actual){
        if(expected == null && actual == null)
            return;
        if(expected != null && expected.equals(actual))
            return;
        failNotEquals(message, expected, actual);
    }

    ...(略)

    static private void failNotEquals(String message, Object expected, Object actual){
        fail(format(message, expected, actual));
    }

    static String format(String message, Object expected, Object actual){
        String formatted = "";
        if(message != null)
            formatted= message + " ";
        return formatted+"expected:<"+expected+"> but was:<"+actual+">";
    }
}

// TestResult 类,测试结果类
public class TestResult extends Object {
    protected Vector fFailures;
    protected Vector fErrors;
    protected Vector fListeners;
    protected int fRunTests;
    private boolean fStop;

    public TestResult(){
        fFailures = new Vector();
        fErrors = new Vector();
        fListeners = new Vector();
        fRunTests = 0;
        fStop = false;
    }

    ...(略)
    //运行测试方法
    protected void run(final TestCase test){
        startTest(test);
        Protectable p = new Protectable(){
            public void protect() throws Throwable{
                test.runBare();
            }
        };
        runProtected(test, p);
        endTest(test);
    }

    public void startTest(Test test){
        final int count = test.countTestCases();
        synchronized(this){
            fRunTests+=count;
        }
        for(Enumeration e = cloneListeners().elements(); e.hasMoreElements(); ){
            ((TestListener)e.nextElement()).startTest(test);
        }
    }

    public void runProtected(final Test test, Protectable p){
        try{
            p.protect();
        }
        catch(AssertionFailedError e){
            addFailure(test, e);
        }
        catch(ThreadDeath e){
            throw e;
        }
        catch(Throwable e){
            addError(test, e);
        }
    }

    public void endTest(Test test){
        for(Enumeration e = cloneListeners().elements(); e.hasMoreElements(); ){
            ((TestListener)e.nextElement()).endTest(test);
        }
    }
}

2.2 TestListener接口

// TestListener.java
public interface TestListener{
    public void addError(Test test, Throwable t);
    public void addFailure(Test test, AssertionFailedError t);
    public void endTest(Test test);
    public void startTest(Test test);
}

// 负责结果打印
// ResultPrinter.java
public class ResultPrinter implements TestListener{
    //打印"E"
    public void addError(Test test, Throwable t){
        getWriter().print("E");
    }
    //打印"F"
    public void addFailure(Test test, AssertionFailedError t){
        getWriter().print("F");
    }
    public void endTest(Test test){
    }
    public void startTest(Test test){
        getWriter().print(".");
        if(fColumn++ >= 40){
            getWriter().println();
            fColumn = 0;
        }
    }
    ...(略)
}

// 所有TestRunListener的基类
// BaseTestRunner.java
public abstract class BaseTestRunner implements TestListener{
    public synchronized void startTest(Test test){
        testStarted(test.toString());
    }
    public synchronized void endTest(Test test){
        testEnded(test.toString());
    }
    public synchronized void addError(final Test test, final Throwable t){
        testFailed(TestRunListener.STATUS_ERROR, test, t);
    }
    public synchronized void addFailure(final Test test, final AssertionFailedError t){
        testFailed(TestRunListener.STATUS_FAILURE, test, t);
    }

    // TestRunListener需要实现
    public abstract void testStarted(String testName);
    public abstract void testEnded(String testName);
    public abstract void testFailed(int status, Test test, Throwable t);
}

参考资料:

原文地址:https://www.cnblogs.com/linkworld/p/9032917.html

时间: 2024-11-06 11:09:14

Junit 3.8.1 源码分析之两个接口的相关文章

【E2LSH源码分析】E2LSH函数接口

上一小节,我们对E2LSH代码主要的源码框架和用到的数据结构作了简单介绍(http://blog.csdn.net/jasonding1354/article/details/38331229),这一节我将简单介绍一下E2LSH的主要函数接口. 1.构建R-NN数据结构(定义在NearNeighbors.h) 输入为1-δ.R.d和数据集P,利用下面函数来构建: PRNearNeighborStructT initSelfTunedRNearNeighborWithDataSet(RealT t

Struts2 源码分析——配置管理之PackageProvider接口

本章简言 上一章讲到关于ContainerProvider的知识.让我们知道struts2是如何注册相关的数据.也知道如何加载相关的配置信息.本章笔者将讲到如何加载配置文件里面的package元素节点 .如struts.xml文件里面的package节点.那么为什么要分开来讲呢?按道理的话,都是放在上一章中一起讲不是更好吗?关键点在于笔者也不明白strtus2的作者为什么会这样子设计,把关于加载package元素节点信息的工作独立出来.而他的接口便是PackageProvider接口.但是不管如

Spring源码分析——BeanFactory体系之接口详细分析

Spring的BeanFactory的继承体系堪称经典.这是众所周知的!作为Java程序员,不能错过! 前面的博文分析了Spring的Resource资源类Resouce.今天开始分析Spring的IOC部分.众所周知,IOC是Spring框架最迷人的地方.它最重要的接口,就是BeanFactory了.BeanFactory有着庞大的继承.实现体系,有众多的子接口.实现类.本博文的目标就是抽丝剥茧,从源代码入手,分析Spring的实现和架构,从中进步. 在阅读的过程中,可以参照Spring文档来

[gevent源码分析] gevent两架马车-libev和greenlet

本篇将讨论gevent的两架马车-libev和greenlet如何协同工作的. gevent事件驱动底层使用了libev,我们先看看如何单独使用gevent中的事件循环. #coding=utf8 import socket import gevent from gevent.core import loop def f(): s, address = sock.accept() print address s.send("hello world\r\n") loop = loop()

Shiro源码分析之两种Session的方式

1.Shiro默认的Session处理方式 <!-- 定义 Shiro 主要业务对象 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!-- <property name="sessionManager" ref="sessionManager" />

Java入门到精通——框架篇之Spring源码分析Spring两大核心类

一.Spring核心类概述. Spring里面有两个最核心的类这是Spring实现最重要的部分. 1.DefaultListableBeanFactory 这个类位于Beans项目下的org.springframework.beans.factory.support包下. XmlBeanFactory(位于org.springframework.beans.factory.xml包)继承自DefaultListableBeanFactory,而DefaultListableBeanFactory

详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good

目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口的具体应用 常用HandlerMethodArgumentResolver介绍 常用HandlerMethodReturnValueHandler介绍 本文开头现象解释以及解决方案 编写自定义的HandlerMet

Spring源码分析——BeanFactory体系之抽象类、类分析(二)

上一篇分析了BeanFactory体系的2个类,SimpleAliasRegistry和DefaultSingletonBeanRegistry——Spring源码分析——BeanFactory体系之抽象类.类分析(一),今天继续分析. 一.工厂Bean注册支持——FactoryBeanRegistrySupport 废话不多说,直接看我注释的源码: /* * Copyright 2002-2012 the original author or authors. * * Licensed und

Spring源码分析——BeanFactory体系之抽象类、类分析(一)

上一篇介绍了BeanFactory体系的所有接口——Spring源码分析——BeanFactory体系之接口详细分析,本篇就接着介绍BeanFactory体系的抽象类和接口. 一.BeanFactory的基本类体系结构(类为主): 上图可与 Spring源码分析——BeanFactory体系之接口详细分析 的图结合分析,一个以接口为主,一个以类为主(PS:Spring的体系结构要分析清楚,不得不曲线救国啊!不然27寸屏幕给我画估计都装不下.). 具体: 1.7层的类体系继承. 2.Abstrac