美女脱了内裤趴开腿让男生添_国产日本一区二区三区_美女无遮挡免费视频观看网站_国内高清久久久久久久久 - 最近中文字幕的在线mv视频

日照網(wǎng)絡(luò)公司
掃描關(guān)注網(wǎng)站建設(shè)微信公眾賬號(hào)

掃一掃微信二維碼

日照網(wǎng)站建設(shè)公司告訴你如何進(jìn)行單元測(cè)試!

昊諾網(wǎng)絡(luò)o2017-07-31 09:09:26o網(wǎng)絡(luò)知識(shí)o

日照網(wǎng)站建設(shè)公司告訴你如何進(jìn)行單元測(cè)試!


單元測(cè)試是將應(yīng)用程序分解為盡可能小的函數(shù),并創(chuàng)建可重復(fù)的、自動(dòng)化的測(cè)試用例的過(guò)程。在同等條件下,這些測(cè)試用例應(yīng)該一直產(chǎn)生相同的結(jié)果,它們是應(yīng)用程序的靈魂,并為今后所有應(yīng)用程序的代碼提供構(gòu)建的基礎(chǔ)。如果沒有單元測(cè)試,不常使用的函數(shù)可能長(zhǎng)達(dá)數(shù)月都不會(huì)被發(fā)現(xiàn)有 bug;相反,通過(guò)使用單元測(cè)試,我們可以在任何代碼合并到主干之前就驗(yàn)證每個(gè)系統(tǒng)函數(shù)的功能,不會(huì)等到代碼實(shí)際應(yīng)用到產(chǎn)品中時(shí)還會(huì)出現(xiàn)問題。

網(wǎng)站建設(shè)前端架構(gòu)師的主要責(zé)任是確保開發(fā)者擁有盡可能效率高的開發(fā)工具。單元測(cè)試就是其中之一,它可以用于構(gòu)建任何規(guī)模的應(yīng)用,無(wú)論構(gòu)建應(yīng)用程序邏輯的主要語(yǔ)言屬于前端語(yǔ)言還是后端語(yǔ)言,你都有大量的工具可以應(yīng)用到工作流中。無(wú)論使用的是 PHP 的 PHPUnit、Node 的 NodeUnit,還是 JavaScript 的 QUnit,你都能找到用于構(gòu)建單元測(cè)試的成熟穩(wěn)定的平臺(tái)。

雖然技術(shù)棧(和與之相關(guān)的測(cè)試)有可能留給軟件架構(gòu)師來(lái)決定,但前端開發(fā)人員寫出的代碼可能也需要測(cè)試。因此,熟悉盡可能多的測(cè)試工具很重要。掌握所有工具,甚至達(dá)到精通的程度,那是非常難的。但如果對(duì)基本概念有著深刻的理解,將能幫助你和你的團(tuán)隊(duì)編寫出更加可測(cè)試的代碼,并快速地掌握任何測(cè)試框架。

下面首先來(lái)回顧一下這些基本概念,然后再來(lái)看一些實(shí)際的代碼。

1. 單元

“一次只做一件事,并把它做好”是構(gòu)建基于單元測(cè)試的應(yīng)用程序的原則。我們?cè)趯懞瘮?shù)時(shí)經(jīng)常想同時(shí)實(shí)現(xiàn)很多功能,結(jié)果不僅降低了效率,還增加了測(cè)試的難度,因?yàn)檫@樣的函數(shù)無(wú)法復(fù)用。

思考一個(gè)簡(jiǎn)單的函數(shù):通過(guò)客戶的地址,計(jì)算出將產(chǎn)品從近的分撥區(qū)域運(yùn)輸給客戶的運(yùn)費(fèi)。

下面來(lái)分解一下這個(gè)函數(shù)。函數(shù)要做的先是通過(guò)客戶的地址找到近的分撥區(qū)域;然后使用分撥區(qū)域的地址,計(jì)算出分撥區(qū)域到客戶地址的距離;使用這個(gè)距離,計(jì)算出將貨物從點(diǎn) A 運(yùn)輸?shù)近c(diǎn) B 的費(fèi)用。因此,雖然只有一個(gè)函數(shù),它卻做了 3 件相互獨(dú)立的事:

(1) 根據(jù)地址找到近的分撥區(qū)域

(2) 計(jì)算兩個(gè)地址之間的距離

(3) 根據(jù)距離計(jì)算運(yùn)費(fèi)

