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