17792550360
掃描二維碼
關(guān)注卓目鳥(niǎo)學(xué)苑公眾號(hào)
掃描二維碼
關(guān)注卓目鳥(niǎo)學(xué)苑公眾號(hào)
很多團(tuán)隊(duì)都傾向于認(rèn)為自動(dòng)化是一種加速軟件交付的方式,因?yàn)檫@是團(tuán)隊(duì)內(nèi)部經(jīng)常能夠感知到的瓶頸。但是,如果他們將自己的開(kāi)發(fā)實(shí)踐過(guò)程當(dāng)作一個(gè)整體來(lái)深入研究的話,那么他們會(huì)得到更好的結(jié)果。一、如何預(yù)防 BUGS?測(cè) ...
很多團(tuán)隊(duì)都傾向于認(rèn)為自動(dòng)化是一種加速軟件交付的方式,因?yàn)檫@是團(tuán)隊(duì)內(nèi)部經(jīng)常能夠感知到的瓶頸。但是,如果他們將自己的開(kāi)發(fā)實(shí)踐過(guò)程當(dāng)作一個(gè)整體來(lái)深入研究的話,那么他們會(huì)得到更好的結(jié)果。 一、如何預(yù)防 BUGS? 測(cè)試,尤其是 UI 層面的自動(dòng)化測(cè)試,通常會(huì)被安排在軟件交付周期的最末端,通常會(huì)試圖發(fā)現(xiàn)一些可能進(jìn)入生產(chǎn)環(huán)境并給最終用戶(hù)造成不良影響的 bug(這些 bug 就如同細(xì)菌一般)。在這種情況下進(jìn)行的測(cè)試可以探測(cè)出 bug 的癥狀,開(kāi)發(fā)人員進(jìn)行的修復(fù)就是治療。這就如同我們?cè)诘却覀兊南到y(tǒng)生病并為此采取一些措施。 這種方法對(duì)于團(tuán)隊(duì)來(lái)說(shuō)是有一定的效果,但是,現(xiàn)在的工作環(huán)境迫使我們用更少的人做更多的事并且要比以往更快地完成任務(wù)。因此,這種方法并不能長(zhǎng)期可持續(xù)地運(yùn)轉(zhuǎn)。這時(shí)基于預(yù)防的方法而非治療的方法就橫空出世了。 通過(guò)對(duì)如何構(gòu)建系統(tǒng)作出調(diào)整,我們就可以在故障發(fā)生之前探測(cè)出問(wèn)題,或者更好的是,讓他們從一開(kāi)始就不那么容易產(chǎn)生 bug(這就是所謂的“預(yù)防”)。這就意味著我們?cè)?bug 產(chǎn)生前就預(yù)防它的發(fā)生而非試圖在 bug 產(chǎn)生后再治療它。古語(yǔ)有云:預(yù)防勝于治療! 二、我們的測(cè)試自動(dòng)化之旅 在我剛開(kāi)始加入移動(dòng)團(tuán)隊(duì)(該團(tuán)隊(duì)負(fù)責(zé)創(chuàng)建并管理公司的點(diǎn)播產(chǎn)品)時(shí),我們所有的測(cè)試都是手工執(zhí)行的,平均每年我們只在每個(gè)平臺(tái)上發(fā)布 2 到 3 次。我們知道如果想要加快速度,最明顯的瓶頸就是測(cè)試。 在沒(méi)有發(fā)現(xiàn)新 bug 的情況下,每個(gè)回歸測(cè)試周期要花費(fèi)將近兩周的時(shí)間。如果發(fā)現(xiàn)了新 bug,那么開(kāi)發(fā)團(tuán)隊(duì)需要時(shí)間理解并確認(rèn) bug,確定一個(gè)修復(fù)方案,然后再應(yīng)用這個(gè)方案。這會(huì)導(dǎo)致已經(jīng)執(zhí)行的任何測(cè)試都變得無(wú)效,因此需要重新啟動(dòng)測(cè)試過(guò)程,最終導(dǎo)致測(cè)試周期花費(fèi)兩倍以上的時(shí)間。 因此,我們開(kāi)始著眼于將更多的 UI 測(cè)試進(jìn)行自動(dòng)化處理。我們總是從小的方面開(kāi)始改變看看這樣的嘗試能否將我們引入我們想要的正確的方向上,并且我們只選擇對(duì)新功能進(jìn)行自動(dòng)化測(cè)試。這種嘗試一旦被證實(shí)是有效的,我們就會(huì)將自動(dòng)化測(cè)試引入到現(xiàn)存系統(tǒng)的其他領(lǐng)域或者已知的問(wèn)題領(lǐng)域。 我們組織 3 個(gè)朋友作為一個(gè)團(tuán)隊(duì)來(lái)理解我們想要構(gòu)建什么,以及該特性的關(guān)鍵接受標(biāo)準(zhǔn)應(yīng)該是什么。這為我們提供了一個(gè)起點(diǎn),讓我們了解如何分解該特性以及哪些用戶(hù)場(chǎng)景需要自動(dòng)化。 在此基礎(chǔ)上,我們確定了可以用來(lái)自動(dòng)化測(cè)試的工具(Calabash 和 Appium),并在實(shí)際環(huán)境中應(yīng)用它們。對(duì)我們來(lái)說(shuō),這是在真實(shí)的手機(jī)上進(jìn)行測(cè)試,而不是模擬器,為此我們建立了自己的設(shè)備測(cè)試場(chǎng)以更好地利用我們的移動(dòng)設(shè)備,同時(shí)也允許它擴(kuò)大規(guī)模以期能夠在整個(gè)組織中得到應(yīng)用。 三、自動(dòng)化測(cè)試帶給我們的好處 起初,自動(dòng)化給我們帶來(lái)了很大的幫助:通過(guò)自動(dòng)化我們可以快速可靠地運(yùn)行簡(jiǎn)單場(chǎng)景的測(cè)試用例并迅速得到我們想要的反饋結(jié)果。但是隨著時(shí)間的推移,在最初的一批bug 被捕獲之后,自動(dòng)化測(cè)試很難再發(fā)現(xiàn)新的 bug 了,除非我們手動(dòng)地修改自動(dòng)化用例代碼。 同時(shí),我們也注意到由于某些場(chǎng)景我們無(wú)法自動(dòng)化導(dǎo)致一些 bug 依然存在于系統(tǒng)之中:比如,任何與可用性相關(guān)的功能都不得不進(jìn)行手工測(cè)試。 因此,我們最終采取了一種混合的解決方案---自動(dòng)化用來(lái)快速跑一些關(guān)鍵場(chǎng)景,讓團(tuán)隊(duì)知道自動(dòng)化測(cè)試沒(méi)有明顯地破壞任何東西,以及如果合適的話對(duì)任何新功能進(jìn)行的探索性測(cè)試也可以自動(dòng)化處理。因此,嘗試自動(dòng)化測(cè)試的過(guò)程是曲折的,我們?cè)趪L試測(cè)試時(shí)很容易出錯(cuò),又或者手工測(cè)試花費(fèi)的時(shí)間太長(zhǎng)。 帶給我們自動(dòng)化之旅的一個(gè)意料之外的好處就是我們開(kāi)始更快地發(fā)布產(chǎn)品,自動(dòng)化讓我們更加專(zhuān)注于我們正在嘗試完成的工作事項(xiàng)。這就讓我們可以將每一個(gè)新特性新功能拆分成更加細(xì)小的分支(可以獨(dú)立運(yùn)行的分支)并將這些分支進(jìn)行自動(dòng)化測(cè)試。 這使得我們可以更快地將各個(gè)分支發(fā)布到生產(chǎn)環(huán)境中并從最終用戶(hù)處得到實(shí)時(shí)的反饋。起初這一好處并不明顯,因?yàn)槲覀內(nèi)栽趪L試著識(shí)別自動(dòng)化場(chǎng)景。只有在事后,團(tuán)隊(duì)才能看到這是他們無(wú)意中所做的事情帶來(lái)的價(jià)值。簡(jiǎn)單地說(shuō),我們開(kāi)始將工作分解為一小批最終用戶(hù)價(jià)值。 四、研究我們的開(kāi)發(fā)模式 我們開(kāi)始意識(shí)到 UI 自動(dòng)化測(cè)試并沒(méi)有真正帶給我們想要的回報(bào)。正因?yàn)槿绱?,我們開(kāi)始研究開(kāi)發(fā)過(guò)程中的其他領(lǐng)域,看看是否可以做出些許改進(jìn)。但作為一個(gè)團(tuán)隊(duì),我們的問(wèn)題之一是,我們太過(guò)接近流程,以至于無(wú)法客觀地看到哪些是有效的,哪些是無(wú)效的。為了克服這個(gè)問(wèn)題,我們請(qǐng)來(lái)了一位敏捷教練來(lái)幫助我們的團(tuán)隊(duì)。事實(shí)上,我們引入了兩位教練:一個(gè)是幫助團(tuán)隊(duì)理解他們正在使用的流程,另一個(gè)是幫助我們更好地理解我們實(shí)際上是如何構(gòu)建我們的系統(tǒng)的。 敏捷教練都來(lái)自于團(tuán)隊(duì)外部,因而他們可以質(zhì)疑我們系統(tǒng)的任一部分,而不用擔(dān)心冒犯任何人。他們會(huì)問(wèn)一些簡(jiǎn)單的問(wèn)題,讓我們了解我們工作方法背后的原因,并將我們從“我們一直都是這樣做的”循環(huán)中解脫出來(lái)。例如,用于管理我們工作的 stand upboard 通常有 backlog、next、dev、wait - For -test、in test and done 等列,但是我們從來(lái)沒(méi)有想過(guò)要問(wèn)為什么我們有 next 和 wait - For -test 列。 我們的教練能夠提供幫助的是:我們?yōu)槭裁匆獙?a href="http://whsywl.com.cn/jingyan/rjkfhrjcs.html" target="_blank" title="軟件開(kāi)發(fā)">軟件開(kāi)發(fā)工作分解成這些小項(xiàng),為什么開(kāi)發(fā)和測(cè)試被視為兩個(gè)不同的活動(dòng)。教練的方法并不是簡(jiǎn)單地改變我們的開(kāi)發(fā)過(guò)程,但他們能幫助我們明白問(wèn)題的根源在哪(未發(fā)布的功能卡放在任務(wù)看板的 next 和 wait-for-test 列),讓團(tuán)隊(duì)看到通過(guò)消除開(kāi)發(fā)和測(cè)試列(next 和 wait-for-test),取而代之的是一個(gè)簡(jiǎn)單的正在進(jìn)行(in-progress)的列,很多工作依然可以順利進(jìn)行。您可以在我的文章 In test colum 中找到更多關(guān)于使用這種方法的好處. 五、我們學(xué)到了什么 我們發(fā)現(xiàn)的最大問(wèn)題是:就敏捷開(kāi)發(fā)實(shí)踐而言,我們的團(tuán)隊(duì)中存在“形式主義”。僅僅因?yàn)槲覀冇?standups(站會(huì)),以小團(tuán)隊(duì)的形式工作,并在 sprint 結(jié)束時(shí)發(fā)布東西,但并不意味著我們實(shí)際上是敏捷的。這只是意味著我們有一些儀式,讓我們看起來(lái)像“敏捷”。事實(shí)證明,并不是每個(gè)人都很清楚我們?yōu)槭裁匆@么做,甚至不清楚我們這樣做的好處是什么。 我們所做的第一件事就是澄清什么是敏捷:它更多的是基于客觀反饋的可持續(xù)軟件交付過(guò)程,而不是試圖盡可能快地發(fā)布你所能發(fā)布的任何東西并期望最好的結(jié)果。我們通過(guò)讀書(shū)俱樂(lè)部促進(jìn)團(tuán)隊(duì)討論來(lái)實(shí)現(xiàn)團(tuán)隊(duì)內(nèi)部對(duì)于“敏捷”一詞達(dá)成一致的理解。這有助于團(tuán)隊(duì)成員更好地掌握敏捷實(shí)踐背后的原則,并在他們的工作中做出更好的決策。 我們還開(kāi)始研究我們實(shí)際上是如何在代碼級(jí)別構(gòu)建系統(tǒng)的,并試圖將開(kāi)發(fā)人員在如何提交代碼、提交的頻率和提交的大小這些內(nèi)容可視化。這并不是試圖讓開(kāi)發(fā)人員難堪,而是幫助他們理解作為一個(gè)團(tuán)隊(duì),他們是如何影響代碼庫(kù)的,并試圖鼓勵(lì)開(kāi)發(fā)人員養(yǎng)成更高效的習(xí)慣;比如對(duì)于較小的、有重點(diǎn)的任務(wù)進(jìn)行提交,而不是在一天結(jié)束時(shí)的一次性提交大量的代碼。如果他們確實(shí)做了大量的提交,那也可以,但是要讓其他開(kāi)發(fā)人員知道他們?yōu)槭裁催@樣做,來(lái)促進(jìn)團(tuán)隊(duì)成員間相互學(xué)習(xí)。 我們對(duì)團(tuán)隊(duì)最大的改變之一是鼓勵(lì)結(jié)對(duì)編程,因此沒(méi)有一個(gè)開(kāi)發(fā)人員單獨(dú)開(kāi)發(fā)一個(gè)特性。這加快了代碼評(píng)審的速度,但他們也不太可能相互推卸責(zé)任。比起在某些項(xiàng)目中僅由資深成員來(lái)審查代碼而言,結(jié)對(duì)編程還有助于更快地提高我們團(tuán)隊(duì)中較年輕成員的技能和知識(shí),使他們能快速地提高生產(chǎn)力。 六、為了擁有更加高效健康的開(kāi)發(fā)模式,我的一些建議 在團(tuán)隊(duì)工作中,需要在這個(gè)團(tuán)隊(duì)中確定一個(gè)高效、健康的開(kāi)發(fā)流程。一個(gè)行之有效的方法是建立一個(gè)團(tuán)隊(duì)視頻俱樂(lè)部。這允許成員從日?;顒?dòng)中抽出一些時(shí)間來(lái)學(xué)習(xí)構(gòu)建軟件的新工具或新方法。在每次會(huì)議結(jié)束時(shí),團(tuán)隊(duì)討論都由會(huì)議負(fù)責(zé)人(項(xiàng)目經(jīng)理、技術(shù)負(fù)責(zé)人或?qū)⑾敕◣Ыo團(tuán)隊(duì)的人)推動(dòng),來(lái)探索如何使用這些概念來(lái)幫助團(tuán)隊(duì)嘗試新事物。 然后選擇一個(gè)概念,并對(duì)結(jié)果應(yīng)該是什么有一個(gè)清晰的想法。我們以更好的單元測(cè)試為例,單元測(cè)試對(duì)團(tuán)隊(duì)意味著什么?更好的單元測(cè)試會(huì)給團(tuán)隊(duì)帶來(lái)什么?一旦你有了這些答案,你就可以想出多種方法來(lái)達(dá)到這個(gè)目的,這樣你就可以選擇一個(gè)可以讓你快速而客觀地見(jiàn)證結(jié)果的方法。 你需要弄清楚,你所使用的新過(guò)程或新技術(shù)是否真的幫助你在規(guī)定的時(shí)間內(nèi)實(shí)現(xiàn)了你的目標(biāo)。如果是這樣,那就太好了。如果沒(méi)有,你需要停止嗎?做更多調(diào)整嗎?您還需要決定誰(shuí)將實(shí)際進(jìn)行這一嘗試,以及他們將如何與團(tuán)隊(duì)的其他成員進(jìn)行溝通。 記住,如果你想讓任何新流程或想法在團(tuán)隊(duì)中站穩(wěn)腳跟,那么團(tuán)隊(duì)中每個(gè)人都需要參與其中;否則,遇到的第一個(gè)困難就是,這個(gè)想法將停止或緩慢執(zhí)行,因?yàn)橹挥袇⑴c嘗試的人才能從中有所收獲。 |
分享本篇文章給更多人:
2020-05-27
2020-02-24
2020-05-27
2020-05-27
請(qǐng)發(fā)表評(píng)論