一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

持續(xù)集成之“測(cè)試三角形與分段構(gòu)建策略原則”

  在《戲說(shuō)Checkin Dance》一文中,咱們說(shuō)到:Joe的團(tuán)隊(duì)實(shí)施了帶有令牌的持續(xù)集成提交流程紀(jì)律。由于每個(gè)人都做本地構(gòu)建進(jìn)行驗(yàn)證后再提交,所以持續(xù)集成平臺(tái)上的構(gòu)建結(jié)果比較穩(wěn)定,每天持續(xù)集成服務(wù)器上的構(gòu)建最多只有一兩次失敗(常見的原因是忘記提交某個(gè)文件而導(dǎo)致失敗,和因本地環(huán)境配置與平臺(tái)環(huán)境配置不一致而導(dǎo)致失敗),但一般都能在30分鐘內(nèi)修復(fù)。隨著項(xiàng)目的進(jìn) 行,新功能不斷地增加,自動(dòng)化測(cè)試用例也越積越多。由于不做任何修改,本地構(gòu)建腳本就會(huì)運(yùn)行所有自動(dòng)化測(cè)試用例,所以本地構(gòu)建的運(yùn)行時(shí)間也越來(lái)越長(zhǎng)。團(tuán)隊(duì)里有人開始抱怨,“每次提交代碼前,運(yùn)行本地構(gòu)建都超過(guò)15分鐘,這樣太浪費(fèi)時(shí)間。我們可否把那些不太重要的測(cè)試拿出去,不再運(yùn)行了?”

  一、自動(dòng)化測(cè)試黃金三角形

  作為團(tuán)隊(duì)的技術(shù)負(fù)責(zé)人,Joe把大家叫到一起,就這個(gè)問(wèn)題進(jìn)行了專門的討論。

  “我們不能放棄運(yùn)行這些測(cè)試。”Alice說(shuō)道,“在我前一個(gè)項(xiàng)目中,我們就是這么做的,結(jié)果,這些花精力寫的測(cè)試都作廢了。”

  “那是為什么呢?”?Bob問(wèn)道。

  Alice回答道:“因?yàn)椴⒉唤?jīng)常運(yùn)行這些測(cè)試,隨著功能的修改,有些測(cè)試的邏輯就不再是正確的了。而當(dāng)再次運(yùn)行發(fā)現(xiàn)這類問(wèn)題時(shí),通常的結(jié)果就是把這個(gè)測(cè)試刪掉,因?yàn)樾迯?fù)這個(gè)測(cè)試的工作量太大了。”

  “那持續(xù)運(yùn)行所有測(cè)試的話,等待的時(shí)間太長(zhǎng)了,也是一種浪費(fèi)呀。”Bob說(shuō)道。

  此時(shí),作為團(tuán)隊(duì)技術(shù)負(fù)責(zé)人的Joe說(shuō)話了。“讓我們先分析一下,到底有哪些什么原因讓我們的測(cè)試在這么短的時(shí)間里就變成需要這么長(zhǎng)時(shí)間了呢?”

  “功能增加的多了,測(cè)試自然就多了唄。”

  “功能增加了,自動(dòng)化測(cè)試數(shù)據(jù)的準(zhǔn)備工作也多了,需要的時(shí)間當(dāng)然就長(zhǎng)了。”

  “現(xiàn)在我們的測(cè)試中有很多地方需要測(cè)試在原地等待結(jié)果返回,所以等待時(shí)間也挺長(zhǎng)的。”

  “大家還有沒(méi)有其它原因?”Joe追問(wèn)道。

  大家沉默了一會(huì)兒,Bob說(shuō)道:“好象主要就這些原因吧”。

  “那好吧。功能多而導(dǎo)致測(cè)試多這是好事兒,說(shuō)明我們大家都非常重視我們的自動(dòng)化測(cè)試。對(duì)于‘測(cè)試準(zhǔn)備時(shí)間變長(zhǎng)’這個(gè)問(wèn)題可以理解,因?yàn)槲覀兊漠a(chǎn)品越來(lái)越復(fù)雜了。對(duì)于‘結(jié)果返回的等待問(wèn)題‘嘛,需要具體問(wèn)題,具體分析。前幾天,我看到一個(gè)‘測(cè)試黃金三角形’,講的就是自動(dòng)化測(cè)試中各類測(cè)試的應(yīng)具有的比例關(guān)系,對(duì)我很有啟發(fā)。我在白板上畫一下吧。”于是,Joe走到白板前,將這個(gè)測(cè)試黃金三角形畫了下來(lái),如圖1所示。

  然后,Joe將這個(gè)圖形解釋了一下。原來(lái),這個(gè)三角形講的就是單元測(cè)試、集成測(cè)試和驗(yàn)收測(cè)試的關(guān)系。首先,左邊向上的箭頭表示,越高層次的測(cè)試維護(hù)成本越高,運(yùn)行時(shí)間越長(zhǎng)。因此,對(duì)于單個(gè)測(cè)試來(lái)說(shuō),單元測(cè)試運(yùn)行最快,維護(hù)最容易,而集成測(cè)試次之,驗(yàn)收測(cè)試則最高。每類測(cè)試的面積代表著該測(cè)試的數(shù)量。現(xiàn)在,業(yè)界有很多種工具支持單元測(cè)試,因此它的編寫及維護(hù)成本相對(duì)其它兩種測(cè)試來(lái)說(shuō)較低,應(yīng)使用單元測(cè)試對(duì)代碼做盡可能多的測(cè)試覆蓋。一般來(lái)說(shuō),單元測(cè)試覆蓋率達(dá)到70~80%是比較理想的狀態(tài)。

  接著,Joe問(wèn)了大家一個(gè)問(wèn)題:“我們產(chǎn)品中的這些自動(dòng)化測(cè)試屬于哪一類測(cè)試?”

  Alice說(shuō)道:“那要看你怎么定義單元測(cè)試中的這個(gè)單元。”

  “根據(jù)WikiPedia上的定義,一個(gè)單元是指應(yīng)用程序中最小可測(cè)試的部分。既然我們使用面向?qū)ο蟮拈_發(fā)語(yǔ)言C++,那么單元測(cè)試的粒度應(yīng)該是類中的一個(gè)方法吧。而且,通常來(lái)說(shuō),如果一個(gè)測(cè)試包括以下任何一個(gè)情形,它就不是一個(gè)單元測(cè)試:(1) 需要連接數(shù)據(jù)庫(kù);(2) 需要網(wǎng)絡(luò)通信;(3) 需要與文件系統(tǒng)打交道;(4) 不能和其它單元測(cè)試同時(shí)運(yùn)行;(5) 需要對(duì)環(huán)境進(jìn)行一些配置(如編輯配置文件)才能運(yùn)行它。”Joe回答道。

  “要是這么說(shuō)的話,我們的測(cè)試中,一部分是模塊集成測(cè)試,一部分是驗(yàn)收測(cè)試,只有一小部分算是單元測(cè)試。我們的測(cè)試集合正好是一個(gè)倒三角。”Bob邊說(shuō),邊在白板上畫了出來(lái),如圖2所示。

  “既然高層次上的測(cè)試(集成測(cè)試和驗(yàn)收測(cè)試)維護(hù)量比較大,今后我們應(yīng)該加入更多的低層次測(cè)試(單元測(cè)試),對(duì)于關(guān)鍵功能進(jìn)行集成測(cè)試和驗(yàn)收測(cè)試。如果對(duì)于測(cè)試用例具有等價(jià)性的話,我們應(yīng)該用低層次測(cè)試來(lái)實(shí)現(xiàn)。這樣我們就會(huì)達(dá)到自動(dòng)化測(cè)試的黃金三角狀態(tài)啦。”Joe邊說(shuō)邊在白板上筆劃著,如圖3所示。

  “我同意你說(shuō)法,但是仍舊沒(méi)有解決我們目前遇到的問(wèn)題。如何解決我們現(xiàn)在本地構(gòu)建時(shí)間太長(zhǎng)的問(wèn)題呢?”Alice有點(diǎn)兒不耐煩地問(wèn)道。

  二、分階段構(gòu)建?

  “這還不容易,Martin Folwer(敏捷宣言的創(chuàng)造者之一)已經(jīng)給出了一個(gè)解決方案,那就是兩階段構(gòu)建(Secondary Build)。也就是說(shuō),我們可以把那些運(yùn)行比較慢,時(shí)間比較長(zhǎng)且基本上不會(huì)失敗的自動(dòng)化測(cè)試用例挑選出來(lái),組成一個(gè)新的測(cè)試集,在第二階段運(yùn)行,可以叫做‘二級(jí)構(gòu)建階段’。剩余的測(cè)試集仍舊放在第一個(gè)階段運(yùn)行,我們可以把第一個(gè)階段叫做‘提交構(gòu)建階段’。”Joe回答道。

  “那什么時(shí)間運(yùn)行這兩個(gè)階段的構(gòu)建呢?”Bob問(wèn)道。

  “提交階段構(gòu)建當(dāng)然就是在我們每個(gè)人提交之后就運(yùn)行啦。而且在我們提交之前,作為本地驗(yàn)證集合,在我們開發(fā)環(huán)境上也要運(yùn)行同樣的提交構(gòu)建。一般來(lái)說(shuō),本地構(gòu)建和提交構(gòu)建最好都在五分鐘內(nèi)完成,最長(zhǎng)也不要超過(guò)十分鐘,否則開發(fā)人員就不愿意花時(shí)間做頻繁地代碼提交啦。另外,一旦提交階段構(gòu)建成功以后,就馬上自動(dòng)觸發(fā)第二階段構(gòu)建。而我們開發(fā)人員在持續(xù)集成服務(wù)器上的提交階段構(gòu)建成功以后,就可以繼續(xù)進(jìn)行其它的工作啦。”Joe說(shuō)道,“我們?cè)瓉?lái)的六步提交圖就變成這個(gè)樣子了。”說(shuō)著,Joe拿起白板筆就畫了出來(lái),如圖4所示。

  “不對(duì),這里有問(wèn)題!持續(xù)集成強(qiáng)調(diào)盡早反饋。如果把測(cè)試分成兩個(gè)階段了,那反饋周期不是加長(zhǎng)了 嗎?”Bob反駁道。

  Joe 點(diǎn)點(diǎn)頭,說(shuō)道:“你說(shuō)的沒(méi)有錯(cuò)。但是,根據(jù)我們現(xiàn)有的軟硬件資源條件,我們目前還無(wú)法通過(guò)增加資源的方式來(lái)縮短所有測(cè)試運(yùn)行的時(shí)間。所以我們必須在質(zhì)量與速度之前做出平衡。這也是我為什么要把那些不易出錯(cuò)的自動(dòng)化測(cè)試集合放在第二階段構(gòu)建的原因,這樣可以降低但不能完全解除第二階段構(gòu)建失敗的風(fēng)險(xiǎn)。所以, 這也要求我們大家當(dāng)?shù)诙A段構(gòu)建失敗時(shí),也要找人盡快把它解決,并且把相關(guān)的測(cè)試再次放回提交測(cè)試階段中運(yùn)行,或者在提交測(cè)試階段加入新的測(cè)試來(lái)補(bǔ)充。” 

  Alice此時(shí)插話,問(wèn)道:“既然第二階段構(gòu)建不常失敗,為什么我們不定時(shí)運(yùn)行它,比如每天晚上運(yùn)行一次呢?這樣不是更節(jié)省資源嗎?另外,如果第二階段構(gòu)建運(yùn)行得慢,那它不是一直都落后嗎?”

  “因?yàn)槊看翁峤浑A段構(gòu)建成功以后就觸發(fā)第二階段構(gòu)建,這樣無(wú)論如何都比每天晚上運(yùn)行一次的更多的反饋。因?yàn)槊刻焱砩线\(yùn)行一次的話,如果出了問(wèn)題,我們只能在第二天早上才能發(fā)現(xiàn)。對(duì)于你的第二個(gè)問(wèn)題,我畫一張圖來(lái)解釋。”Joe找了一張大白紙,在上面開始畫了起來(lái)。

  一會(huì)兒功夫,幾個(gè)示意圖就畫好了。看到這幾個(gè)示意圖以后,大家恍然大悟。如圖5所示。從圖中我們可以看到:

  1. 當(dāng)版本123的第二階段構(gòu)建被觸發(fā)并正在運(yùn)行,Alice又提交了一次,觸發(fā)了版本124的提交構(gòu)建;
  2. 當(dāng)版本124的提交構(gòu)建完成之后,由于版本123的第二階段構(gòu)建仍在運(yùn)行,所以不再觸發(fā)第二階段構(gòu)建;
  3. 當(dāng)版本125的提交構(gòu)建完成時(shí),版本123的第二階段構(gòu)建仍舊在運(yùn)行,所以也不觸發(fā)第二階段構(gòu)建;
  4. 當(dāng)版本126提交構(gòu)建正在運(yùn)行時(shí),版本123的第二階段構(gòu)建剛完成,此時(shí)由于版本125的提交階段構(gòu)建是一個(gè)最近 成功完成的提交構(gòu)建,所以持續(xù)集成服務(wù)器就會(huì)啟動(dòng)該版本的第二階段構(gòu)建,而忽略版本124的提交構(gòu)建。

  “那根據(jù)我們持續(xù)集成紀(jì)律,誰(shuí)的提交讓構(gòu)建失敗,就由誰(shuí)來(lái)修復(fù)。如果版本125的第二階段構(gòu)建失敗了,就包括版本124和125兩次提交的變更,由誰(shuí)來(lái)修復(fù)呢?”Bob接著問(wèn)道。

  “這個(gè)好辦,由這兩個(gè)提交人一起負(fù)責(zé)修復(fù)。如果想確切找到誰(shuí)的提交有問(wèn)題,還可以手動(dòng)觸發(fā)版本124的第二次構(gòu)建。假如構(gòu)建成功,說(shuō)明版本125有問(wèn)題,假如構(gòu)建失敗,說(shuō)明問(wèn)題在版本124就引入了。”Alice搶著說(shuō)道。

  討論到這里,團(tuán)隊(duì)成員都達(dá)成了共識(shí):(1) 開始加強(qiáng)單元測(cè)試的力度;(2) 在反饋速度和反饋質(zhì)量之間做出折衷,使用二級(jí)構(gòu)建構(gòu)建的方式。

  整個(gè)產(chǎn)品的開發(fā)非常順利,馬上就要進(jìn)行版本發(fā)布了。團(tuán)隊(duì)還會(huì)遇到什么問(wèn)題呢?他們是如何解決的呢?請(qǐng)聽下回分解。

