自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于單測(cè)技術(shù)選型,聊聊我的思考

開(kāi)發(fā) 前端
其中 JUnit 不支持 Mock,因此基本不會(huì)只用 JUnit,而是結(jié)合其他有 Mock 功能的框架一起使用。從知名度及使用率來(lái)說(shuō),Mockito 和 Spock 使用較多,而 PowerMock、JMockit、TestableMock 使用較少。下面我們將主要對(duì)比 Mockito 和 Spock 兩種框架的差異。

對(duì)于單測(cè)來(lái)說(shuō),目前常用的單測(cè)框架有:

  • JUnit
  • Mockito
  • Spock
  • PowerMock
  • JMockit
  • TestableMock

其中 JUnit 不支持 Mock,因此基本不會(huì)只用 JUnit,而是結(jié)合其他有 Mock 功能的框架一起使用。從知名度及使用率來(lái)說(shuō),Mockito 和 Spock 使用較多,而 PowerMock、JMockit、TestableMock 使用較少。下面我們將主要對(duì)比 Mockito 和 Spock 兩種框架的差異。

Mockito

Mockito 是 Java 單元測(cè)試中的 Mock 框架,一般都是與 JUnit 一起使用。Mockito 功能強(qiáng)大,幾乎所有你能想到的功能都支持,并且由于發(fā)布時(shí)間較長(zhǎng),因此使用的人非常多。

  • 優(yōu)點(diǎn):功能強(qiáng)大、使用人數(shù)多、資料豐富。
  • 缺點(diǎn):代碼不夠簡(jiǎn)潔、沒(méi)有統(tǒng)一的單測(cè)結(jié)構(gòu)、不支持靜態(tài)方法和私有方法 Mock。

更多信息詳見(jiàn)官網(wǎng):https://site.mockito.org/

Spock

Spock 是一個(gè)企業(yè)級(jí)的測(cè)試規(guī)范框架,可用來(lái)測(cè)試 Java 和 Groovy 應(yīng)用。Spock 最大的特色是其簡(jiǎn)潔美觀的語(yǔ)言規(guī)范。Spock 兼容絕大多數(shù) IDE、編譯工具和 CI 集成服務(wù)器。Spock 框架使用 Groovy 語(yǔ)言編寫(xiě),而 Groovy 語(yǔ)言則是 Java 語(yǔ)言的超集,絕大多數(shù) Java 語(yǔ)言語(yǔ)法在 Groovy 中都支持。

  • 優(yōu)點(diǎn):?jiǎn)螠y(cè)結(jié)構(gòu)統(tǒng)一、代碼簡(jiǎn)潔、異常測(cè)試及參數(shù)測(cè)試支持更好。
  • 缺點(diǎn):學(xué)習(xí)成本略高、不支持靜態(tài)方法和私有方法 Mock。

更多信息詳見(jiàn)官網(wǎng):https://spockframework.org/

Mockito vs Spock

在 Spock vs JUnit 5 - the ultimate feature comparison 中詳細(xì)對(duì)比了 Mokito 與 Spock 的差異,他們?cè)诎l(fā)展情況、學(xué)習(xí)曲線、工具支持等方面的比較如下圖所示。

圖片

從上圖可以看到,Mockito 框架在發(fā)展、學(xué)習(xí)曲線、工具支持、從 JUnit4 遷移幾方面比較有優(yōu)勢(shì)。而 Spock 框架則在測(cè)試結(jié)構(gòu)、異常測(cè)試、條件測(cè)試等方面比較有優(yōu)勢(shì)。因此,選擇哪個(gè)測(cè)試框架完全基于實(shí)際情況。例如,如果你目前的情況是:

  1. Java 是唯一的語(yǔ)言。
  2. 想要更強(qiáng)的編譯時(shí)錯(cuò)誤檢查。
  3. 更穩(wěn)定、更主流的實(shí)現(xiàn)方式。

那么選擇 JUnit + Mockito 的方式是更好的選擇。但如果你目前的情況是:

  1. 希望單測(cè)跟簡(jiǎn)單易讀
  2. 更簡(jiǎn)潔的參數(shù)測(cè)試與異常測(cè)試

那么選擇 Spock 會(huì)是更好的選擇。

為啥選擇 Spock?

根據(jù)前面的分析,Mockito 的主要優(yōu)勢(shì)在于比較穩(wěn)定、主流,缺點(diǎn)在于不夠簡(jiǎn)潔易讀。而 Spock 雖然使用人群沒(méi)有 Mockito 那么多,但國(guó)內(nèi)也有一些大廠在使用 Spock,例如美團(tuán)等(可參考:Spock 單元測(cè)試框架介紹以及在美團(tuán)優(yōu)選的實(shí)踐)。

我們重視寫(xiě)單測(cè),但是又不希望寫(xiě)單測(cè)花費(fèi)太多時(shí)間,畢竟業(yè)務(wù)才是第一位的。因此,我們希望單測(cè)代碼盡可能簡(jiǎn)潔、可維護(hù)。 基于這個(gè)原因,我們選擇了 Spock 框架作為朝昔后端的單測(cè)框架解決方案。而 Spock 不支持 static 方法及 private 方法 Mock 的缺陷,則嘗試通過(guò)整合 PowerMock 或 TestableMock 來(lái)解決。

可維護(hù)性更強(qiáng)

