Junit 原始碼解析(一)

2021-08-31 10:45:07 字數 2205 閱讀 1639

junit 原始碼解析(一)之junit執行容器

package org.junit.runner;

public abstract class runner implements describable

runner是junit的執行容器,它是各種junit執行容器的父類。我們可以把它理解成web容器,spring容器,就是單元測試類所在執行環境。

我們在跑單元測試時,單元測試用例的生命週期就是由runner來控制的。這和其他容器一樣。

首先是選擇容器,在跑單元測試時,最先構建的是runner容器。源**如下:

見alldefaultpossibilitiesbuilder下的public runner runnerforclass(class<?> testclass) throws throwable

@override

public runner runnerforclass(class<?> testclass) throws throwable

return null;

}

builders是容器的建立者,它是乙個list,建立ignoredbuilder(),annotatedbuilder(),suitemethodbuilder(),junit3builder(),junit4builder());

遍歷builders,因為list是有序的,當某乙個junit容器建立成功,則跳出迴圈,不再建立其他容器。而建立好的runner容器就負責執行單元測試用例。

下面說一下各個容器的作用和特點

(1)ignoredbuilder,

public runner runnerforclass(class<?> testclass)

當在你的單元測試類前面加@ignore的時候,這個容器就會被建立。這個容器不會執行單元測試方法。

這也就是當我們有些單元測試用例類跑不過時,加類上面加註解@ignore,通過忽略通過的原因。

(2)annotatedbuilder

@override

public runner runnerforclass(class<?> testclass) throws exception

在junit已經提供了自己的容器,當在生產開發中,如果覺得junit提供的容器已經不能滿足需求時,可以自己建立個性化的容器。在類的聲名加上註解runwith,指定你自己建立容器。像在spring中,它提供了自己的單元測試容器。

請見spring測試的基類abstractjunit4springcontexttests,在它的類註解中加了runwith,指定它的測試容器springjunit4classrunner。

一般情況我們並不會用到這個容器。這裡想說明的是junit做為乙個框架,它通過annotatedbuilder提供了可擴充套件的介面

(3)suitemethodbuilder 略

(4)junit3builder

public class junit3builder extends runnerbuilder 

boolean ispre4test(class<?> testclass)

}

這是junit的早期版本使用的容器,那時寫單元測試類需要繼承testcase,現在我們不用再繼承這個類了。為相容老版本。當你的單元測試用例繼承了testcase這個容器就會被建立。ispre4test方法判斷你所寫的測試用例類是否是testcase的子類。記得好像3.8之後的版還是4.0之後的版就可以不用繼承testcase了。

(5)junit4builder

@override

public runner runnerforclass(class<?> testclass) throws throwable

建立最新的junit自帶的測試容器。這個容器是我們現在最常用的,雖然我們並不了解它,但平常寫的測試用例類都是在blockjunit4classrunner下執行的。由於版本原因,這裡的blockjunit4classrunner是比較新容器。之前版本的容器是junit4classrunner,現在這個類已經打上@deprecated註解,不再推薦使用。當然你也可以通過上面提到的runwith來使用這個容器。

針對現在最常用blockjunit4classrunner,在下乙個章節來看他的原始碼。

Junit原始碼解析總結

前面的部落格我們也已經整理到了,我們使用junit38,在寫 測試類的時候我們的測試類必須繼承testcase。這個所有測試類的父類在junit.framework包下面。前面我們的整理都是說直接在ide中直接執行測試類,右擊然後run as junit。當然我們還可以自己寫main方法來執行測試,...

Junit 原始碼解析(二)

這裡對blockjunit4classrunner中幾個跟寫單元測試最相關的幾個方法進行分析 1 構造方法 public blockjunit4classrunner class klass throws initializationerror作用 是取得類的聲名描述,即class klass 2 ...

JUnit原始碼分析(一)

一 引子junit 原始碼是我仔細閱讀過的第乙個開源專案原始碼。閱讀高手寫的 能學到一些好的程式設計風格和實現思路,這是提高自己程式設計水平行之有效的方法,因此早就想看看這些赫赫有名的框架是怎麼回事了。今天就拿最簡單的 junit 下手,也算開始自己的原始碼分析之路。junit 作為最著名的單元測試...