摘要:當(dāng)我寫(xiě)一段測(cè)試的時(shí)候,我在想些什么按照上面推薦方式完成代碼后,需要進(jìn)行代碼的測(cè)試。當(dāng)我以測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的時(shí)候,我在想些什么可以從上述測(cè)試思路二中進(jìn)行反推。實(shí)際上思路可能是在寫(xiě)代碼或者寫(xiě)測(cè)試的過(guò)程中不斷的改進(jìn)和完善的。
當(dāng)我寫(xiě)一個(gè)功能模塊方法時(shí),我在想些什么
// 無(wú)論什么方法,都是這樣一個(gè)結(jié)構(gòu) const fn = () => { };
比如,我要寫(xiě)一個(gè)接口,查詢組織下的設(shè)備列表 /api/device/list
地基const deviceList = (params) => { // 傳入一些參數(shù) return []; // 返回一個(gè)列表 };
我需要哪些參數(shù):
用戶基本信息(主要是用戶 id,用戶的組織 id)
用戶對(duì)應(yīng)的組織基本信息(主要是組織 id,組織管理員 id,層級(jí)關(guān)系,以及權(quán)限邏輯)
輸出結(jié)果很簡(jiǎn)單,為一個(gè)數(shù)組。
澆筑第一步分析,存在成功和錯(cuò)誤(錯(cuò)誤類型先不考慮)兩種類型的結(jié)果。
// 成功 // 錯(cuò)誤 const deviceList = async (ctx) => { // 錯(cuò)誤 if(someError) { // 返回錯(cuò)誤結(jié)果 } // 成功 return getDevicesByOid(oid); };
這是一個(gè)大概的設(shè)想,沒(méi)有必要將代碼寫(xiě)出來(lái)。然后潤(rùn)化該思路,寫(xiě)出第一段框架。
主體結(jié)構(gòu)首先,傳入的參數(shù)為組織 oid,用戶的信息可以通過(guò) session(或其他方式)從內(nèi)部獲得。
// 成功 // 錯(cuò)誤 // 錯(cuò)誤1:用戶未加入組織 // 錯(cuò)誤2:傳入?yún)?shù)組織不存在 // 錯(cuò)誤3:用戶無(wú)組織權(quán)限 // 傳入?yún)?shù): 要查詢的組織 oid // 能夠通過(guò) session 取到的信息: user const deviceList = async (ctx) => { // 用戶信息 ctx.user // 判斷用戶是否有組織 if (ctx.user.oid === 0) { // 錯(cuò)誤1:用戶未加入組織 } // 如果不傳該參數(shù),查詢當(dāng)前用戶組織的設(shè)備 const { oid = ctx.user.oid } = ctx.request.body; if (oid === ctx.user.oid) { // 成功 return getDevicesByOid(oid); } // 根據(jù)oid查詢組織信息 // 錯(cuò)誤2:傳入?yún)?shù)組織不存在 // 判斷是否有權(quán)限 const checkRights = await checkUserOrgRights(ctx.user.uid, oid); if (!checkRights) { // 錯(cuò)誤3:用戶無(wú)組織權(quán)限 } // 成功 return getDevicesByOid(oid); };
// 成功 // 錯(cuò)誤 // 錯(cuò)誤1:用戶未加入組織 // 錯(cuò)誤2:傳入?yún)?shù)組織不存在 // 錯(cuò)誤3:用戶無(wú)組織權(quán)限 // 傳入?yún)?shù): 要查詢的組織 oid // 能夠通過(guò) session 取到的信息: user const deviceList = async (ctx) => { // 用戶信息 ctx.user // 判斷用戶是否有組織 if (ctx.user.oid === 0) { // 錯(cuò)誤1:用戶未加入組織 } // 如果不傳該參數(shù),查詢當(dāng)前用戶組織的設(shè)備 const { oid = ctx.user.oid } = ctx.request.body; if (oid !== ctx.user.oid) { // 為什么這里不用等于判斷:如果等于的話,則當(dāng)時(shí)就需要返回出去,這樣的話該方法會(huì)有兩個(gè)成功的 return // 根據(jù)oid查詢組織信息 // 錯(cuò)誤2:傳入?yún)?shù)組織不存在 // 判斷是否有權(quán)限 const checkRights = await checkUserOrgRights(ctx.user.uid, oid); if (!checkRights) { // 錯(cuò)誤3:用戶無(wú)組織權(quán)限 } } // 成功 return getDevicesByOid(oid); };封頂
完成其他的業(yè)務(wù)代碼。
當(dāng)我寫(xiě)一段測(cè)試的時(shí)候,我在想些什么按照上面推薦方式完成代碼后,需要進(jìn)行代碼的測(cè)試。
首先需要明確業(yè)務(wù)的流程,理清測(cè)試的思路。
成功
錯(cuò)誤
錯(cuò)誤1:用戶未加入組織
錯(cuò)誤2:傳入?yún)?shù)組織不存在
錯(cuò)誤3:用戶無(wú)組織權(quán)限
主要有兩種設(shè)計(jì)思路:
設(shè)計(jì)思路完成測(cè)試用例,覆蓋成功的所有情況
完成測(cè)試用例,覆蓋錯(cuò)誤1的所有情況
完成測(cè)試用例,覆蓋錯(cuò)誤2的所有情況
完成測(cè)試用例,覆蓋錯(cuò)誤3的所有情況
這是傳統(tǒng)的單元測(cè)試衍生而來(lái)的 BDD 測(cè)試方式。
這里測(cè)試用例的個(gè)數(shù)應(yīng)該為8次:
成功:
1.當(dāng)前組織的用戶有傳入組織 oid
2.當(dāng)前組織的用戶未傳入組織 oid
3-5.上級(jí)組織,上上級(jí)組織,根級(jí)組織的管理員用戶傳入組織 oid
6.失敗1:用戶未加入組織
7.失敗2:傳入?yún)?shù)組織不存在
8.失敗3:用戶無(wú)組織權(quán)限
其中,測(cè)試3-5可以優(yōu)化為一次測(cè)試(即根據(jù)所有管理員 uid 的數(shù)組比較是否包含當(dāng)前用戶 uid),最終優(yōu)化后的結(jié)果應(yīng)當(dāng)為6次。
但由于該思路中不明確用戶,所以用戶行為無(wú)法準(zhǔn)確表達(dá),在創(chuàng)建測(cè)試數(shù)據(jù)的時(shí)候較為困難,不仔細(xì)思考分析,無(wú)法優(yōu)化需要?jiǎng)?chuàng)建多少條測(cè)試數(shù)據(jù)。
而實(shí)際上 BDD 測(cè)試為用戶行為測(cè)試,可以以幾類用戶的情形分別進(jìn)行測(cè)試。
模擬一個(gè)用戶的數(shù)據(jù),覆蓋成功和可能錯(cuò)誤(有可能無(wú)法涵蓋到所有錯(cuò)誤)的所有情況
根據(jù)未覆蓋的部分,再模擬另一個(gè)用戶的數(shù)據(jù),覆蓋成功和可能錯(cuò)誤(有可能無(wú)法涵蓋到所有錯(cuò)誤)的所有情況
以此循環(huán),直至覆蓋所有。
用戶1(非組織管理員,查詢自己的組織)
1.成功(未傳入組織 oid)(組織1)
2.成功(傳入組織 oid)
3.失敗2:傳入?yún)?shù)組織不存在
4.失敗3:用戶無(wú)組織權(quán)限(組織2)
用戶2(上級(jí)某組織管理員)(組織3)
5.成功
用戶3(未加入組織用戶)
6.失敗1:用戶未加入組織
非常簡(jiǎn)潔明了的關(guān)系,需要3個(gè)測(cè)試用戶,3個(gè)組織(上下級(jí)關(guān)系進(jìn)行數(shù)據(jù)復(fù)用,一個(gè)無(wú)權(quán)限的組織),即可涵蓋所有范圍。
最終優(yōu)化版設(shè)計(jì):
用戶1(某組織管理員,有下級(jí)組織)
1.成功(未傳入組織 oid,查詢自己的組織)
2.成功(傳入當(dāng)前的組織 oid(組織1))
3.成功(傳入下級(jí)的組織 oid(組織2))
4.失敗2:傳入?yún)?shù)組織不存在
5.失敗3:用戶無(wú)組織權(quán)限
用戶2(未加入組織用戶)
6.失敗1:用戶未加入組織(組織3)
兩個(gè)用戶,三個(gè)組織。完成所有覆蓋。
當(dāng)我以測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的時(shí)候,我在想些什么可以從上述測(cè)試思路二中進(jìn)行反推。
實(shí)際上思路可能是在寫(xiě)代碼或者寫(xiě)測(cè)試的過(guò)程中不斷的改進(jìn)和完善的。
如果已經(jīng)寫(xiě)好了測(cè)試正在寫(xiě)代碼,可以及時(shí)回過(guò)頭來(lái)調(diào)整測(cè)試;
如果功能寫(xiě)好了又再重新測(cè)試,可以在測(cè)試優(yōu)化后再去看邏輯代碼是否還有優(yōu)化的空間。
更多關(guān)注: https://leader.js.cool/#/expe...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/8770.html
摘要:當(dāng)我寫(xiě)一段測(cè)試的時(shí)候,我在想些什么按照上面推薦方式完成代碼后,需要進(jìn)行代碼的測(cè)試。當(dāng)我以測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的時(shí)候,我在想些什么可以從上述測(cè)試思路二中進(jìn)行反推。實(shí)際上思路可能是在寫(xiě)代碼或者寫(xiě)測(cè)試的過(guò)程中不斷的改進(jìn)和完善的。 當(dāng)我寫(xiě)一個(gè)功能模塊方法時(shí),我在想些什么 // 無(wú)論什么方法,都是這樣一個(gè)結(jié)構(gòu) const fn = () => { }; 比如,我要寫(xiě)一個(gè)接口,查詢組織下的設(shè)備列表 /a...
摘要:最后,我們來(lái)到了提前預(yù)定好的今晚的住宿地杭州旅行者漫步主題酒店。先一本正經(jīng)的打打官腔,還有童鞋不知道什么叫嗎口答前端技術(shù)論壇簡(jiǎn)稱。作為聽(tīng)眾,不要對(duì)期待參加某場(chǎng)技術(shù)會(huì)議,提升自我技術(shù)修養(yǎng)的效果會(huì)立竿見(jiàn)影。 showImg(https://segmentfault.com/img/bV0tLv?w=859&h=487); 前言 在這里,閏土首先要感謝以下兩位大佬提供的門(mén)票,分別是來(lái)自新浪微...
摘要:有工程師標(biāo)簽用于連接各種各樣的樣式,有層疊樣式表,行為樣式層有包工頭標(biāo)簽包裹了所有組成網(wǎng)頁(yè)的標(biāo)簽,只有在包工頭的監(jiān)管下,這些包身工才能好好工作啊而敲代碼的我們?cè)谄渲邪缪莸慕巧陀悬c(diǎn)像被抓的壯丁。我們所看到的網(wǎng)頁(yè),是一個(gè)有一個(gè)標(biāo)簽搭建而成,就像蓋房子, 有地基(Ps.): html標(biāo)簽包裹所有的HTML代碼,不管是頁(yè)面搭建的body,還是連接樣式的head,統(tǒng)統(tǒng)都在。 有工程師(Ps.)...
摘要:北京站是今年中國(guó)規(guī)模最大的一場(chǎng)峰會(huì)。不只是全球領(lǐng)軍者,技術(shù)工具箱持續(xù)創(chuàng)新本次峰會(huì)上,亞馬遜首席技術(shù)官沃納威格爾不僅詳細(xì)介紹了等最新技術(shù)服務(wù),而且還向生態(tài)合作伙伴再次布道了的技術(shù)賦能理念。根據(jù)7月底亞馬遜發(fā)布的2018財(cái)年第二季度財(cái)報(bào),AWS云服務(wù)第二季度營(yíng)收為61.05億美元,比上年同期的41.00億美元增長(zhǎng)49%;AWS業(yè)務(wù)營(yíng)業(yè)利潤(rùn)為16.42億美元,較去年同期的9.16億美元增長(zhǎng)79.2...
摘要:往后打算當(dāng)博客寫(xiě),并記錄自己學(xué)習(xí)成長(zhǎng)之路,先開(kāi)始從設(shè)計(jì)模式部分寫(xiě)起,本人也還沒(méi)學(xué)完。 為什么我沒(méi)有寫(xiě)具體語(yǔ)言呢?語(yǔ)言只是一種工具,是為了更好解決實(shí)際問(wèn)題的。 計(jì)算機(jī)專業(yè)一名普通男生,語(yǔ)言方向是Java,臨近畢業(yè),沒(méi)有選擇考研升學(xué),或者拿出幾個(gè)月時(shí)間瘋玩來(lái)個(gè)說(shuō)走就走的畢業(yè)旅行,而是選擇實(shí)習(xí)工作,目前在本地省電視臺(tái)實(shí)習(xí),我不是什么大牛,我只是個(gè)愚笨的小菜鳥(niǎo)。往后打算當(dāng)博客寫(xiě),并記錄自己...
閱讀 646·2021-09-22 10:02
閱讀 6410·2021-09-03 10:49
閱讀 571·2021-09-02 09:47
閱讀 2157·2019-08-30 15:53
閱讀 2936·2019-08-30 15:44
閱讀 908·2019-08-30 13:20
閱讀 1822·2019-08-29 16:32
閱讀 895·2019-08-29 12:46