JUnit3.8.1源码阅读

本文详细介绍了如何在IDEA中运行JUnit3.8.1源码,并逐步解析其核心功能,包括TestRunner、TestSuite、TestCase和TestResult的运行流程。通过分析源码,读者将了解如何选择测试类、运行测试以及测试结果的处理机制。

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

引言

一直想要完整的阅读一份框架的源码,JUnit3.8.1除了UI界面代码之后只有2000多行代码,非常适合刚开始阅读源码的人,避免刚开始就想放弃

环境

静态的代码阅读总是没有一个完整的逻辑线,因为最好能够搭建在环境将源码带跑起来,然后通过debug找到完整的调用路径。

遇到的问题

为了将源代码运行起来,从网上下载了Junit3.8.1的源代码,发现是采用Ant1.4构建的,在官网上已经找不到Ant1.4版本了,同时项目中使用的是IDEA,IDEA也无法对其源代码进行构建,所以我采取了另外的方式

解决方案

  1. 新建一个Maven项目,然后在pom.xml文件中添加JUnit3.8.1的依赖,IDEA会自动将该依赖下载并添加到项目的外部依赖中
  2. Junit3.8.1源代码中有三个以ui结尾的包,junit.swingui、junit.awtui和textui,这三个包中都有TestRunner类,发现它中存在main方法,是程序的入口,分别将其启动起来,例如启动swingui中的TestRunner出现下面的界面就运行成功了,这样可以解决一些旧的源代码运行起来很麻烦的问题,但是出现的另外一个问题就是这个源代码输入只读文件,无法在IDEA中对其添加注释等功能,因此需要在另外的文件中进行记录。

在这里插入图片描述

说明:分别启动这三个包中的TestRunner,textui是直接传递参数在命令行显示测试结果,awtui和swingui都有可视化页面,但是swingui的功能更加全面,因此从swingui包中TestRunner进行介绍。

接下根据页面上的按钮分别进行功能介绍

功能介绍

Select a test class

这个按钮是界面上输出框旁第一个按钮,因为按钮名称过长显示“…”,将鼠标放上去会显示select a test class文字,看出这个按钮是用来选择一个用来单元测试的类。点击这个按钮之后会弹出一个对话框用来展示所有可选的类。主要是从ClassPath路径下选择符合规则的类。

通过TestCollector及其子类判断一个类是否是一个测试类,具体的继承结构如下:

在这里插入图片描述

Run

当选择了一个进行单元测试的类,就可以点击页面上的“Run”按钮进行单元测试了,这也是Junit的核心功能

首先在TestRunner中找到“Run”按钮,发现这个按钮绑定的事件监听调用了runSuite()方法

runSuite

synchronized public void runSuite() {
   
    if (fRunner != null) {
   
        fTestResult.stop();
    } else {
   
        setLoading(shouldReload());
        reset();
        showInfo("Load Test Case...");
        final String suiteName= getSuiteText();
        //获得测试用例
        final Test testSuite= getTest(suiteName);
        if (testSuite != null) {
   
            addToHistory(suiteName);
            //运行测试用例
            doRunTest(testSuite);
        }
    }
}

JUnit中存在TestSuite和TestCase,TestSuite可以包含多个TestCase或者多个TestSuite

getTest

public static final String SUITE_METHODNAME= "suite";
public Test getTest(String suiteClassName) {
   
		if (suiteClassName.length() <= 0) {
   
			clearStatus();
			return null;
		}
		Class testClass= null;
		try {
   
			testClass= loadSuiteClass(suiteClassName);
		} catch (ClassNotFoundException e) {
   
			String clazz= e.getMessage();
			if (clazz == null)
				clazz= suiteClassName;
			runFailed("Class not found \""+clazz+"\"");
			return null;
		} catch(Exception e) {
   
			runFailed("Error: "+e.toString());
			return null;
		}
		Method suiteMethod= null;
		try {
   
            //获得定义的suite方法
			suiteMethod= testClass.getMethod(SUITE_METHODNAME, new Class[0]);
	 	} catch
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值