軟體界的初學者一旦完成所有模組的單元測試之後,可能會問乙個似乎很合理的問題:如果每個模組都能單獨工作得很好,那麼為什麼要懷疑將它們放在一起時的工作情況呢?當然,這個問題涉及「將它們放在一起」的介面連線。資料可能在穿過介面時丟失;乙個模組可能對另乙個模組產生負面影響;子功能聯合在一起並不能達到預期的功能;單個模組中可以接受的不精確性在連線起來之後可能會擴大到無法接受的程度;全域性資料結構可能產生問題。遺憾的是,問題還遠不止這些。
整合測試是構建軟體體系結構的系統化技術,同時也是進行一些旨在發現與介面相關的錯誤的測試。其目標是利用已通過單元測試的構件建立設計中描述的程式結構。
常常存在一種非增量整合的傾向,即利用「一步到位」的方式來構造程式。所有的構件都事先連線在一起,全部程式作為乙個整體進行測試。結果往往是一片混亂!會出現一大堆錯誤。由於在整個程式的廣闊區域中分離出錯的原因是非常複雜的,因此改正錯誤也會比較困難。
增量整合與「一步到位」的整合方法相反。程式以小增量的方式逐步進行構建和測試,這樣錯誤易於分離和糾正,更易於對介面進行徹底測試,而且可以運用系統化的測試方法。下面將討論一些不同的增量整合策略。
自頂向下整合測試是一種構建軟體體系結構的增量方法。模組的整合順序為從主控模組(主程式)開始,沿著控制層次逐步向下,以深度優先或廣度優先的方式將從屬於(和間接從屬於)主控模組的模組整合到結構中去。
參見下圖,深度優先整合是首先整合位於程式結構中主控路徑上的所有構件。主控路徑的選擇有一點武斷,也可以根據特定應用的特徵進行選擇。例如,選擇最左邊的路徑,首先整合構件m1、m2和 m5。其次,整合m8或m6(若m的正常執行是必需的),然後整合中間和右邊控制路徑上的構件。廣度優先整合首先沿著水平方向,將屬於同一層的構件整合起來。如圖所示,首先將構件m2、m3和m4。整合起來,其次是下乙個控制層m5、m6,依此類推。整合過程可以通過下列5個步驟完成:
1.主控模組用作測試驅動模組,用直接從屬於主控模組的所有模組代替樁模組。
2.依靠所選擇的整合方法(深度優先或廣度優先),每次用實際模組替換-個從屬樁模組。
3.整合每個模組後都進行測試。
4.在完成每個測試集之後,用實際模組替換另乙個樁模組。
5.可以執行回歸測試以確保沒有引入新的錯誤。回到第2步繼續執行此過程,直到完成了整個程式結構的構建。
自頂向下整合策略是在測試過程的早期驗證主要控制點或決策點。在能夠很好分解的程式結構中,決策發生在層次結構的較高層,因此會首先遇到。如果主控問題確實存在,盡早地發現是有必要的。若選擇了深度優先整合方法,可以實現和展示軟體的某個完整功能。較早的功能展示可以增強所有開發者、投資者及使用者的信心。
自底向上整合測試,顧名思義,就是從原子模組(程式結構的最底層構件)開始進行構建和測試。由於構件是自底向上整合的,在處理時所需要的從屬於給定層次的模組總是存在的,因此,沒有必要使用樁模組。自底向上整合策略可以利用以下步驟來實現:
1.連線低層構件以構成完成特定子功能的簇(有時稱為構造)。
2.編寫驅動模組(測試的控制程式)以協調測試用例的輸入和輸出。
3.測試簇。
4.去掉驅動程式,沿著程式結構向上逐步連線簇。
遵循這種模式的整合如圖所示。連線相應的構件形成族1、簇2和簇3,利用驅動模組(圖中的虛線框)對每個簇進行測試。橙1和簇2中的構件從屬於模組ma,去掉驅動模組d1和 d2,將這兩個簇直接與ma。相連。與之相類似,在簇3與mb連線之前去掉驅動模組d3。最後將ma和mb與構件mc。連線在一起,依此類推。
隨著整合的向上進行,對單獨的測試驅動模組的需求減少。事實上,若程式結構的最上兩層是自頂向下整合的,則驅動模組的數量可以大大減少,而且簇的整合得到了明顯簡化。
每當加入乙個新模組作為整合測試的一部分時,軟體發生變更,建立了新的資料流路徑,可能出現新的io,還可能呼叫新的控制邏輯。這些變更所帶來的***可能會使原來可以正常工作的功能產生問題。在整合測試策略的環境下,回歸測試是重新執行已測試過的某些子集,以確保變更沒有傳播不期望的***。回歸測試有助於保證變更(由於測試或其他原因)不引入無意識行為或額外的錯誤。
回歸測試可以手工進行,方法是重新執行所有測試用例的子集,或者利用捕捉/回放工具自動進行。捕捉/回放工具使軟體工程師能夠為後續的回放與比較捕捉測試用例和測試結果。回歸測試套件(將要執行的測試子集)包含以下三種測試用例:
能夠測試軟體所有功能的具有代表性的測試樣本。
額外測試,側重於可能會受變更影響的軟體功能。
側重於已發生變更的軟體構件測試。
隨著整合測試的進行,回歸測試的數量可能變得相當龐大,因此,應將回歸測試套件設計成只包括涉及每個主要程式功能的乙個或多個錯誤類的測試。
開發軟體產品時,冒煙測試是一種常用的整合測試方法,是時間關鍵專案的決定性機制,允許軟體團隊頻繁地對專案進行評估。大體上,冒煙測試方法包括下列活動。
1.將已經轉換為**的軟體構件整合到構造( build)中。乙個構造包括所有的資料檔案、庫、可復用的模組以及實現乙個或多個產品功能所需的工程化構件。
2.設計一系列測試以暴露影響構造正確地完成其功能的錯誤。其目的是發現極有可能造成專案延遲的業務阻塞(show stopper)錯誤。
3.每天將該構造與其他構造及整個軟體產品(以其當前的形式)整合起來進行冒煙測試。這種整合方法可以是自頂向下的,也可以自底向上的。
每天頻繁的測試讓管理者和專業人員都能夠對整合測試的進展做出實際的評估。mcconnell是這樣描述冒煙測試的:
冒煙測試應該對整個系統進行徹底的測試。它不一定是窮舉的,但應能暴露主要問題。冒煙測試應該足夠徹底,以使得若構造通過測試,則可以假定它足夠穩定以致能經受更徹底的測試。
當應用於複雜的、時間關鍵的軟體工程專案時,冒煙測試提供了下列好處:
降低了整合風險。冒煙測試是每天進行的,能較早地發現不相容性和業務阻塞錯誤,從而降低了因發現錯誤而對專案進度造成嚴重影響的可能性。
提高最終產品的質量。由於這種方法是面向構建(整合)的,因此,冒煙方法既有可能發現功能性錯誤,也有可能發現體繫結構和構件級設計錯誤。若較早地改正了這些錯誤,產品的質量就會更好。
簡化錯誤的診斷和修正。與所有的整合測試方法一樣,冒煙測試期間所發現的錯誤可能與新的軟體增量有關,也就是說,新發現的錯誤可能來自剛加入到構造中的軟體。
易於評估進展狀況。隨著時間的推移,更多的軟體被整合,也更多地展示出軟體的工作狀況。這就提高了團隊的士氣,並使管理者對專案進展有較好的把握。
軟體整合的總體計畫和特定的測試描述應該在測試規格說明中文件化。這項工作產品包含測試計畫和測試規程,並成為軟體配置的一部分。測試可以分為若干個階段和處理軟體特定功能及行為特徵的若干個構造來實施。例如,safehome安全系統的整合測試可以劃分為以下測試階段:使用者互動,感測器處理,通訊功能及警報處理。
每個整合測試階段都刻畫了軟體內部廣泛的功能類別,而且通常與軟體體系結構中特定的領域相關,因此,對應於每個階段建立了相應的程式構造(模組集)。
整合的進度、附加的開發以及相關問題也在測試計畫中討論。確定每個階段的開始和結束時間,定義單元測試模組的「可用性視窗」。附加軟體(樁模組及驅動模組)的簡要描述側重於可能需要特殊工作的特徵。最後,描述測試環境和資源。特殊的硬體配置、特殊的**器和專門的測試工具或技術也是需要討論的問題。
緊接著需要描述的是實現測試計畫所必需的詳細測試規程。描述整合的順序以及每個整合步驟中對應的測試,其中也包括所有的測試用例(帶注釋以便後續工作參考)和期望的結果列表。
介質簇結構不正確 關注 如何正確選用各種真空閥門
真空閥門主要有真空球閥 真空蝶閥 真空隔膜閥,真空閘閥 真空截止閥,真空閥門種類的不同,適用的場合也不同,下面就閘閥 截止閥 蝶閥 球閥等不同種類的閥門,講敘閥門的特性及常用區域。最後還根據使用要求的不同如何選擇閥門。一 真空閘閥 真空閘閥是作為截止介質使用,在全開時整個流通直通,此時介質執行的壓力...
template 不正確的使用指標堆疊
假設定義了乙個正確的stacktemplate,乙個簡單的堆。三個容易出錯的範例 stackst 版本1 string po 替換為 char po 旨在使用char指標而不是string物件來接受鍵盤的輸入。這種方法失敗的原因是,char指標僅僅是建立了指標 4位元組大小 沒有非配任何用於儲存輸入...
關於求sizeof struct 「不正確」的問題
請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現什麼結果呢?sizeof mystruct 為多少呢?也許你會這樣求 sizeof mystruct sizeof double sizeof char sizeof int 13 但是當在vc中測試上面結構...