網(wǎng)站制作公司做好網(wǎng)站程序bug單元測(cè)試解決方案解析。深圳專業(yè)
網(wǎng)站制作公司提醒單元測(cè)試是將應(yīng)用程序分解為盡可能小的函數(shù),并創(chuàng)建可重復(fù)的、自動(dòng)化的測(cè)試用例的過(guò)程。在同等條件下,這些測(cè)試用例應(yīng)該一直產(chǎn)生相同的結(jié)果,它們是應(yīng)用程序的靈魂,并為今后所有應(yīng)用程序的代碼提供構(gòu)建的基礎(chǔ)。如果沒(méi)有單元測(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èn)題。網(wǎng)站制作前端架構(gòu)師的主要責(zé)任是保證開(kāi)發(fā)者擁有盡可能高效的開(kāi)發(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)決定,但前端開(kāi)發(fā)人員寫(xiě)出的代碼可能也需要測(cè)試。因此,熟悉盡可能多的測(cè)試工具很重要。掌握所有工具,甚至達(dá)到精通的程度,那是非常奢侈的。但如果對(duì)基本概念有著深刻的理解,將能幫助你和你的團(tuán)隊(duì)編寫(xiě)出更加可測(cè)試的代碼,并快速地掌握任何測(cè)試框架。
下面首先來(lái)回顧一下這些基本概念,然后再來(lái)看一些實(shí)際的代碼。
網(wǎng)站制作公司做好網(wǎng)站程序bug單元測(cè)試解決方案之單元
“一次只做一件事,并把它做好”是構(gòu)建基于單元測(cè)試的應(yīng)用程序的原則。我們?cè)趯?xiě)函數(shù)時(shí)經(jīng)常想同時(shí)實(shí)現(xiàn)很多功能,結(jié)果最后不僅降低了效率,還增加了測(cè)試的難度,因?yàn)檫@樣的函數(shù)無(wú)法復(fù)用。思考一個(gè)簡(jiǎn)單的函數(shù):通過(guò)客戶的地址,計(jì)算出將產(chǎn)品從最近的分撥中心運(yùn)輸給客戶的運(yùn)費(fèi)。深圳網(wǎng)站制作公司下面來(lái)分解一下這個(gè)函數(shù)。函數(shù)要做的第一件事是通過(guò)客戶的地址找到最近的分撥中心;然后使用分撥中心的地址,計(jì)算出分撥中心到客戶地址的距離;最后,使用這個(gè)距離,計(jì)算出將貨物從點(diǎn) A 運(yùn)輸?shù)近c(diǎn) B 的費(fèi)用。因此,雖然只有一個(gè)函數(shù),它卻做了 3 件相互獨(dú)立的事:
(1) 根據(jù)地址找到最近的分撥中心
(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ù)地址找到最近的分撥中心,一個(gè)計(jì)算兩個(gè)地址之間的距離,還有一個(gè)根據(jù)距離計(jì)算運(yùn)費(fèi)。
網(wǎng)站制作公司做好網(wǎng)站程序bug單元測(cè)試解決方案之更多重用
現(xiàn)在,這 3 個(gè)函數(shù)可以在整個(gè)應(yīng)用中使用了,而不只是用來(lái)計(jì)算運(yùn)費(fèi)。如果程序的其他部分需要找到最近的分撥中心或者計(jì)算兩個(gè)地址之間的距離,可以直接調(diào)用這些已經(jīng)寫(xiě)好的函數(shù)?,F(xiàn)在,在較大的函數(shù)體中,我們不用一遍又一遍地重寫(xiě)功能相同的模塊了。
網(wǎng)站制作公司做好網(wǎng)站程序bug單元測(cè)試解決方案之更好的測(cè)試
我們可以測(cè)試每個(gè)獨(dú)立且可重用的函數(shù),而非測(cè)試應(yīng)用程序所能計(jì)算的每一條運(yùn)輸路線。隨著應(yīng)用程序的發(fā)展,開(kāi)發(fā)一個(gè)新功能所需要?jiǎng)?chuàng)建的新函數(shù)越來(lái)越少。最終,我們用較少的低復(fù)雜度的函數(shù)完成了高復(fù)雜度的功能。
網(wǎng)站制作公司做好網(wǎng)站程序bug單元測(cè)試解決方案之測(cè)試驅(qū)動(dòng)的開(kāi)發(fā)
大多數(shù)人在首次接觸單元測(cè)試時(shí),可能寫(xiě)過(guò)一些功能代碼以滿足業(yè)務(wù)需求(比如上文中的計(jì)算運(yùn)費(fèi)的例子),然后也努力地將它重構(gòu)為更小的、可重用的、可測(cè)試的代碼,之后才去思考如何寫(xiě)測(cè)試用例。測(cè)試驅(qū)動(dòng)的開(kāi)發(fā)(test-driven development,TDD)則顛倒了這一思路,它將單元測(cè)試放在第一位,之后才是編寫(xiě)功能代碼。
但如果為還沒(méi)有創(chuàng)建的函數(shù)寫(xiě)測(cè)試用例,那些函數(shù)豈不是肯定無(wú)法通過(guò)測(cè)試嗎?的確!但測(cè)試驅(qū)動(dòng)的開(kāi)發(fā)的目標(biāo)是,通過(guò)測(cè)試用例來(lái)描述一個(gè)正確編寫(xiě)的系統(tǒng)應(yīng)如何工作,并為實(shí)現(xiàn)這個(gè)系統(tǒng)來(lái)鋪平道路。對(duì)于上文提到的計(jì)算運(yùn)費(fèi)的例子,在測(cè)試驅(qū)動(dòng)的開(kāi)發(fā)中會(huì)為三個(gè)實(shí)現(xiàn)業(yè)務(wù)需求的函數(shù)分別編寫(xiě)單元測(cè)試。開(kāi)發(fā)者的工作就是將一開(kāi)始沒(méi)有通過(guò)單元測(cè)試的函數(shù)變?yōu)槟軌蛲ㄟ^(guò)測(cè)試的函數(shù)。首先實(shí)現(xiàn)一個(gè)可以正確地查找出最近的分撥中心的位置的函數(shù),并通過(guò)第一個(gè)單元測(cè)試。然后,繼續(xù)實(shí)現(xiàn)計(jì)算距離和計(jì)算運(yùn)費(fèi)的函數(shù),最終得到三個(gè)通過(guò)與之對(duì)應(yīng)的單元測(cè)試的函數(shù)。網(wǎng)站制作公司提醒完成上述步驟后,我們不僅實(shí)現(xiàn)了應(yīng)用的計(jì)算運(yùn)費(fèi)的功能,還讓這些函數(shù)有了完全的測(cè)試覆蓋率。
網(wǎng)站制作公司做好網(wǎng)站程序bug單元測(cè)試解決方案之一個(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è)試:
function calculateShipping(distance) {
switch(distance) {
case (distance < 25):
shipping = 4;
break;
case (distance < 100):
shipping = 5;
break;
case (distance < 1000):
shipping = 6;
break;
case (distance >= 1000):
shipping = 7;
break;
}
return shipping;
}
QUnit.test('Calculate Shipping',function(assert) {
assert.equal(calculateShipping(24),4,"24 Miles");
assert.equal(calculateShipping(99),5,"99 Miles");
assert.equal(calculateShipping(999),6,"999 Miles");
assert.equal(calculateShipping(1000),7,"1000 Miles");
};
QUnit(https://qunitjs.com/)有多個(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é)果。
深圳網(wǎng)站制作公司提醒上文中通過(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ì)反饋提示失敗,因此我們能夠在有問(wèn)題的代碼部署到生產(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)或按下鍵盤(pán)時(shí)的返回值,QUnit 也能夠支持。好了,
深圳網(wǎng)站制作公司本文關(guān)于“網(wǎng)站制作公司做好網(wǎng)站程序bug單元測(cè)試解決方案解析”知識(shí)就分享到這里。如果您需要找深圳高端網(wǎng)站制作公司來(lái)替您解決定制網(wǎng)站前端設(shè)計(jì)與程序bug的問(wèn)題,聯(lián)系我們網(wǎng)站在線客服,免費(fèi)獲取解決方案。謝謝關(guān)注,博納網(wǎng)絡(luò)編輯整理。