翟宏宇,文大化,徐春鳳
(1.長(zhǎng)春理工大學(xué) 計(jì)算機(jī)科學(xué)技術(shù)學(xué)院,長(zhǎng)春 130022;2.中國(guó)科學(xué)院 長(zhǎng)春光學(xué)精密機(jī)械與物理研究所,長(zhǎng)春 130033)
項(xiàng)目開(kāi)發(fā)過(guò)程中,代碼維護(hù)是非常重要的環(huán)節(jié)。一個(gè)項(xiàng)目的開(kāi)發(fā)中需要把每個(gè)人同自己相關(guān)的功能模塊收集起來(lái),如何高效管理和維護(hù)代碼是保證項(xiàng)目順利進(jìn)行的關(guān)鍵。本論文介紹的是采用Clear Case進(jìn)行版本控制來(lái)對(duì)項(xiàng)目的所有源代碼、庫(kù)文件、文檔及發(fā)布(Release)時(shí)的安裝程序的維護(hù)。開(kāi)發(fā)人員需要每天中獲取最新版本(Get Latest Version)的源代碼,進(jìn)行開(kāi)發(fā),然后需要Check in所有當(dāng)天修改的代碼,在Check in之前要保證編譯順利通過(guò)。
開(kāi)發(fā)人員往往專注自己的模塊或者當(dāng)前工作任務(wù)中功能實(shí)現(xiàn)的部分,就會(huì)忽略改動(dòng)對(duì)別的模塊的影響。在實(shí)際工作中,尤其是集成發(fā)版本的時(shí)候,或多或少都有這種問(wèn)題發(fā)生,而且一個(gè)模塊的改動(dòng)對(duì)整個(gè)系統(tǒng)的影響往往超乎人的意料。這樣會(huì)給版本發(fā)布帶來(lái)一系列的難以想象的困難。為了避免這種情況發(fā)生,保證集成版本的有效,本論文將基于Windows Mobile的手機(jī)開(kāi)發(fā)項(xiàng)目介紹一種高效管理和代碼維護(hù)的機(jī)制。
版本控制就是要及時(shí)發(fā)布最新的軟件,每個(gè)版本完成應(yīng)該完成的功能。在開(kāi)發(fā)過(guò)程中,會(huì)不斷發(fā)現(xiàn)新需求,不斷發(fā)現(xiàn)Bug(錯(cuò)誤),確保項(xiàng)目開(kāi)發(fā)的順利完成。隨著軟件系統(tǒng)的日益復(fù)雜化和用戶需求、軟件更新的頻繁化,版本控制及代碼管理逐漸成為軟件生命周期中的重要控制過(guò)程,在軟件開(kāi)發(fā)過(guò)程中扮演著越來(lái)越來(lái)重要的角色[1]。一個(gè)好的版本控制過(guò)程能覆蓋軟件開(kāi)發(fā)和維護(hù)的各個(gè)方面,同時(shí)對(duì)軟件開(kāi)過(guò)程的宏觀管理,即項(xiàng)目管理,也有重要的支持作用。良好的版本控制能使軟件開(kāi)發(fā)過(guò)程有更好的可預(yù)測(cè)性,使軟件系統(tǒng)具有可重復(fù)性。
本項(xiàng)目采用Clear Case的UCM模式來(lái)管理代碼。于是就產(chǎn)生了基于此模式的開(kāi)發(fā)流程,如圖1所示。開(kāi)發(fā)人員在將代碼提交到集成流后,需要做一次集成編譯,然后才能集成測(cè)試,全部都通過(guò)了之后才能提交完成。由于在Windows Mobile平臺(tái)下,驅(qū)動(dòng)的編譯需要幾個(gè)小時(shí),編譯工作將占用大量的機(jī)器資源,極大增加了開(kāi)發(fā)人員的負(fù)擔(dān)。
圖1 Clear Case開(kāi)發(fā)工作流程Fig.1 Clear case deliver work flow
采用快速提交代碼,使用若干服務(wù)器編譯,可以節(jié)省開(kāi)發(fā)人員的時(shí)間和資源。為了提高開(kāi)發(fā)人員工作效率,改進(jìn)了開(kāi)發(fā)人員的提交流程,如圖2。
圖2 改進(jìn)的開(kāi)發(fā)工作流程Fig.2 Improved deliver work flow
兩種方法的主要變化是,開(kāi)發(fā)人員在各自的開(kāi)發(fā)流編譯并測(cè)試成功后 Deliver,并直接 Complete;集成編譯工作移至專用編譯服務(wù)器上去完成,這樣就能為開(kāi)發(fā)人員節(jié)省出兩個(gè)小時(shí)的寶貴時(shí)間。這些改動(dòng)是為了能夠保證這些編譯結(jié)果的質(zhì)量,以及能及時(shí)發(fā)現(xiàn)每個(gè)人提交的代碼不會(huì)發(fā)生功能退化。
對(duì)于項(xiàng)目開(kāi)發(fā)而言,清楚每次變更的位置,變更的目的以及對(duì)其他模塊的影響,對(duì)項(xiàng)目的后續(xù)開(kāi)發(fā)以及Bug的查找都能夠得到快速的幫助,能夠提高項(xiàng)目的開(kāi)發(fā)進(jìn)度。
代碼變更審查能夠清楚知道每次變更的位置,體現(xiàn)在哪些代碼發(fā)生變更,哪些模塊發(fā)生變更和變更的目的,以及評(píng)估每次變更潛在影響[2]。體現(xiàn)在變更對(duì)整個(gè)系統(tǒng)的影響,對(duì)其它模塊的影響。此部分的主要工作是對(duì)每一次的代碼提交都與提交前的版本進(jìn)行一次比較和審查,清楚變更模塊的位置和目的。
代碼變更審查主要是保證每次新提交的集成流都是健全的,保證無(wú)編譯錯(cuò)誤,無(wú)功能回退。并在第一時(shí)間內(nèi)發(fā)現(xiàn)并定位問(wèn)題。這就需要每日構(gòu)建(DailyBuild)實(shí)時(shí)檢測(cè)程序流,一旦有新代碼提交,就會(huì)自動(dòng)更新集成流,并開(kāi)始編譯,而后進(jìn)行編譯驗(yàn)證測(cè)試(BVT)。
Daily Build就是把一個(gè)軟件項(xiàng)目的所有的最新的代碼從配置庫(kù)中取出,然后從頭進(jìn)行編譯,鏈接和運(yùn)行。可以再運(yùn)行測(cè)試包對(duì)軟件的主要功能進(jìn)行測(cè)試,發(fā)現(xiàn)并報(bào)告錯(cuò)誤的整個(gè)過(guò)程。通常由工具自動(dòng)完成[3]。Daily Build一般是在每天半夜進(jìn)行,前提是提交了更新的代碼到配置庫(kù)中。Daily Build也可稱Nightly Build。Daily Build是一個(gè)很好的機(jī)制,它可以節(jié)省大量的時(shí)間,而有能實(shí)時(shí)的檢測(cè)到代碼更新后出現(xiàn)的問(wèn)題[3,4]。Daily Build 的另一個(gè)重要功能就是驗(yàn)證軟件中各模塊關(guān)系是否正確,也可稱為“每日集成”。
DailyBuild的實(shí)現(xiàn)是利用項(xiàng)目組開(kāi)發(fā)的軟件Daybreak完成[8],對(duì)進(jìn)行中的項(xiàng)目進(jìn)行監(jiān)控,如果發(fā)現(xiàn)服務(wù)器上共享的項(xiàng)目文件有所改動(dòng),便會(huì)再次編譯,得到軟件的最新版本,并且生成測(cè)試并發(fā)Email給相關(guān)的開(kāi)發(fā)人員。
Daybreak是一套完整的從下載最新代碼,構(gòu)建,測(cè)試與一體的軟件,它實(shí)時(shí)檢測(cè)程序流,一旦有新代碼提交,就會(huì)自動(dòng)更新集成流,并開(kāi)始編譯,生成手機(jī)的 Image.raw,而后進(jìn)行 BVT 測(cè)試。
Daybreakd的主界面中設(shè)置編譯路徑和生成的日志保存存放的路徑,并設(shè)置好Build的時(shí)間,一般都是選擇在半夜進(jìn)行,這樣可以不影響開(kāi)發(fā)進(jìn)度,并在第二天及時(shí)的發(fā)現(xiàn)錯(cuò)誤。在Buid模塊主要是設(shè)定編譯的參數(shù),然后開(kāi)始編譯,如同3所示:
圖3 Build界面Fig.3 The form of build
在Download模塊完成的功能是首先將電腦和手機(jī)的通信連接上,然后將build之后生成的image.raw下載到手機(jī)中,如圖4所示:
圖4 Download界面Fig.4 The form of download
接下來(lái)進(jìn)入Test模塊中,Test模塊是保證代碼要通過(guò)WINCE的BVT測(cè)試。
BVT主要是針對(duì)WinCE驅(qū)動(dòng)開(kāi)發(fā)的測(cè)試。在開(kāi)發(fā)時(shí)程中,一個(gè)模塊的改動(dòng)有時(shí)會(huì)對(duì)別的模塊產(chǎn)生影響。尤其是集成發(fā)版本的時(shí)候,或多或少都有這種問(wèn)題發(fā)生,而且一個(gè)模塊的改動(dòng)對(duì)整個(gè)系統(tǒng)的影響往往超乎人的意料[6]。這樣會(huì)給版本發(fā)布帶來(lái)一系列的難以想象的困難。為了避免這種情況發(fā)生,保證集成版本的有效,在提交流程中,設(shè)置了BVT這一環(huán)節(jié)。
BVT 是編譯驗(yàn)證測(cè)試(Build Verify Test),就是針對(duì)每一個(gè)版本的改動(dòng)后功能的驗(yàn)證。是一種簡(jiǎn)單、快速、確保改動(dòng)沒(méi)有造成基本功能退化的測(cè)試。它的作用有如下面的代碼:
}通過(guò)BVT把問(wèn)題攔截在了問(wèn)題最可能發(fā)生的部分。
BVT是CETK(WinCE Test Kits)諸多測(cè)試用例的子集,選取CETK中基本驅(qū)動(dòng)測(cè)試:LCD,Keypad,IR,OAL,Camera中時(shí)間比較短,單機(jī)可自動(dòng)跑的測(cè)試。BVT測(cè)試是一項(xiàng)針對(duì)Driver基本功能的測(cè)試。在驅(qū)動(dòng)開(kāi)發(fā)和系統(tǒng)集版本發(fā)布時(shí),它是一個(gè)方便驗(yàn)證功能的工具。目前選擇了15個(gè)CETK的測(cè)試用例,可以根據(jù)具體的情況,增減測(cè)試用例。測(cè)試項(xiàng)如圖5所示:
圖5 Test模塊中的BVT測(cè)試項(xiàng)Fig.5 The BVT in test model
當(dāng)在Daybreak中建立了某個(gè) PPC或 SP的項(xiàng)目后,選中要測(cè)試項(xiàng),手機(jī)連接上 ActiveSync,點(diǎn)擊“Start”按鈕,手機(jī)端就會(huì)進(jìn)行相應(yīng)的測(cè)試。在界面的下方的信息窗口中會(huì)顯示正在測(cè)試的項(xiàng)。測(cè)試結(jié)束后,自動(dòng)彈出測(cè)試結(jié)果的Excel表格,表格中顯示通過(guò)和失敗的測(cè)試項(xiàng)??梢愿鶕?jù)這個(gè)結(jié)果來(lái)確定是否存在功能回退的問(wèn)題。也可是使用SP_CETK(適用于單機(jī)+存儲(chǔ)卡)首先將測(cè)試所需的DLL都拷貝到TFlash卡中,然后進(jìn)行BVT測(cè)試。通過(guò)了BVT,還有一些性能測(cè)試、兼容性測(cè)試、災(zāi)難測(cè)試等需要在產(chǎn)品發(fā)布前進(jìn)行[7]。
本文介紹了在ClearCase下的版本控制管理和DailyBulid的代碼維護(hù)機(jī)制。通過(guò)Daybreak軟件的自動(dòng)執(zhí)行來(lái)完成DailyBulid,同時(shí)采用快速提交代碼,使用若干服務(wù)器編譯,大大節(jié)省了開(kāi)發(fā)人員的時(shí)間和資源。通過(guò)DailyBulid和BVT保證代碼的健壯性,使得代碼維護(hù)變得簡(jiǎn)單而且輕松的定位錯(cuò)誤,提高了整個(gè)項(xiàng)目開(kāi)發(fā)的效率,使得項(xiàng)目能夠平穩(wěn)的向前推進(jìn)。此機(jī)制已在項(xiàng)目中使用,效果顯著。Daybreak還需要不斷的完善,例如支持多平臺(tái)等,不斷的探索中讓其更好的發(fā)揮作用。
[1]Harold Kerzner.項(xiàng)目管理計(jì)劃、進(jìn)度和控制的系統(tǒng)方法[M].電子工業(yè)出版社,2010.
[2]Robert K.Wysocki.有效的項(xiàng)目管理:面向傳統(tǒng)、敏捷、極限項(xiàng)目(第5版)[M].電子工業(yè)出版社,2011.
[3]陳能技.軟件測(cè)試技術(shù)大全:測(cè)試基礎(chǔ) 流行工具 項(xiàng)目實(shí)戰(zhàn)(第二版)[M].人民郵電出版社,2011.
[4]Aditya R Mathurl.軟件測(cè)試基礎(chǔ)教程[M].機(jī)械工業(yè)出版社,2011.
[5]Steve McConnel.CODE COMPLETE,Second Edition[M].電子工業(yè)出版社,2006.
[6]傅曦,齊宇,徐駿.Windows Mobile手機(jī)應(yīng)用開(kāi)發(fā)[M].人民郵電出版社,2005.
[7]單錦輝,姜瑛,孫萍.軟件測(cè)試研究進(jìn)展[J].北京大學(xué)學(xué)報(bào):自然科學(xué)版,2005,41(1):28-31.
[8]王雅文,宮云戰(zhàn),楊朝紅.軟件測(cè)試工具綜述[J].北京化工大學(xué)學(xué)報(bào):自然科學(xué)版,2007,34(1):1-3.
[9]http://www.eefocus.com/article/11-08/93270131348-9228_2.html?sort=1111_1122_1461_0.