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