經(jīng)常聽到開發(fā)人員抱怨 ,“這么爛的代碼尉姨,我來重構(gòu)一下!”吗冤,“這代碼怎么能這么寫呢又厉?誰來重構(gòu)一下九府?”,“這兒有個壞味道覆致,重構(gòu)吧侄旬!”
作為一名 QA,每次聽到“重構(gòu)”兩個字煌妈,既想給追求卓越代碼的開發(fā)人員點(diǎn)個贊儡羔,同時又會感覺非常緊張,為什么又要重構(gòu)璧诵?馬上就要上線了汰蜘,怎么還要改?是不是應(yīng)該阻止開發(fā)人員做重構(gòu)之宿?
重構(gòu)幾乎是開發(fā)人員最喜歡的一項(xiàng)實(shí)踐了族操,可 QA 們卻充滿了顧慮,那么為什么 QA 不喜歡重構(gòu)呢比被?
老功能被破壞
不止一次遇到這樣的場景色难,某一天一個老功能突然被破壞了,QA 們感到奇怪等缀,產(chǎn)品這塊兒的功能已經(jīng)很穩(wěn)定了枷莉,也沒有在這部分開發(fā)什么新功能,為什么突然出問題了呢尺迂?
追查下去發(fā)現(xiàn)是近期做了重構(gòu)笤妙。再追問下去,對于老代碼枪狂,已經(jīng)幾乎看不懂老的測試了危喉,可是開發(fā)人員看到代碼的壞味道就想重構(gòu),于是功能破壞了州疾。
在快速迭代的開發(fā)模式下辜限,QA 們主要關(guān)注用戶故事的生命周期,重點(diǎn)測試新的特性功能严蓖,所以對于老功能回歸測試的投入是非常有限的薄嫡,如果開發(fā)人員突然對老功能進(jìn)行了重構(gòu)又沒有告知團(tuán)隊(duì), 這樣的問題很可能就會進(jìn)入生產(chǎn)環(huán)境颗胡,這樣是非常有風(fēng)險的毫深。即便很多開發(fā)人員重構(gòu)老功能時會告知 QA,以提前發(fā)現(xiàn)和修復(fù)導(dǎo)致的問題毒姨,但無疑會大大增加 QA 做回歸測試的負(fù)擔(dān)哑蔫。
新功能推遲/重復(fù)測試
按照用戶故事的開發(fā)流程,開發(fā)人員完成功能后,多方角色會首先在開發(fā)人員的機(jī)器上進(jìn)行用戶故事的快速驗(yàn)收以及探索性測試闸迷,然后開發(fā)人員會提交代碼嵌纲,由 QA 拿到包之后部署到測試環(huán)境進(jìn)行測試。
但有的時候 QA 在開發(fā)機(jī)器上快速驗(yàn)收之后腥沽,開發(fā)人員又進(jìn)行重構(gòu)逮走,曾經(jīng)經(jīng)歷過“故事驗(yàn)收的時候功能都是正常的,拿到包部署之后好多功能不工作了”的事情今阳,跟開發(fā)人員確認(rèn)师溅,又是重構(gòu)導(dǎo)致的。
有時候開發(fā)人員會在用戶故事驗(yàn)收之后告知 QA 還會繼續(xù)重構(gòu)盾舌,QA 可以等到重構(gòu)完成后再拿新的版本做測試墓臭,這樣就會導(dǎo)致用戶故事的測試時間推遲】篌荩或者開發(fā)人員會先重構(gòu)再做驗(yàn)收起便,而這樣又會導(dǎo)致 QA 在開發(fā)機(jī)器上進(jìn)行重復(fù)的驗(yàn)收測試。
無計(jì)劃不可見
開發(fā)人員的重構(gòu)時機(jī)對我們來說是無規(guī)律的窖维。有的時候一邊開發(fā)用戶故事一邊重構(gòu)榆综,有的時候會在故事完成后、QA 在開發(fā)機(jī)器上驗(yàn)證結(jié)束后才做重構(gòu)铸史,有的是代碼評審后大家指出問題后做重構(gòu)鼻疮,有的甚至得等到項(xiàng)目組來了有經(jīng)驗(yàn)的開發(fā)人員才開始重構(gòu)。對 QA 來說琳轿,重構(gòu)的時機(jī)是無計(jì)劃的判沟。
另外重構(gòu)也是不可見的。我們總談可視化崭篡,日常的開發(fā)工作由用戶故事和缺陷來可視化挪哄,而重構(gòu)經(jīng)常是幕后進(jìn)行的,不被跟蹤琉闪、不被記錄迹炼、不可見,有經(jīng)驗(yàn)的開發(fā)人員會在進(jìn)行“大”的重構(gòu)之前口頭告知團(tuán)隊(duì)颠毙,如果沒有告知斯入,就在不知不覺中發(fā)生了,只有功能被破壞了才能意識到蛀蜜。
總結(jié)
以上列出了 QA 不喜歡重構(gòu)的三個理由刻两,歸根結(jié)底其實(shí)都是重構(gòu)不當(dāng)導(dǎo)致的。代碼重構(gòu)(Code refactoring)指對軟件代碼做任何更動以增加可讀性或者簡化結(jié)構(gòu)而不影響輸出結(jié)果滴某。而不當(dāng)?shù)闹貥?gòu)往往只關(guān)注了前半部分卻忽略了對輸出結(jié)果的影響磅摹。
個人認(rèn)為滋迈,如果能夠注意以下幾個方面,也許可以很大程度減少 QA 對重構(gòu)的顧慮:
充足的自動化測試是保障輸出結(jié)果的一個有效途徑偏瓤。不管對于歷史代碼還是新代碼杀怠,進(jìn)行重構(gòu)的前提應(yīng)該是確保這部分功能已經(jīng)被足夠的自動化測試覆蓋, 有的開發(fā)人員認(rèn)為這是一個不可行的建議厅克,因?yàn)椤俺渥恪睂τ诿總€人每個角色的標(biāo)準(zhǔn)可能是不一樣的,QA 也許永遠(yuǎn)都不會覺得測試足夠橙依,但是其實(shí)可以借助測試覆蓋率等度量工具证舟,甚至直接針對功能特性由 QA 來定義需要哪些自動化測試,在補(bǔ)齊這些自動化測試的基礎(chǔ)上再做重構(gòu)窗骑。
對于新功能的重構(gòu)女责,應(yīng)該融入到正常開發(fā)過程中,在故事驗(yàn)收之前已經(jīng)完成相應(yīng)的重構(gòu)创译,因?yàn)樽詣踊瘻y試不是萬能的抵知,也不可能達(dá)到 100% 的覆蓋率,所以還是需要 QA 驗(yàn)證的软族。這么做就意味著客戶要為我們的重構(gòu)買單刷喜,所以作為軟件領(lǐng)域?qū)<业奈覀儯绾巫寴I(yè)務(wù)領(lǐng)域?qū)<业目蛻衾斫庵貥?gòu)的價值立砸,這就變的至關(guān)重要了掖疮。
小步前進(jìn),盡量避免或者減少大的重構(gòu)颗祝,這樣可以減少突然增多的回歸測試工作量浊闪,也會減少功能被破壞的風(fēng)險。如果發(fā)生了大的重構(gòu)螺戳,反思一下是哪里出了問題搁宾?是我們積攢了太多的技術(shù)債?還是業(yè)務(wù)領(lǐng)域模型發(fā)生了大的改變倔幼?然后采取措施避免類似的事情再度發(fā)生盖腿。
對于一些核心功能或者組件,進(jìn)行重構(gòu)之前盡早告知團(tuán)隊(duì) QA凤藏,如果能夠給 QA 講解一下重構(gòu)的目的以及本次重構(gòu)可能會影響到的業(yè)務(wù)區(qū)域會對 QA 有很大的幫助奸忽。這樣做一方面可以讓 QA 把重心放在最容易受到影響的功能上加強(qiáng)回歸測試,另一方面也能幫助 QA 更合理地安排測試計(jì)劃揖庄。
盡量避免在產(chǎn)品上線前進(jìn)行重構(gòu)栗菜,不僅可以減輕 QA 回歸測試的負(fù)擔(dān),也會降低功能破壞后來不及修復(fù)的風(fēng)險。
重構(gòu)的目標(biāo)是為了改善代碼質(zhì)量港粱,長遠(yuǎn)來看應(yīng)該是可以減少軟件缺陷的,從這個角度來說 QA 和開發(fā)人員的目標(biāo)是一致的截歉,我們相信而咆,如果重構(gòu)恰當(dāng)霍比,必定對項(xiàng)目是有利無害的。