成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

像蓋房子一樣寫(xiě)代碼:當(dāng)我以測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的時(shí)候,我在想些什么

jlanglang / 3172人閱讀

摘要:當(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);
};

推薦的實(shí)現(xiàn)方式

// 成功
// 錯(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

相關(guān)文章

  • 像蓋房子一樣寫(xiě)代碼當(dāng)我以測(cè)試驅(qū)動(dòng)開(kāi)發(fā)時(shí)候我在想些什么

    摘要:當(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...

    anRui 評(píng)論0 收藏0
  • 記錄一次參加D2前端技術(shù)論壇杭州之行

    摘要:最后,我們來(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)自新浪微...

    wangym 評(píng)論0 收藏0
  • 代碼就是蓋房子

    摘要:有工程師標(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.)...

    Yang_River 評(píng)論0 收藏0
  • 不只是IaaS領(lǐng)先:亞馬遜AWS創(chuàng)新驅(qū)動(dòng)加速中國(guó)布局

    摘要:北京站是今年中國(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...

    CollinPeng 評(píng)論0 收藏0
  • 開(kāi)發(fā)之路(學(xué)習(xí)設(shè)計(jì)模式前言)

    摘要:往后打算當(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ě),并記錄自己...

    sixgo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<