您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > junit
JUnit 5系列:架構(gòu)體系
作者:Linesh林從羽 發(fā)布時(shí)間:[ 2016/12/21 15:44:06 ] 推薦標(biāo)簽:單元測(cè)試 軟件測(cè)試

  JUnit 4
  除了 Hamcrest,JUnit 4沒(méi)有任何外部依賴(lài),其所有的功能都被打包在一個(gè)構(gòu)件(artifact)中。這完全違反了單一職責(zé)原則,它被提供給開(kāi)發(fā)者、IDE、構(gòu)建工具、其他測(cè)試框架、其他擴(kuò)展等使用,不同的使用者,依賴(lài)的都是一個(gè)同樣的構(gòu)件。
  而在這其中,只有開(kāi)發(fā)者能——或者說(shuō)曾經(jīng)能——以干凈的方法來(lái)使用它。他們通常只需要 JUnit 的公共 API,不需要管其他的。非常好。
  但生態(tài)圈中的其他成分則不是這樣使用 JUnit:測(cè)試框架、擴(kuò)展,特別是 IDE 和構(gòu)建工具的開(kāi)發(fā)者,他們需要深入到 JUnit 的深處,到它的細(xì)枝末節(jié):非 public 的類(lèi)、內(nèi)部 API,甚至 private 字段。它們的正常工作極大地依賴(lài)于 JUnit 的實(shí)現(xiàn)細(xì)節(jié)。這使得 JUnit 維護(hù)團(tuán)隊(duì)不能輕易地修改框架的這些內(nèi)部實(shí)現(xiàn),因此團(tuán)隊(duì)的開(kāi)發(fā)進(jìn)度受到了很大的影響。
  當(dāng)然,這些工具的開(kāi)發(fā)者們也并非有意為之。為了實(shí)現(xiàn)那些我們十分喜愛(ài)的特性,他們不得不使用內(nèi)部的 API,因?yàn)?JUnit 4 并沒(méi)有提供相應(yīng)的 API:一個(gè)強(qiáng)大到足以滿(mǎn)足工具開(kāi)發(fā)者們需求的 API。
  Junit Lambda 團(tuán)隊(duì)開(kāi)始著手于 JUnit 5 的開(kāi)發(fā),希望能讓這一切變得明朗起來(lái)。
  JUnit 5
  分離的關(guān)注點(diǎn)
  退一步想,我們不難辨識(shí)出,這里至少有兩個(gè)不同的關(guān)注點(diǎn)需要分離:
  1、一個(gè)支持測(cè)試代碼撰寫(xiě)的 API
  2、一個(gè)識(shí)別測(cè)試、運(yùn)行測(cè)試的機(jī)制
  再仔細(xì)思考一下第二點(diǎn),我們可能會(huì)問(wèn),“哪些測(cè)試?”這個(gè)當(dāng)然是指 Junit 測(cè)試。“我知道,但具體是哪些版本的測(cè)試呢?”呃…“還有,具體是指什么類(lèi)型的測(cè)試?”好吧,你讓我給你……“只能跑那些老版本的 @Test 注解的測(cè)試么?有沒(méi)有其他新的方法來(lái)運(yùn)行測(cè)試呢?……”行行行,都給我閉嘴!聽(tīng)我講著。
  為了進(jìn)一步將待識(shí)別測(cè)試的類(lèi)型 與 實(shí)際運(yùn)行它們 這兩個(gè)關(guān)注點(diǎn)解耦,上面的第二點(diǎn)需要細(xì)分:
  1、一個(gè)支持測(cè)試代碼撰寫(xiě)的 API
  2、一個(gè)識(shí)別測(cè)試、運(yùn)行測(cè)試的機(jī)制
  · 一個(gè)識(shí)別、運(yùn)行特定類(lèi)型(比如,JUnit 5測(cè)試的機(jī)制)
  · 另一套協(xié)調(diào)上述機(jī)制的機(jī)制
  · 上兩者之間的 API
  JUnit 5 的重新的組織
  識(shí)別出這兩個(gè)關(guān)注點(diǎn)以后,“作為平臺(tái)的 JUnit ”(用于運(yùn)行我們的測(cè)試)和“作為工具的 JUnit ”(用于撰寫(xiě)我們的測(cè)試)這兩個(gè)概念的分離清晰了。為了完成這個(gè)徹底的分離,JUnit 團(tuán)隊(duì)決定將 JUnit 5 分成三個(gè)子項(xiàng)目:
  JUnit Jupiter
  包含了我們用于撰寫(xiě)測(cè)試的 API(關(guān)注點(diǎn)1),以及一個(gè)能理解測(cè)試代碼的引擎(關(guān)注點(diǎn)2.1)。
  JUnit Platform
  提供了一套統(tǒng)一的 API 以運(yùn)行測(cè)試,及基于 API 之上的一套工具(關(guān)注點(diǎn)2.2和2.3)。
  JUnit Vintage
  提供了一套引擎,用以在 JUnit 5 中運(yùn)行 JUnit 3 和 JUnit 4 的測(cè)試(關(guān)注點(diǎn)2.1)。
  架構(gòu)與體系
  JUnit 5 的架構(gòu)體系完全是遵循這個(gè)關(guān)注點(diǎn)分離思想的產(chǎn)物:
  junit-jupiter-api(1)
  開(kāi)發(fā)者用于撰寫(xiě)測(cè)試的 API,包含了我們?cè)?JUnit 5 的基礎(chǔ)知識(shí) 一節(jié)中所提及的所有注解、斷言等。
  junit-platgorm-engine(2.3)
  包含了一套所有測(cè)試引擎都必須實(shí)現(xiàn)的 API。這樣,不同的測(cè)試引擎之間可以通過(guò)統(tǒng)一的接口被調(diào)用。引擎可以跑正常的 JUnit 測(cè)試,但也可以實(shí)現(xiàn)不同的引擎用以執(zhí)行其他框架寫(xiě)成的測(cè)試,如 TestNG 、 Spock 、 Cucumber 等。
  junit-jupiter-engine(2.1)
  junit-platform-engineAPI 的一個(gè)實(shí)現(xiàn),專(zhuān)門(mén)用于執(zhí)行 JUnit 5 撰寫(xiě)的測(cè)試。
  junit-vintage-engine(2.1)
  junit-platform-engineAPI 的一個(gè)實(shí)現(xiàn),專(zhuān)門(mén)用于執(zhí)行 JUnit 3 或 JUnit 4 撰寫(xiě)的測(cè)試。過(guò)去,JUnit 4 的構(gòu)件 junit-4.12 充當(dāng)了兩個(gè)角色:它既是開(kāi)發(fā)人員用于實(shí)現(xiàn)測(cè)試的 API,又包含了用以執(zhí)行測(cè)試的核心組件。這個(gè)引擎,可以認(rèn)為是低版本的 JUnit 3/4 與 JUnit 5 之間的一個(gè)適配器。
  junit-platform-launcher(2.2)
  這部分使用了一個(gè)服務(wù)加載器 ServiceLoader 來(lái)發(fā)現(xiàn)測(cè)試引擎,并協(xié)調(diào)不同實(shí)現(xiàn)之間的執(zhí)行。它提供了一個(gè) API 給 IDE 和構(gòu)建工具,使得它們能夠與測(cè)試執(zhí)行過(guò)程交互,比如,運(yùn)行單個(gè)的測(cè)試、搜集測(cè)試結(jié)果并展示等。

上一頁(yè)12下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd