姜 文,劉立康
(西安電子科技大學(xué) 通信工程學(xué)院,陜西 西安 710071)
隨著軟件開發(fā)技術(shù)的發(fā)展,敏捷開發(fā)[1-8]的理論和方法在軟件行業(yè)獲得廣泛運用。敏捷開發(fā)包括的方法比較多,主要包括Scrum方法、Crystal方法、極限編程(extreme programming,XP)、自適應(yīng)軟件開發(fā)、功能驅(qū)動軟件開發(fā)等。雖然它們在特定的活動和工作方面有所差異,但是它們都采用迭代和增量開發(fā)(iterative and incremental development,IID)模式,通常簡稱為“迭代開發(fā)”。IID是所有敏捷方法的核心。
依據(jù)軟件迭代開發(fā)實踐,歸納總結(jié)出一種新的迭代開發(fā)模式,其主要特點是迭代開發(fā)與迭代測試同時進行,詳細敘述了迭代開發(fā)的模式和工作流程;敘述了迭代開發(fā)的具體實施,并且給出了一個軟件迭代開發(fā)案例。
迭代開發(fā)[9-10],也被稱作迭代增量式開發(fā)或迭代進化式開發(fā),軟件迭代開發(fā)過程中,整個軟件項目根據(jù)開發(fā)計劃被分解為多個迭代周期(一般2至4周),每一次迭代都由需求分析、設(shè)計、編碼實現(xiàn)和測試在內(nèi)的多個活動組成,每輪迭代結(jié)束后都會生成一個穩(wěn)定的、經(jīng)過驗證的軟件版本。
迭代測試[11-16]根據(jù)每一輪迭代開發(fā)包含的特性數(shù)量,確定待測試的用例數(shù)量,將整個測試工作分割成一系列小型測試任務(wù),并根據(jù)測試用例的數(shù)量與難度來安排測試工程師參與迭代測試工作。
迭代開發(fā)和測試的優(yōu)點如下:
(1)每一輪迭代都為下一輪迭代提供開發(fā)基線,軟件開發(fā)建立在穩(wěn)定的質(zhì)量基礎(chǔ)之上;
(2)有助于早期發(fā)現(xiàn)各種技術(shù)問題,及時靈活應(yīng)對各種技術(shù)變更;
(3)有助于增強各類人員之間的交流、溝通,減少在開發(fā)和測試工作中的理解偏差;
(4)有利于合理安排工作任務(wù),確保軟件版本計劃按時順利完成。
軟件迭代開發(fā)過程中涉及四類人員,如圖1所示,包括軟件管理、軟件開發(fā)、軟件測試和其他相關(guān)人員;各類人員各司其職,共同完成軟件迭代開發(fā)工作。
圖1 軟件迭代開發(fā)角色分類
2.1.1 軟件版本經(jīng)理
軟件版本經(jīng)理是軟件項目的負責(zé)人,負責(zé)軟件開發(fā)的技術(shù)管理和人員組織安排。
(1)負責(zé)主持制定軟件項目開發(fā)計劃,召開軟件版本開工會,確保軟件迭代開發(fā)、迭代測試以及軟件產(chǎn)品資料開發(fā)按計劃順利開展工作;
(2)任命軟件開發(fā)組負責(zé)人、測試組負責(zé)人,調(diào)配軟件開發(fā)工程師和軟件測試工程師;
(3)及時了解迭代開發(fā)和測試工作進度,確保軟件版本計劃順利進行;
(4)了解每個人的工作情況,表彰相關(guān)人員,激勵大家的工作熱情;
(5)每輪迭代結(jié)束后,組織相關(guān)人員進行項目驗收和評審工作。
2.1.2 配置管理工程師
配置管理工程師負責(zé)軟件成品、半成品、代碼、腳本和技術(shù)文檔的管理工作。
(1)管理各種文檔資料:軟件產(chǎn)品的各種技術(shù)性資料;
(2)管理軟件代碼:軟件產(chǎn)品代碼和測試用例自動化腳本代碼;
(3)軟件產(chǎn)品版本管理:保存軟件產(chǎn)品開發(fā)過程中的所有版本,需要時可以回溯查詢;
(4)版本庫中目錄和文件的讀、寫、瀏覽的權(quán)限管理:給相關(guān)人員分配權(quán)限;
(5)開發(fā)基線管理:確定軟件開發(fā)基線,軟件開發(fā)基線的更新;
(6)開發(fā)過程中的變更管理:主要包括需求變更、計劃變更、設(shè)計變更以及工程變更,每次變更都需要經(jīng)過嚴格的評審程序。
2.2.1 軟件系統(tǒng)工程師
系統(tǒng)工程師(SE)負責(zé)完成軟件需求設(shè)計、架構(gòu)設(shè)計和詳細設(shè)計,將設(shè)計場景文檔轉(zhuǎn)換為開發(fā)任務(wù),參與處理軟件開發(fā)過程中遇到的各種問題。
2.2.2 軟件開發(fā)工程師
軟件開發(fā)工程師負責(zé)編寫代碼、源代碼調(diào)試,自驗之后,將源代碼合入版本庫;處理問題單,修改代碼。
2.3.1 軟件測試架構(gòu)師
測試架構(gòu)師(TSE)負責(zé)編寫軟件產(chǎn)品測試策略;細化與分析軟件測試點,編寫軟件測試用例;參與處理軟件測試過程中遇到的各種問題。
2.3.2 軟件測試工程師
軟件測試工程師根據(jù)設(shè)計場景文檔、測試策略和測試用例編寫自動化測試腳本。搭建測試環(huán)境,進行軟件測試。對檢測到的軟件缺陷提交問題單,跟蹤問題單處理的全過程。
2.3.3 持續(xù)集成工程師
持續(xù)集成工程師在軟件迭代開發(fā)期間,每天從版本庫下載最新代碼,定時完成持續(xù)集成工作。在工作中發(fā)現(xiàn)的問題,及時反饋給軟件開發(fā)工程師處理。
2.3.4 自動化工廠測試工程師
自動化工廠測試工程師在迭代開發(fā)期間和持續(xù)集成工程師共同完成冒煙測試任務(wù)。
2.4.1 質(zhì)量工程師
在迭代開發(fā)過程中,質(zhì)量工程師全程監(jiān)控軟件開發(fā)和測試的工作流程,監(jiān)控和審核迭代過程中各項度量數(shù)據(jù)是否達標。迭代開發(fā)完成之后,參與迭代開發(fā)與測試工作的質(zhì)量評審。
2.4.2 資料工程師
資料工程師根據(jù)系統(tǒng)工程師提供的設(shè)計場景文檔,編寫產(chǎn)品文檔。
依據(jù)軟件迭代開發(fā)實踐,歸納總結(jié)出一種新的迭代開發(fā)模式。其主要特點是迭代開發(fā)與迭代測試同時進行。這樣處理的優(yōu)點包括:
(1)適應(yīng)當(dāng)前軟件開發(fā)與測試分為兩個不同組的組織形式;
(2)有利于人員的調(diào)度安排,充分發(fā)揮軟件開發(fā)工程師和軟件測試工程師各自的優(yōu)勢;
(3)軟件編碼和測試用例腳本編寫同時進行,提高測試效率,縮短開發(fā)周期;
(4)軟件開發(fā)工程師在編寫代碼和修改代碼時,可以使用測試用例自動化腳本測試自己編寫的代碼,促進開展測試驅(qū)動開發(fā)工作。
新的迭代開發(fā)模式和流程如圖2所示。
圖2 迭代開發(fā)模式和流程
3.1.1 迭代規(guī)劃
SE根據(jù)軟件產(chǎn)品需求規(guī)格文檔確定產(chǎn)品Backlog(需求清單),按照用戶需求和模塊之間的關(guān)聯(lián)程度劃分迭代個數(shù)。確定迭代Backlog(任務(wù)清單),分配每個迭代需要完成的任務(wù)清單(迭代開發(fā)中,一個任務(wù)相當(dāng)于一個功能點,一個小的需求)。迭代Backlog是團隊在一輪迭代中的任務(wù)清單,是團隊的詳細迭代開發(fā)計劃TSE根據(jù)軟件產(chǎn)品需求規(guī)格文檔和產(chǎn)品Backlog(需求清單)編寫測試策略,確定產(chǎn)品測試需求清單;分配每個迭代需要完成的測試任務(wù)清單,編寫測試用例。
3.1.2 迭代任務(wù)會議
迭代啟動前,SE組織軟件開發(fā)工程師詳細討論本輪迭代開發(fā)計劃,澄清需求、對完成標準達成一致;確定迭代任務(wù)的優(yōu)先級,細化工作計劃和分配迭代開發(fā)任務(wù)。
TSE組織軟件測試工程師討論本輪迭代測試計劃,分配測試任務(wù);確定測試用例自動化腳本開發(fā)的優(yōu)先級。
3.1.3 每日晨會
每日晨會通常需要15分鐘左右。SE與軟件開發(fā)工程師開會,了解項目的進度,及時解決實際工作時遇見的問題。TSE召集軟件測試工程師開會,了解工作進度,及時處理遇到的各種問題。
3.1.4 迭代回顧會議
迭代回顧會議在每輪迭代結(jié)束后舉行,相互交流、總結(jié)經(jīng)驗和教訓(xùn),討論開發(fā)與測試工作存在的各種問題,將其中未完成的任務(wù)轉(zhuǎn)移到下個迭代中。
3.1.5 系統(tǒng)測試
最后一輪迭代工作完成之后,需要對軟件進行系統(tǒng)測試。自動化工廠測試工程師連跑測試用例自動化腳本對軟件進行冒煙測試(預(yù)測試),然后軟件測試工程師對軟件進行全面系統(tǒng)測試。之后軟件進入產(chǎn)品驗收與交付階段。
迭代周期內(nèi),編碼、持續(xù)集成和測試三者的關(guān)系如圖3所示。
圖3 編碼、持續(xù)集成和測試三者的關(guān)系
3.2.1 編 碼
軟件開發(fā)工程師主要負責(zé)迭代開發(fā)過程中的編碼工作。
(1)每天登陸版本庫,根據(jù)版本庫提供的新基線更新工作副本;
(2)檢出需要的文件開始工作,編寫代碼,對編寫好的代碼進行單元測試,靜態(tài)走碼檢查,沖突處理和本地構(gòu)建工作??梢圆捎密浖y試工程師編寫的測試用例自動化腳本測試自己編寫的代碼,最后將評審過的代碼提交到版本庫;
(3)處理持續(xù)集成和測試中發(fā)現(xiàn)的各種問題,定位問題原因,修改軟件代碼,提交版本庫。
3.2.2 持續(xù)集成
持續(xù)集成工程師搭建的集成構(gòu)建工程,通過制定定時任務(wù)來自動完成從版本庫更新代碼,開展持續(xù)集成工作。集成構(gòu)建工程包括靜態(tài)檢查、集成構(gòu)建(編譯、出包)、冒煙測試三項任務(wù)。
(1)靜態(tài)檢查:調(diào)用靜態(tài)測試工具分析檢查代碼,靜態(tài)測試工具對代碼進行語法掃描,找出不符合編碼規(guī)范的地方;同時檢查多個文件,檢查當(dāng)前文件的同時還會檢查所有與之相關(guān)的文件。
(2)集成構(gòu)建:對從版本庫下載的代碼進行編譯、鏈接,生成新的版本包。通常集成構(gòu)建失敗屬于相當(dāng)嚴重的錯誤,需要及時定位處理。
(3)冒煙測試:冒煙測試是對軟件新的版本包基本功能進行測試驗證,自動化工廠的測試工程師負責(zé)完成集成構(gòu)建工程中的冒煙測試任務(wù)。
(4)為軟件測試工程師提供測試版本包。
3.2.3 測 試
軟件測試工程師根據(jù)TSE安排的任務(wù)開展工作:
(1)按照優(yōu)先級順序編寫測試用例自動化腳本;
(2)搭建測試環(huán)境,安裝部署測試版本包,開展測試工作;
(3)對于測試中出現(xiàn)的問題提交問題單,與軟件開發(fā)工程師共同定位處理,跟蹤問題單處理的全過程;
(4)為自動化工廠提供測試用例自動化腳本。
SE和TSE完成迭代規(guī)劃之后,開始迭代開發(fā)和測試的具體實施。
4.1.1 開發(fā)串講
版本經(jīng)理公布軟件產(chǎn)品版本計劃后,系統(tǒng)工程師根據(jù)需求規(guī)格文檔,完成軟件產(chǎn)品的概要設(shè)計和詳細模塊設(shè)計,輸出設(shè)計場景文檔;召集軟件開發(fā)工程師進行產(chǎn)品特性串講,對軟件開發(fā)工程師進行產(chǎn)品業(yè)務(wù)培訓(xùn);介紹軟件產(chǎn)品需求背景、軟件產(chǎn)品架構(gòu)、業(yè)務(wù)流程、模塊功能、各模塊之間的調(diào)用關(guān)系和接口。
4.1.2 開發(fā)澄清
開發(fā)串講之后,進行開發(fā)澄清討論,其特點在于雙向交流。開發(fā)澄清的主體是軟件開發(fā)工程師,系統(tǒng)工程師、測試架構(gòu)師與測試工程師也參加澄清討論。軟件開發(fā)工程師按設(shè)計場景和業(yè)務(wù)流程講解自己負責(zé)的軟件模塊功能特性、輸入和輸出處理;針對需求提出問題,保證對需求的理解一致。SE在澄清過程中,就一些關(guān)鍵點(容易遺漏、犯錯的地方)提問,確認開發(fā)工程師與系統(tǒng)工程師的理解一致。在開發(fā)澄清討論中,如果發(fā)現(xiàn)對軟件特性的理解,有不確定的地方由系統(tǒng)工程師進行確認;如果發(fā)現(xiàn)系統(tǒng)工程師給出的設(shè)計場景文檔中有不一致或遺漏的地方,需要系統(tǒng)工程師申請CCB(change control board)裁決,軟件開發(fā)工程師根據(jù)CCB裁決的結(jié)論來進行特性開發(fā)。
4.1.3 迭代開發(fā)
迭代開發(fā)的具體過程如下:
(1)通過迭代任務(wù)會議,系統(tǒng)工程師給軟件開發(fā)工程師分配開發(fā)任務(wù),進一步澄清需求,討論和處理解決相關(guān)的技術(shù)問題;
(2)通過每日晨會,系統(tǒng)工程師了解軟件開發(fā)工程師的工作進展情況,并討論處理工作中遇到的各種問題;
(3)軟件開發(fā)工程師負責(zé)軟件產(chǎn)品的編碼工作,同時與系統(tǒng)工程師共同處理持續(xù)集成工程師與軟件測試工程師提交的問題單,定位問題產(chǎn)生的原因,修改軟件代碼。
4.1.4 迭代回顧
每輪迭代結(jié)束后系統(tǒng)工程師召集軟件開發(fā)工程師,舉行回顧會議,總結(jié)經(jīng)驗和提出改進點,最后形成迭代回顧紀要。
4.2.1 用例串講
測試架構(gòu)師把測試策略與測試用例等技術(shù)文檔,提供給軟件測試工程師,讓軟件測試工程師熟悉軟件特性;測試架構(gòu)師給軟件測試工程師分析測試策略中的測試點,進行測試用例講解。進行用例串講時,通常軟件開發(fā)工程師也參與,確認測試用例設(shè)計無理解錯誤和遺漏點。用例串講之后,軟件測試工程師對測試用例存在的問題與測試架構(gòu)師、開發(fā)工程師進行澄清討論。
4.2.2 測試反串講
測試工程師根據(jù)對測試用例的理解,對分配給自己的測試任務(wù),編寫軟件特性測試點分析文檔;文檔需要測試架構(gòu)師與相關(guān)的軟件開發(fā)工程師進行評審。評審?fù)ㄟ^后,測試工程師對測試場景用例進行反串講,通過這種方式確認測試工程師能夠正確理解測試用例。測試架構(gòu)師與軟件開發(fā)工程師參與測試反串講。
4.2.3 迭代測試
迭代測試具體過程如下:
(1)通過迭代任務(wù)會議,測試架構(gòu)師給軟件測試工程師分配測試任務(wù),并討論和處理解決相關(guān)的技術(shù)問題。
(2)通過每日晨會,測試架構(gòu)師了解軟件測試工程師的工作進展情況,并討論處理工作中遇到的各種問題。
(3)測試工程師編寫測試用例自動化腳本。
(4)測試工程師搭建測試環(huán)境,安裝測試版本包,開始測試工作。
(5)對于自動化測試,測試工程師通過自動化腳本進行測試,測試完成之后,參于測試任務(wù)的測試工程師進行腳本交叉檢視,并根據(jù)檢視意見修改各自編寫的腳本;測試架構(gòu)師檢視所有執(zhí)行測試的自動化腳本,測試工程師根據(jù)測試架構(gòu)師的檢視意見修改腳本;之后將腳本合入版本庫。
(6)對于不能編寫自動化測試腳本的測試用例,測試工程師手動執(zhí)行測試用例,測試的過程中將相關(guān)的數(shù)據(jù)保存下來,由測試架構(gòu)師評審測試過程。
4.2.4 問題單處理
測試過程中,測試工程師將發(fā)現(xiàn)的軟件缺陷,提交問題單到缺陷管理系統(tǒng)中。問題單走到對應(yīng)的軟件開發(fā)工程師名下,軟件開發(fā)工程師處理問題單,修改后的代碼重新合入版本庫,驗證通過之后問題單走到回歸狀態(tài)。根據(jù)問題單所示的內(nèi)容啟動回歸測試,如果回歸測試的結(jié)果和預(yù)期結(jié)果一致,表明問題單回歸測試通過,可以關(guān)閉問題單,完成問題單處理流程。
4.2.5 迭代回顧
迭代測試完成之后,測試架構(gòu)師組織軟件測試工程師召開測試迭代回顧會議。會議主要關(guān)注每個測試場景的缺陷密度(即問題單數(shù)/代碼量),每個場景需要補充的測試點,本輪測試執(zhí)行過程中需要改進的地方。最后形成迭代回顧紀要。
每次迭代結(jié)束時需要對本輪迭代工作進行驗收和質(zhì)量評估。
4.3.1 迭代驗收
迭代結(jié)束之后,系統(tǒng)工程師與測試架構(gòu)師組織軟件開發(fā)工程師和軟件測試工程師進行迭代SE驗收,SE驗收過程中,測試工程師講解各測試場景典型用例的測試過程,演示腳本的運行過程與運行結(jié)果。可以由系統(tǒng)工程師給出驗收用例,測試工程師進行驗收測試,將驗收用例的測試結(jié)果反饋給系統(tǒng)工程師。驗收結(jié)束之后,由系統(tǒng)工程師和測試架構(gòu)師總結(jié)驗收結(jié)果,提交迭代驗收紀要。
4.3.2 迭代質(zhì)量評估
迭代質(zhì)量評估由版本經(jīng)理、系統(tǒng)工程師、測試架構(gòu)師、開發(fā)組組長、測試組組長以及質(zhì)量工程師參與,屬于軟件版本層面的迭代過程的總結(jié)。主要根據(jù)迭代測試過程中缺陷問題級別和數(shù)量的分析結(jié)果、各測試場景中需要補充的測試點,進行軟件版本質(zhì)量評估。重點是分析與安排下一步如何改進與提升軟件產(chǎn)品質(zhì)量。
文中提到的迭代開發(fā)與測試方法,在公司軟件產(chǎn)品開發(fā)中應(yīng)用多年。在大型軟件的開發(fā)與測試過程中廣泛應(yīng)用,取得了良好的效果。采用該迭代開發(fā)模式,提高了軟件開發(fā)與測試的效率和質(zhì)量,也為后期軟件維護工作打下良好的基礎(chǔ)。
工作實踐表明,開發(fā)串講、測試串講、開發(fā)澄清以及測試反串講使軟件開發(fā)工程師和測試工程師能夠快速理解軟件特性,減少對于軟件特性的理解偏差。迭代回顧可以及時總結(jié)在上一輪迭代過程中需要改進的地方,為后續(xù)的工作提供改進的方向。
下面給出了一個通信軟件產(chǎn)品迭代開發(fā)與測試的案例。
K產(chǎn)品接受客戶局點W的需求,開發(fā)產(chǎn)品的一個新特性,新特性的迭代開發(fā)和測試時間將近2個月。根據(jù)版本經(jīng)理制定的迭代計劃,整個迭代過程分為3輪迭代,具體的安排如表1所示。
在2個月的迭代開發(fā)測試過程中,軟件開發(fā)工程師總共完成了3萬行的代碼開發(fā);軟件測試工程師共提交問題單39張;測試用例總數(shù)521個,編寫測試用例自動化腳本487個,編寫測試套8個;整個迭代過程中測試用例執(zhí)行率達到了100%,測試自動化率為93.47%。
K產(chǎn)品在原有軟件功能上增加新特性,在新特性開發(fā)過程中處理了大量的技術(shù)問題。下面介紹一個具有代表性的問題。
在軟件開發(fā)初期,開發(fā)工程師將軟件代碼合入版本庫之后,持續(xù)集成生成版本包;執(zhí)行冒煙測試,驗證新版本包的基本功能時出現(xiàn)5個測試用例自動化腳本執(zhí)行失敗。測試工程師初步分析之后確認不是自動化測試腳本的問題,開發(fā)工程師分析之后發(fā)現(xiàn)是由于對原有功能的代碼進行修改引入的缺陷。測試工程師提交問題單;開發(fā)工程師修改代碼,重新將代碼合入版本庫,對代碼執(zhí)行回歸測試,修復(fù)了該缺陷。
軟件迭代開發(fā)的理論和方法在軟件項目開發(fā)中獲得廣泛應(yīng)用,尤其是對于開發(fā)大型復(fù)雜軟件系統(tǒng)具有重要價值。長期的工作實踐表明,采用迭代開發(fā)模式,可以加強軟件開發(fā)工程師和軟件測試工程師之間的交流和溝通,靈活應(yīng)對軟件開發(fā)過程中的各種技術(shù)變更,從而降低軟件產(chǎn)品開發(fā)風(fēng)險。迭代開發(fā)模式有利于軟件開發(fā)計劃的管理和實施,使軟件開發(fā)進度和質(zhì)量得到有效的控制。