應(yīng)用程序上線(xiàn)之前如何進(jìn)行有效的軟件測(cè)試?今年的JAX London大會(huì)Gil Tayar向初學(xué)者介紹了前端測(cè)試的方法以及為什么測(cè)試碼不可選的原因。以下是關(guān)于他對(duì)大會(huì)內(nèi)容的部分介紹。

資深軟件測(cè)試工程師:1分鐘告訴你為何要進(jìn)行前端代碼測(cè)試?

Gil Tayar:我的一位朋友曾經(jīng)問(wèn)我,前端測(cè)試到底應(yīng)該怎樣做。為了更加系統(tǒng)全面的回答他這個(gè)問(wèn)題,我在網(wǎng)上查閱了大量的資料,但是卻發(fā)現(xiàn)這些方法理論卻差強(qiáng)人意,至少在我看來(lái),這些方法的深度還遠(yuǎn)遠(yuǎn)不夠。從前端測(cè)試新手的角度,我找不到全面指導(dǎo)前端測(cè)試指南的應(yīng)用程序,更別說(shuō)理論和實(shí)踐的結(jié)合了,所以我決定自己來(lái)做這件事。

 首先,什么是測(cè)試?

測(cè)試的含義在我看來(lái)就是你在APP中寫(xiě)的檢測(cè)代碼,也被稱(chēng)為“生產(chǎn)代碼”,它是按照預(yù)期工作的。也有人稱(chēng)之為“TDD”,但” TDD” 一般指的是具體的測(cè)試方法。

其實(shí)不管在編程之前寫(xiě)代碼還是之后這都無(wú)關(guān)緊要,只要你寫(xiě)出足夠的測(cè)試能夠讓你的APP正常運(yùn)行這就可以了。但令人悲哀的是,很多人都覺(jué)得這一點(diǎn)也不重要。

現(xiàn)在軟件測(cè)試行業(yè)已經(jīng)將測(cè)試與TDD相結(jié)合,因此程序員和生產(chǎn)代碼一起編寫(xiě)代碼沒(méi)有標(biāo)準(zhǔn)術(shù)語(yǔ)。我稱(chēng)軟件測(cè)試為“開(kāi)發(fā)者測(cè)試”,或者你也可以這樣理解,軟件測(cè)試就是普通的測(cè)試而已。

資深軟件測(cè)試工程師:1分鐘告訴你為何要進(jìn)行前端代碼測(cè)試?

為什么要測(cè)試?

其實(shí)測(cè)試沒(méi)有什么必須的理由。如果你真的不想測(cè)試,肯定也沒(méi)人強(qiáng)迫你。假如一次又一次的網(wǎng)頁(yè)測(cè)試讓你越來(lái)越煩躁,那就沒(méi)有測(cè)試的必要。但是,如果你不測(cè)試,有些潛在的bug可能會(huì)在未來(lái)的時(shí)間里一次又一次的困擾你,從部署到生產(chǎn)都將會(huì)是一個(gè)噩夢(mèng)。

測(cè)試類(lèi)型有哪些?

對(duì)于初學(xué)者而言,剛開(kāi)始研究各種類(lèi)型測(cè)試的時(shí)候非常抓狂。你可能聽(tīng)過(guò)幾個(gè)軟件測(cè)試大概的類(lèi)別:?jiǎn)卧獪y(cè)試、驗(yàn)收測(cè)試、集成測(cè)試、端到端測(cè)試、組件測(cè)試以及服務(wù)測(cè)試。

更讓人哭笑不得的是,假如一群軟件測(cè)試的人在一起頭腦風(fēng)暴,他們對(duì)軟件測(cè)試中的術(shù)語(yǔ)定義可能都不一樣。

但對(duì)我而言不太在乎使用哪個(gè)術(shù)語(yǔ),因?yàn)槲艺J(rèn)為測(cè)試類(lèi)型沒(méi)有硬性定義。在我看來(lái),所有的測(cè)試其實(shí)都在一個(gè)頻譜范圍內(nèi)。