在極客時(shí)間《程序員的測(cè)試課》中,有一節(jié)關(guān)于講了一個(gè)好的自動(dòng)化測(cè)試長(zhǎng)什么樣?在這里面,作者提到一個(gè)好的單測(cè)應(yīng)該由 準(zhǔn)備、執(zhí)行、斷言、清理 4 個(gè)階段組成。

對(duì)于 Mockito 而言,它并沒(méi)有規(guī)定具體的代碼規(guī)范,因此只能依靠注釋來(lái)標(biāo)注哪些代碼是準(zhǔn)備階段的代碼,哪些是執(zhí)行階段的代碼,哪些是斷言階段的代碼,如下代碼所示。

class SimpleCalculatorTest {
@Test
void shouldAddTwoNumbers() {
//given 準(zhǔn)備
Calculator calculator = new Calculator();
//when 執(zhí)行
int result = calculator.add(1, 2);
//then 斷言
assertEquals(3, result);
}
}

對(duì)于 Spock 而言,其通過(guò) given-when-then 的結(jié)構(gòu),強(qiáng)制要求編寫(xiě)者將不同階段的代碼放到不同的位置,從而增強(qiáng)了可讀性。同樣是用于測(cè)試計(jì)算器的加法函數(shù)的單測(cè)用例,使用 Spock 框架編寫(xiě)的單測(cè)如下代碼所示。

class SimpleCalculatorSpec extends Specification {
def "should add two numbers"() {
given: "create a calculater instance"
Calculator calculator = new Calculator()
when: "get calculating result via the calculater"
int result = calculator.add(1, 2)
then: "assert the result is right"
result == 3
}
}

可以看到,通過(guò) given-when-then 結(jié)構(gòu)的劃分,我們可以更加快速地弄清楚單測(cè)的內(nèi)容,從而提高單測(cè)的可讀性,使得單測(cè)更加容易維護(hù)。

代碼更加簡(jiǎn)潔

對(duì)于 Mockito 與 Spock 而言,它們之間的一個(gè)很大的差別是:Spock 的代碼更加簡(jiǎn)潔。這個(gè)特性可以讓我們編寫(xiě)比 Mockito 更少的代碼,從而實(shí)現(xiàn)同樣的功能。例如在 Mockito 中,我們 Mock 某個(gè)接口實(shí)現(xiàn)時(shí),通常需要寫(xiě)一長(zhǎng)串的 give(...).return(...)? 代碼。而在進(jìn)行斷言的時(shí)候,也需要寫(xiě)比較長(zhǎng)的 then(xx).should(xx).checkxx() 代碼,如下圖所示。

@Test
public void should_not_call_remote_service_if_found_in_cache() {
//given
given(cacheMock.getCachedOperator(CACHED_MOBILE_NUMBER)).willReturn(Optional.of(PLUS));
//when
service.checkOperator(CACHED_MOBILE_NUMBER);
//then
then(webserviceMock).should(never()).checkOperator(CACHED_MOBILE_NUMBER);
verify(webserviceMock, never()).checkOperator(CACHED_MOBILE_NUMBER);
}

但在 Spock 中的代碼就相對(duì)比較簡(jiǎn)潔,如下所示代碼實(shí)現(xiàn)了上述 Mockito 代碼同樣的功能。

def "should not hit remote service if found in cache"() {
given:
cacheMock.getCachedOperator(CACHED_MOBILE_NUMBER) >> Optional.of(PLUS)
when:
service.checkOperator(CACHED_MOBILE_NUMBER)
then:
0 * webserviceMock.checkOperator(CACHED_MOBILE_NUMBER)
}

可以看到,Spock 沒(méi)有 given、willReturn 等關(guān)鍵詞,而是取而用 >> 等符號(hào)來(lái)實(shí)現(xiàn),這樣代碼更加簡(jiǎn)潔,閱讀起來(lái)也更加明了。

案例代碼對(duì)比:https://www.yuque.com/lugew/spock/wkxhvk

責(zé)任編輯:武曉燕 來(lái)源: 樹(shù)哥聊編程
相關(guān)推薦

2022-09-22 09:54:56

技術(shù)選型

2016-10-21 15:58:51

容器容器技術(shù)Docker

2022-06-08 13:25:51

數(shù)據(jù)

2022-05-27 11:46:48

技術(shù)能力思考

2020-09-25 07:40:39

技術(shù)開(kāi)發(fā)選型

2019-05-30 14:30:42

技術(shù)管理架構(gòu)

2021-03-10 09:33:51

技術(shù)研發(fā)管理

2015-05-20 09:44:54

混合云云存儲(chǔ)合規(guī)

2022-04-10 11:52:43

前端單測(cè)程序

2023-03-31 13:53:00

低代碼平臺(tái)選型

2022-03-18 08:57:17

前端數(shù)據(jù)流選型

2023-07-04 08:09:05

數(shù)據(jù)庫(kù)選型集中式

2025-03-14 08:00:59

TypeScript編譯器Go

2022-05-26 09:03:39

AOP編程

2021-02-22 09:30:09

go開(kāi)發(fā)環(huán)境桌面系統(tǒng)

2011-04-13 14:04:14

Java數(shù)組

2021-12-08 10:54:09

汽車(chē)智能芯片

2022-08-01 07:38:29

代碼開(kāi)發(fā)

2015-01-27 09:47:49

網(wǎng)站技術(shù)存儲(chǔ)網(wǎng)站演進(jìn)

2023-04-13 07:41:14

RoCE技術(shù)RDMA
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)