回顧一下“一次只做一件事,并把它做好”的理念,很明顯可以通過(guò) 3 個(gè)獨(dú)立的函數(shù)更好地實(shí)現(xiàn)通過(guò)地址來(lái)查詢運(yùn)費(fèi)的功能。當(dāng)我們對(duì)功能進(jìn)行拆分后,就可以得到 3 個(gè)函數(shù):一個(gè)根據(jù)地址找到近的分撥區(qū)域,一個(gè)計(jì)算兩個(gè)地址之間的距離,還有一個(gè)根據(jù)距離計(jì)算運(yùn)費(fèi)。

(1)   更多重用

現(xiàn)在,這 3 個(gè)函數(shù)可以在整個(gè)應(yīng)用中使用了,而不只是用來(lái)計(jì)算運(yùn)費(fèi)。如果程序的其他部分需要找到近的分撥區(qū)域或者計(jì)算兩個(gè)地址之間的距離,可以直接調(diào)用這些已經(jīng)寫好的函數(shù)?,F(xiàn)在,在較大的函數(shù)體中,我們不用一遍又一遍地重寫功能相同的模塊了。

(2) 更好的測(cè)試

我們可以測(cè)試每個(gè)獨(dú)立且可重用的函數(shù),而非測(cè)試應(yīng)用程序所能計(jì)算的每一條運(yùn)輸路線。隨著應(yīng)用程序的發(fā)展,開發(fā)一個(gè)新功能所需要?jiǎng)?chuàng)建的新函數(shù)越來(lái)越少。這樣我們用較少的低復(fù)雜度的函數(shù)完成了高復(fù)雜度的功能。

2. 測(cè)試驅(qū)動(dòng)的開發(fā)

大多數(shù)人在一次接觸單元測(cè)試時(shí),可能寫過(guò)一些功能代碼以滿足業(yè)務(wù)需求(比如上文中的計(jì)算運(yùn)費(fèi)的例子),然后也努力地將它重構(gòu)為更小的、可重用的、可測(cè)試的代碼,之后才去思考如何寫測(cè)試用例。測(cè)試驅(qū)動(dòng)的開發(fā)(test-driven development,TDD)則顛倒了這一思路,它將單元測(cè)試放在前一位,之后才是編寫功能代碼。

但如果為還沒有創(chuàng)建的函數(shù)寫測(cè)試用例,那些函數(shù)豈不是肯定無(wú)法通過(guò)測(cè)試嗎?的確!但測(cè)試驅(qū)動(dòng)的開發(fā)的目標(biāo)是,通過(guò)測(cè)試用例來(lái)描述一個(gè)正確編寫的系統(tǒng)應(yīng)如何工作,并為實(shí)現(xiàn)這個(gè)系統(tǒng)來(lái)鋪平道路。

對(duì)于上文提到的計(jì)算運(yùn)費(fèi)的例子,在測(cè)試驅(qū)動(dòng)的開發(fā)中會(huì)為三個(gè)實(shí)現(xiàn)業(yè)務(wù)需求的函數(shù)分別編寫單元測(cè)試。開發(fā)者的工作就是將一開始沒有通過(guò)單元測(cè)試的函數(shù)變?yōu)槟軌蛲ㄟ^(guò)測(cè)試的函數(shù)。先實(shí)現(xiàn)一個(gè)可以正確地查找出近的分撥區(qū)域的位置的函數(shù),并通過(guò)前一個(gè)單元測(cè)試。然后,繼續(xù)實(shí)現(xiàn)計(jì)算距離和計(jì)算運(yùn)費(fèi)的函數(shù),得到三個(gè)通過(guò)與之對(duì)應(yīng)的單元測(cè)試的函數(shù)。

完成上述步驟后,我們不僅實(shí)現(xiàn)了應(yīng)用的計(jì)算運(yùn)費(fèi)的功能,還讓這些函數(shù)有了完全的測(cè)試覆蓋率。

3. 一個(gè)測(cè)試驅(qū)動(dòng)的例子

單元測(cè)試的理念其實(shí)非常簡(jiǎn)單。它的基本思路是調(diào)用要測(cè)試的函數(shù),傳遞一些預(yù)先設(shè)置好的參數(shù),并描述結(jié)果應(yīng)該是什么。下面來(lái)看看如何為通過(guò)給定距離來(lái)計(jì)算運(yùn)費(fèi)的函數(shù)設(shè)計(jì)功能測(cè)試:
素材圖片
QUnit有多個(gè)用于測(cè)試斷言的操作符,包括用于測(cè)試布爾值的 ok() 和用于比較復(fù)雜對(duì)象的 deepEqual()。在這個(gè)例子中,我們使用 equal() 來(lái)比較 calculateShipping() 的返回值與期望值。只要 calculateShipping(24) 返回的是 4(這個(gè)例子中確實(shí)將返回 4),這個(gè)單元測(cè)試就能通過(guò)。第三個(gè)參數(shù)——24 Miles——用來(lái)在測(cè)試輸出中標(biāo)記相應(yīng)單元測(cè)試的結(jié)果。

