對于大型產品開發,一次可能開發多個新的業務系統,同時一個業務系統本身又包含多個業務模塊和組件。只要我們在前期產品規劃中存在子系統和模塊的分解,那么后續就一定存在產品集成的動作。在架構設計中我們通過進行組件分解,識別和定義組件間接口,一方面是通過分而治之降低大系統復雜度,另外一方面則是通過分解和接口定義后各模塊可以并行開發。只要架構階段存在分解動作,那么最終在各模塊開發完成后一定存在集成動作。架構做出一個假設,只要在分解的時候各組件模塊按預定的接口契約進行實現,那么后續各個組件一定可以進行集成和組裝形成一個完整的產品。所以架構不能僅僅只關心解耦,還必須關心集成和裝配,解耦后的東西無法集成,那么分解過程仍然是失敗的。
產品集成和持續集成的關系
產品集成強調是的是把左右的組件最終能夠組裝和集成起來,形成一個完整的系統。而大師Martin Fowler對持續集成是這樣定義的:持續集成是一種軟件開發實踐,即團隊開發成員經常集成它們的工作,通常每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發布,自動化測試)來驗證,從而盡快地發現集成錯誤。許多團隊發現這個過程可以大大減少集成的問題,讓團隊能夠更快的開發內聚的軟件??梢姵掷m集成只能算做產品集成的一個子實踐。
要明白持續集成只是產品集成的一種方式,不論是開發過程是瀑布模式,增量模式還是迭代模式,都可以采用持續集成的思路。要明白持續集成的一個核心是將整個開發過程透明化,同時將集成工作提前化。盡可能早的暴露問題和風險,同時糾正在前期系統分析和架構設計中的不足。
對于持續集成我們往往會強調每日構建,冒煙測試,自動化測試等內容。強調開發,測試和生產環境的部署流水線作業。但是要明白對于大型產品集成仍然回包括模塊內測試和集成,模塊間測試和集成,跨系統間的測試和集成工作。對于單個模塊內可以采用每日構建和持續集成策略,但是對于模塊間和跨系統我們可以采取分迭代式的集成方式進行集成。
關于持續集成的核心邏輯
在這里要分兩個層面來談,首先是單環境,涉及到自動化構建,部署,測試一系列動作。具體過程可以簡化描述如下。首先是編寫好自動化編譯腳本代碼,如使用ant工具完成;然后設置定時作業和任務,開發人員按時check in相關代碼。使用CI持續集成工具根據定時任務點在構建環境自動獲取最新代碼,自動運行ant自動化編譯腳本對代碼進行編譯,編譯完成后自動化部署到某個環境。部署完成后運行單元測試自動化腳本對代碼進行自動化測試,輸出自動化測試結果和報告;如果通過的話測試人員通過QTP進行進一步自動化測試或手工執行一遍冒煙測試腳本,完成本次持續集成。在持續集成模式下,一方面是可以盡可能早的發現問題,一方面對測試人員隨時都可以有一個可進行詳細功能性測試的可用環境。
其次如果對于多環境,涉及到開發環境測試通過后自動部署集成測試環境,集成測試環境測試通過后自動部署到驗收環境等一系列動作。對此我們叫部署流水線模式,實現跨環境的持續集成管理。
對于持續集成,由于組件間可能存在編譯依賴,我們需要分析組件間的依賴關系,以順利的完成整改編譯過程。而在產品集成過程中我們考慮的不是編譯依賴而是本身組件間的功能依賴,因此我們需要進一步詳細的考慮組件間的集成順序和集成策略問題。
產品集成順序的分析
產品集成順序分為兩種模式,一種是自頂向下的模式進行集成,一種是自底向上的方式進行集成。對于自頂向下方式的集成,首先集成最外層或流程最末端的業務模塊,業務模塊前置依賴用模擬器(樁)實現。然后繼續在每一層按寬度或深度優先,用完全實現模塊代替模擬器,并建立下層。以這種方式繼續直到所有被測系統中的樁已經實現和測試。在這種模式下可以看到整個集成過程完全是頂層需求驅動進行,集成工作可以較早的開始進行,如果產品集成圖是正金字塔結構較容易,模擬器開發較少;反之同理。
對于自底向上集成,首先集成最底層的業務模塊,只在底層模塊未實現前使用模擬器(樁)。然后繼續在實現并測試對上一級模塊,這些構件使用已經測試的下級模塊。整個系統使用根一級模塊測試。對于這種模式模擬器開發較少,同時上次各模塊基本可以開始并行測試。這種集成方式最大的風險是如果上次需求變化可能直接影響到最底層。
產品集成的集成場景分析
集成場景分析目的是為后續的集成測試用例設計提供依據,集成測試用例要覆蓋所有場景。對于場景分析輸入主要包括跨模塊協同業務流程圖,系統需求規格說明書,概要設計說明書等。對于集成場景分析可以從靜態和動態兩個層面進行分析,對于靜態分析主要分析模塊依賴關系,分析某一個服務接口影響到的業務模塊具體功能點,可以模塊-》模塊的矩陣分析方法進行。對于動態分析主要是根據跨系統或模塊流程入手,分析跨模塊的流程協同,流程協同中所涉及到的所有接口服務。
集成場景的分析將為集成測試用例的設計提供核心輸入,要明白,集成測試不是簡單的接口測試,接口反映的是跨系統或模塊的交互流程,需要通過交互流程的貫通來檢驗接口本身的正確性。