測(cè)試類(lèi)型的范圍是什么?

我們從最簡(jiǎn)單的類(lèi)型——單元測(cè)試開(kāi)始。從定義來(lái)看,所謂單元測(cè)試就是測(cè)試“單位”的代碼,那什么是單位呢?這就取決于你使用的編程語(yǔ)言了。單位可以是一個(gè)函數(shù),一個(gè)模塊,一個(gè)包,一個(gè)類(lèi),甚至是一個(gè)對(duì)象(相對(duì)于JavaScript和Scala這樣的語(yǔ)言)。舉個(gè)例子,在JavaScript中,單元通常就是指一個(gè)類(lèi)或者一個(gè)模塊。

重要的是這個(gè)單元要進(jìn)行隔離測(cè)試,這些算法、功能就像一個(gè)函數(shù)、計(jì)算字符串中的字符數(shù)或者具有一組驗(yàn)證函數(shù)的類(lèi),這是非常完美的。

隔離測(cè)試還是比較容易的,因?yàn)閱卧c單元之間沒(méi)有依賴(lài)性。但我如何知道一個(gè)單元和另一個(gè)單元是否依賴(lài)呢?兩種方法:要么對(duì)兩個(gè)單元同時(shí)測(cè)試,要么模擬另一個(gè)單元。

那么問(wèn)題來(lái)了,如果我同時(shí)測(cè)量?jī)蓚€(gè)單元,還能稱(chēng)為“單元測(cè)試”嗎?有些人會(huì)不再將它稱(chēng)為單元測(cè)試。但是我仍?xún)A向于叫做“單元測(cè)試”。但是如果有人叫做“集成測(cè)試”或者“兩單元測(cè)試”,那我沒(méi)有任何意見(jiàn)。

舉個(gè)例子:

資深軟件測(cè)試工程師:1分鐘告訴你為何要進(jìn)行前端代碼測(cè)試?

這個(gè)單元是一個(gè)具有writeSumToFile功能的模塊,它接受兩個(gè)數(shù)字并且可以將他們直接寫(xiě)入文件中。

但是值得注意的是,它本身并沒(méi)有被寫(xiě)出來(lái)。它使用另一個(gè)單元fileSumWriter來(lái)編寫(xiě)。為了測(cè)試這個(gè)單元,我們可以通過(guò)實(shí)際的文件編輯器或創(chuàng)建一個(gè)模擬來(lái)實(shí)現(xiàn)。

從最純粹的意義上講,如果將mock傳遞給函數(shù),無(wú)疑這個(gè)測(cè)試就是一個(gè)單元測(cè)試。但是當(dāng)它們一起測(cè)試時(shí),很多人就會(huì)認(rèn)為這不是單元測(cè)試。

其實(shí)這都無(wú)關(guān)緊要。一方面,我們有代碼測(cè)試一個(gè)單位。另一方面,有E2E測(cè)試——整個(gè)應(yīng)用的測(cè)試。一切測(cè)試都在E2E中進(jìn)行,并且APP運(yùn)行時(shí)會(huì)在與生產(chǎn)系統(tǒng)類(lèi)似的環(huán)境中運(yùn)行。

資深軟件測(cè)試工程師:1分鐘告訴你為何要進(jìn)行前端代碼測(cè)試?

這代表著兩個(gè)極端點(diǎn)——它們定義了越來(lái)越大的測(cè)試范圍,在這個(gè)范圍內(nèi),越來(lái)越多的代碼被測(cè)試。

有些人稱(chēng)這些測(cè)試為處于“集成測(cè)試”之間的測(cè)試,但對(duì)于TDD-ers,集成測(cè)試意味著一個(gè)完全不同的東西。集成測(cè)試確切的說(shuō)即使測(cè)試超過(guò)了一個(gè)單元但不包括所有的單元。