上文中通過(guò)距離計(jì)算運(yùn)費(fèi)的單元測(cè)試(當(dāng)然也包括其他函數(shù)的單元測(cè)試)就緒后,我們就掌握了一個(gè)測(cè)試集,通過(guò)運(yùn)行該測(cè)試集可以確認(rèn)系統(tǒng)能否正常工作。如果有人要改 calculateShipping() 的函數(shù)名或者運(yùn)費(fèi),這個(gè)測(cè)試集就會(huì)反饋提示失敗,因此我們能夠在有問題的代碼部署到生產(chǎn)環(huán)境之前就修復(fù)它們。

QUnit 的功能遠(yuǎn)遠(yuǎn)不止上文例子中提到的。舉例來(lái)說(shuō),它可以測(cè)試同步函數(shù),也可以測(cè)試異步函數(shù);它還可以與單元測(cè)試中加載的 Web 頁(yè)面進(jìn)行交互(其實(shí)用 JavaScript 都能實(shí)現(xiàn))。因此,如果你的單元測(cè)試包括用戶點(diǎn)擊鼠標(biāo)或按下鍵盤時(shí)的返回值,QUnit 也能夠支持。

4. 測(cè)試覆蓋率要多大才足夠

確定合適的測(cè)試覆蓋率是很難權(quán)衡的一件事情。如果你不是在進(jìn)行測(cè)試驅(qū)動(dòng)的開發(fā)(這種開發(fā)中,沒有代碼是不需要單元測(cè)試的),那么確定測(cè)試覆蓋率將非常重要。如果測(cè)試所有的代碼,開發(fā)進(jìn)度可能停滯不前;而如果測(cè)試不夠,就有漏掉新問題的風(fēng)險(xiǎn)。

(1) 解決分歧點(diǎn)

如果為已有的項(xiàng)目設(shè)計(jì)單元測(cè)試,大部分情況下,你可能沒有時(shí)間或者預(yù)算為現(xiàn)有的功能編寫各個(gè)方面 覆蓋率的測(cè)試集。但這不是問題!測(cè)試覆蓋率的好處是,即使一個(gè)單一的測(cè)試也能夠?yàn)橄到y(tǒng)建設(shè)貢獻(xiàn)價(jià)值。因此,在決定從哪里開始寫單元測(cè)試時(shí),可以從能夠獲得大收益的地方開始。有時(shí)候,大的收益就是為系統(tǒng)簡(jiǎn)單的部分編寫單元測(cè)試。就像在處理更重要的債務(wù)之前,先還清小額信用貸款一樣,寫一些簡(jiǎn)單但仍有價(jià)值的測(cè)試用例是為單元測(cè)試造勢(shì)的好方法。

一旦有了能提供基本覆蓋率的測(cè)試集,就可以開始尋找系統(tǒng)中關(guān)鍵的部分,或者過(guò)去頻繁出問題的部分,在需求列表中為它們分別創(chuàng)建需求,并確保盡快推動(dòng)這些需求。

(2) 從測(cè)試覆蓋率開始

如果有幸作為網(wǎng)站建設(shè)前端架構(gòu)師啟動(dòng)全新的項(xiàng)目,你的工作就不僅僅是設(shè)置好測(cè)試框架了,還要確保開發(fā)流程本身為單元測(cè)試做好了準(zhǔn)備。就像寫文檔和進(jìn)行代碼審核一樣,寫單元測(cè)試也要花不少時(shí)間。你需要確保任何需要測(cè)試的需求都有額外的時(shí)間來(lái)編寫單元測(cè)試,并且確認(rèn)所需的測(cè)試覆蓋率。

正如前面所說(shuō)的,并不是所有的功能都需要同樣的測(cè)試覆蓋率。但前提是,每一個(gè)用戶故事都是以測(cè)試覆蓋率的相關(guān)任務(wù)作為開始的。只有當(dāng)所有人都認(rèn)為給這些任務(wù)寫測(cè)試用例沒有必要時(shí),才考慮去掉它。這樣我們才能確信,對(duì)于任何需要測(cè)試的功能,都已經(jīng)安排了足夠的時(shí)間去完成它們。

文章關(guān)鍵詞