it知識(shí)庫(kù)持續(xù)集成之“測(cè)試三角形與分段構(gòu)建策略原則”,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产综合自拍 | 色综合狠狠干 | 国内自拍经典三级在线 | 久久香蕉综合色一综合色88 | 国产午夜免费视频片夜色 | 久久国内精品自在自线观看 | 久久久久一 | 亚洲88av| 色美女网站| 狠狠综合久久综合88亚洲日本 | 手机在线色 | 伊人精品综合 | 国产专区青青草原亚洲 | 久久99爰这里有精品国产 | 中文字幕一区二区三区在线播放 | 热99精品视频 | 色77影院| 精品福利视频第一 | 激情小视频在线观看 | 激情免费网站 | 久久全国免费久久青青小草 | 草草草视频在线观看 | 99视频精品免视3 | 免费人成a大片在线观看动漫 | 激情视频在线播放 | 四虎国产精品一区二区 | 亚洲伊人色 | 久久视热这只是精品222 | 亚洲综合激情小说 | 亚洲人色大成年网站在线观看 | 91精品国产综合久久青草 | 国内精品免费久久久久妲己 | 四虎影视国产884a精品亚洲 | 一区二区三区在线免费视频 | 久久九九免费视频 | 国产精品第12页 | 91精品国产乱码久久久久久 | 国产aaa免费视频国产 | 中国一级特黄真人毛片免 | 麻豆国产精品视频 | 视频一区 精品自拍 |