測(cè)試框架的利好和繁榮:Java單元測(cè)試框架之爭(zhēng)

責(zé)任編輯:editor005

作者:Michael Redlich

2016-06-28 15:55:36

摘自:INFOQ

在最近Java希臘用戶組會(huì)議中,《Java測(cè)試框架Spock》的作者Kostis Kapelonis做了演講,比較了JUnit和Spock。雖然靈感來(lái)自于JUnit,Spock的特性不僅僅是JUnit的擴(kuò)展:測(cè)試代碼使用Groovy語(yǔ)言編寫(xiě),而被測(cè)代碼可以由Java編寫(xiě)。

最近Reddit上的討論帖引發(fā)了一場(chǎng)JUnit和Spock兩個(gè)測(cè)試框架支持者之間的辯論,源起于Jakub Dziworski發(fā)表的博文,其中心思想是“JUnit有什么問(wèn)題?”目前來(lái)看幾乎每個(gè)GitHub倉(cāng)庫(kù)都引入了基于JUnit的單元測(cè)試,不過(guò)也難怪畢竟JUnit已經(jīng)經(jīng)歷了超過(guò)15個(gè)年頭。但是Spock正在持續(xù)蠶食市場(chǎng)。

JUnit由極限編程(eXtreme programming)創(chuàng)始人Kent Beck、《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》合著者Erich Gamma共同創(chuàng)造,并且很快變成單元測(cè)試領(lǐng)域的事實(shí)標(biāo)準(zhǔn),被移植和克隆到幾乎所有流行的編程語(yǔ)言中。然而,這些年來(lái)JUnit的的特性一直被新的單元測(cè)試框架質(zhì)疑,例如TestNG和Spock。

TestNG

TestNG由《Java測(cè)試新技術(shù)TestNG和高級(jí)概念》合著者Cédric Beust于2004年創(chuàng)造。根據(jù)TestNG網(wǎng)站描述,“TestNG是從JUnit和NUnit汲取靈感的測(cè)試框架,但是引入了一些新的功能使其更加強(qiáng)大并且易于使用”。Beust在其自己的網(wǎng)站上寫(xiě)道,“我開(kāi)始編寫(xiě)TestNG是出于無(wú)奈,JUnit有一些不足之處,這些問(wèn)題我在博客的這里和這里進(jìn)行了標(biāo)注。”

Spock

Dziworski在博文中質(zhì)疑了使用JUnit需要結(jié)合第三方mock框架。他表示,“在中型和大型Java項(xiàng)目中結(jié)合這些框架會(huì)是得讀寫(xiě)測(cè)試變得更加困難。”他隨后說(shuō)道,“如果測(cè)試代碼難以編寫(xiě),開(kāi)發(fā)者通常會(huì)將編寫(xiě)測(cè)試代碼作為痛苦工作,并開(kāi)始忽略它們。避免或者延遲編寫(xiě)測(cè)試代碼會(huì)導(dǎo)致應(yīng)用無(wú)法再被信任。最后開(kāi)發(fā)者會(huì)害怕修改這些代碼,因?yàn)閼?yīng)用的其他部分可能以某種奇怪的方式出現(xiàn)問(wèn)題。”

在最近Java希臘用戶組會(huì)議中,《Java測(cè)試框架Spock》的作者Kostis Kapelonis做了演講,比較了JUnit和Spock。

Spock由Gradleware首席工程師Peter Niederwieser于2008年創(chuàng)建。雖然靈感來(lái)自于JUnit,Spock的特性不僅僅是JUnit的擴(kuò)展:

測(cè)試代碼使用Groovy語(yǔ)言編寫(xiě),而被測(cè)代碼可以由Java編寫(xiě)。 內(nèi)置mock框架以減少引入第三方框架。 可支持自定義測(cè)試件名稱。 為創(chuàng)建測(cè)試代碼預(yù)定義了行為驅(qū)動(dòng)塊(given:、when:、then:、expect:等)。 使用數(shù)據(jù)表格以減少數(shù)據(jù)結(jié)構(gòu)的使用需求。

以下代碼片段(和Reddit討論中使用的相同)演示了部分特性的使用:

class Math extends Specification { def "maximum of two numbers"(int a, int b, int c) { expect: Math.max(a, b) == c where: a | b | c 1 | 3 | 3 // passes 7 | 4 | 4 // fails 0 | 0 | 0 // passes }}

這個(gè)簡(jiǎn)單的測(cè)試示例使用了兩個(gè)預(yù)定義的塊,expect:(第三行)和where:(第五行)。where:塊用于定義數(shù)據(jù)表格,用于映射第四行定義的Math.max函數(shù)的期望輸入輸出。第二行演示了如何為測(cè)試用例自定義一個(gè)名稱。

一個(gè)包含JUnit和Spock代碼示例的完整項(xiàng)目可以在GitHub上查看。

早在2008年InfoQ就報(bào)道了關(guān)于JUnit滅亡的一些猜想。八年后JUnit 5項(xiàng)目仍然健在,里程碑1正在開(kāi)發(fā)中。測(cè)試框架的利好和繁榮!

查看英文原文:Test Well and Prosper: The Great Java Unit-Testing Frameworks Debate

鏈接已復(fù)制,快去分享吧

企業(yè)網(wǎng)版權(quán)所有?2010-2024 京ICP備09108050號(hào)-6京公網(wǎng)安備 11010502049343號(hào)