完美的軟件是不存在的,每個程序都有潛在的故障點。軟件測試是軟件開發生命周期的一個階段,在此期間團隊會發現程序或系統中不需要的錯誤。不同的測試方法有助于查明幾種類型的軟件錯誤。了解每個軟件測試模型的工作原理對于構建、部署和維護高質量的測試策略和軟件至關重要。
為什么測試在 SDLC 中很重要?
測試階段是軟件開發生命周期中的關鍵階段。它發生在軟件實施之后,測試旨在發現和修復軟件錯誤。軟件測試至關重要,因為產品在測試后會投入生產。每個軟件開發團隊都必須交付高質量的軟件,原因有二:
- 最終用戶受益于根據要求和規格制造的高質量產品。
- 開發團隊的完整性和新項目的可能性取決于軟件的質量。
軟件測試團隊與開發人員分開對不同的問題進行各種檢查。這種方法有助于讓團隊專注于發現問題并允許實施持續開發。
軟件測試方法論
軟件測試是由測試團隊執行的正式過程,用于幫助確認程序在邏輯上正確且有價值。測試需要使用特定的測試程序并創建測試用例。
軟件測試分兩個階段進行:
- 驗證——系統構建是否正確?
- 驗證——系統是否按照用戶要求構建?
軟件測試使用多種方法和模型來回答這兩個問題。
黑盒測試
在黑盒測試方法中,程序是一個封閉的(黑)盒,細節未知。測試人員唯一可見的組件是程序輸入和輸出。測試人員可以通過觀察各種輸入的結果輸出來確定程序是否正常運行。黑盒測試不考慮程序的規范或代碼,只考慮不同測試用例的預期行為。黑盒測試人員不必非常熟練,因為他們不與任何代碼交互。黑盒測試既有優點也有缺點。黑盒測試的關鍵優勢是不需要使用代碼和編程邏輯。然而,?測試所有輸入組合是不可能的。三種類型的測試基于黑盒測試方法:功能測試、非功能測試和回歸測試。
功能測試
功能測試檢查軟件是否執行特定功能,而不考慮系統中的哪個組件負責操作。測試團隊檢查功能的好壞輸入。一個示例函數是用戶登錄頁面行為。功能測試檢查用戶是否可以使用正確的憑據登錄或不能使用不正確的憑據登錄。
隨著軟件復雜性的增加,軟件中的功能數量也在增加。測試功能的順序對于有效的功能測試策略至關重要。由于功能通常是嵌套的,因此軟件的行為取決于人們在使用軟件時所采取的步驟順序。
功能測試的主要好處是測試團隊可以在所有軟件組件完成之前檢查各個功能。在功能測試中檢測到錯誤的可能性非常高,因為它從用戶的角度顯示了使用軟件時的問題。
非功能測試
非功能測試方法除了功能和特性之外,還驗證軟件方面。這種測試方法側重于程序如何在特定條件下執行某些操作。非功能測試有助于從用戶的角度發現程序是否可用。該方法檢查可用性問題,例如跨不同設備、瀏覽器或操作系統的交叉兼容性。
回歸測試
回歸測試是一種軟件測試方法,可確保所有新代碼更改不會導致先前測試的組件出現問題并對系統穩定性產生負面影響。測試方法重復先前迭代的測試,確保最新的更改不會對現有代碼造成不良影響。
在任何導致原始代碼更改的程序操作之后,回歸測試都是必要的,例如:
- 落實新要求。
- 向程序添加新功能。
- 刪除現有功能。
- 修復任何缺陷。
- 優化以獲得更好的性能。
如果軟件經常更改,最好的方法是使用自動化測試工具并為多次迭代和回歸測試周期創建可重用測試。
白盒測試
白盒測試方法與黑盒測試相反。在這種方法中,程序是一個打開的(白色)盒子,測試人員知道其內部工作原理。
白盒測試分析源代碼并需要以下技能:
- 編碼和腳本知識。
- 熟悉所使用的特定編程語言。
- 特定組件的設計。
測試人員根據程序的結構制定計劃。例如,白盒測試可以包括創建腳本測試,這些測試遍歷整個代碼并運行每個功能。具體測試可以檢查是否存在死循環或者代碼不運行的情況。白盒測試的主要缺點是測試迭代次數,隨著應用程序變得更復雜,迭代次數會增加。該方法需要創建一種策略,其中遞歸或循環對精心選擇的代表性值執行次數更少。三種類型的測試基于白盒測試方法:語句測試、路徑測試和分支測試。
語句測試
語句測試是白盒測試中的一種測試技術。該方法至少評估一次代碼中的所有可執行語句。例如,如果代碼塊包含多個條件語句,則語句測試技術涉及遍歷所有輸入迭代以確保代碼的所有部分都執行。
語句測試技術發現未使用的代碼部分、缺少引用的語句以及以前修訂的剩余代碼。因此,語句測試有助于清理現有代碼并減少冗余代碼或添加缺失的組件。
路徑測試
路徑測試在整個代碼中創建獨立的線性路徑。測試團隊創建代碼的控制流程圖,這有助于設計單元測試以評估所有代碼路徑。分析不同的路徑有助于發現應用程序的低效、中斷或冗余流。
分支測試
分支測試映射代碼中的條件語句并標識單元測試的分支。分支類型有:
- 有條件的:當條件滿足時執行。
- Unconditional:不管任何情況都執行。
例如,以下代碼包含多個嵌套語句:
如果條件 1: W 否則如果條件 2: X 是 別的: Z
測試人員識別所有條件分支。在示例代碼中,條件分支是W,?X, 和Z因為語句只在特定條件下運行。另一方面,Y是一個無條件分支,因為它總是在X語句之??后執行。分支測試旨在執行盡可能多的分支并測試所有分支條件。
功能測試
功能測試是黑盒測試的一種子類型,它考慮給定功能或程序的軟件規范。該測試方法在不考慮內部軟件結構的情況下提供各種輸入并分析輸出。功能測試包括 4 個不同的步驟,這些步驟從代碼的更多次要部分開始,然后擴展到評估整個系統。該模型旨在分析組件或程序的合規性,并檢查系統是否按照規范執行它應該執行的操作。
第 1 步:單元測試
單元測試是一種軟件測試方法,可驗證源代碼的各個部分。單元測試有助于確定特定模塊(單元)的功能,并且該過程隔離各個部分以確定它們是否正常運行。
單元是一個單獨的函數、過程或面向對象的編程類。通常,單元測試有助于驗證前端接口。
單元測試的主要好處是在開發生命周期中盡早發現問題。在測試驅動的開發中,例如 Scrum 或極限編程,測試人員在任何代碼存在之前創建單元測試。
應用單元測試的主要缺點是需要評估程序中的復雜執行路徑。單元測試是本地化的并且不兼容,無法發現集成或系統范圍的錯誤。
第二步:集成測試
集成測試是單元測試之后的一個階段。該方法將先前評估的單個程序單元(模塊)組合成更大的組,并對聚合體進行測試。
有幾種不同的集成測試方法:
- 自下而上的策略首先評估和集成低級組件,然后再轉向更復雜的組。
- 自上而下的方法使用逆向工程來評估來自更復雜組的組件并將它們簡化為更小的單元。
- 三明治(混合)測試通過同時測試低級和高級組件來結合自下而上和自上而下的策略。
- 大爆炸測試將所有組件組合成一個大單元進行測試。與其他測試方法相比,該方法沒有增量方法。
集成測試驗證前端接口和應用程序后端之間的連接。
第三步:系統測試
系統測試對完全集成的系統進行測試。該步驟分析行為并將它們與預期要求(質量保證)進行比較,從而驗證完全集成的軟件。
系統測試旨在發現集成和單元測試遺漏的問題,并全面概述軟件是否已準備好發布。系統測試中的不同測試方法考慮了軟件在各種環境中的工作情況以及軟件的可用性。
系統測試的主要挑戰是設計一種適合可用時間和資源限制的策略,同時在集成后提供對整個系統的全面分析。
第 4 步:驗收測試
功能測試的最后一部分是驗收測試。該測試方法旨在評估應用程序最終用戶的認可度。該方法讓最終用戶參與測試過程,并收集用戶對任何潛在可用性問題或任何先前測試階段遺漏錯誤的反饋。
驗收測試屬于以下兩個類別之一:
- 用戶驗收測試允許目標用戶通過 Beta 測試或類似策略來評估和使用軟件。用戶群決定了軟件是否按預期運行。
- 操作驗收測試檢查軟件是否正常運行并按預期運行。該測試檢查各種軟件組件,例如安全性、備份和災難恢復以及故障轉移測試。
驗收測試后,如果結果滿足驗收標準,則軟件可以投入生產。否則,如果測試未通過閾值,軟件將被推回到之前的開發和測試階段。
非功能測試
非功能測試從用戶的角度對軟件進行評估,著重于用戶體驗。測試方法旨在發現與軟件功能無關但對用戶體驗至關重要的任何問題。
非功能測試考慮以下參數:
- 安全
- 可靠性
- 可擴展性
- 可用性
- 可用性
非功能測試的重點是產品如何運行,而不是它在特定用例中的行為方式。這種測試模型是通過性能測試、安全測試、可用性測試和兼容性測試來進行的。
性能測試
性能測試檢查軟件的速度、可擴展性和穩定性。存在幾種不同的性能測試子類型,例如:
- 負載測試檢查軟件在常規用戶需求下的功能。
- 壓力測試檢查軟件在高用戶負載或其他復雜情況下的行為。
- 尖峰測試檢查軟件在突然的高用戶負載尖峰下的行為。
- 耐久性測試顯示應用程序在較長時間內的穩定性。
所有性能測試都旨在發現并修復會降低用戶體驗的低延遲和性能問題。
安全測試
安全測試檢查軟件中的任何安全問題,是最關鍵的軟件測試方法之一。該方法檢查系統內的任何漏洞和網絡攻擊的可能性。滲透測試和漏洞掃描等方法有助于發現和降低軟件內部的安全風險,還有許多滲透測試工具可以使測試過程自動化。
可用性測試
可用性測試評估軟件對用戶的用戶友好性和便利性。這些測試突出了未受指導的用戶在程序或應用程序中做某事的速度有多快。可用性測試結果表明新用戶可以多快學會使用該軟件,以及是否有必要對界面進行改進。
兼容性測試
兼容性測試顯示系統在各種環境中以及與其他軟件的行為。該方法側重于與現有解決方案和技術的集成。
軟件測試模型
軟件開發生命周期中的測試階段并不是唯一可以識別和修復錯誤的地方。所有開發階段都受益于包括軟件測試。持續的軟件開發也需要持續的軟件測試。軟件開發應與測試團隊合作,盡早發現潛在問題或確定無法進行測試的地方。越早發現越好,隨著步驟的推進,發現和修復錯誤的成本會增加。據 IBM 系統科學研究所稱,在維護階段發現和修復缺陷的相對成本要高出大約六倍。
因此,了解測試如何集成到各種軟件開發過程和方法中至關重要。下面是對眾所周知的軟件開發模型以及測試如何集成到每種方法中的概述。
瀑布模型
瀑布模型是一種軟件開發方法,分為順序步驟或階段。團隊只有在完成前一階段后才能進入下一階段。測試團隊在瀑布模型的需求階段開始創建測試計劃和策略。一旦軟件進入實施階段,測試人員將驗證軟件是否正常工作并符合規范。瀑布法在軟件測試中的主要好處是需求定義明確并且在測試階段很容易應用。該模型不適合條件經常變化和意外事件發生的項目。
優點
- 簡單:高度抽象簡化了與最終用戶的溝通過程,最終用戶無需了解技術流程細節即可參與開發過程。
- 易于遵循:項目經理可以訪問項目開發中的關鍵點,這使他們能夠了解開發過程中的進度水平。
- 易于應用:模型經過單次迭代,便于用新軟件替換現有解決方案。
缺點
- 無反饋循環:瀑布模型缺乏反饋機制和多次迭代。在項目開始時定義所有需求是不可能的,并且返回到任何先前的步驟進行更改不是模型中支持的路徑。
- 階段之間沒有明顯的聯系:該模型假設每個先前的開發階段都是后續步驟的輸入。但是,該模型沒有定義需求如何轉化為設計。
- 不專注于解決問題:瀑布模型將軟件設計視為硬件或生產機制。另一方面,軟件設計需要測試和嘗試不同的方法。該模型限制了軟件開發過程中的任何模塊化和創造性過程。
- 有限的最終用戶交互:瀑布模型僅在開發階段的第一步和產品完成的最后階段與用戶進行通信。該方法限制了用戶交互,這使得開發過程效率低下。
V型
V模型是瀑布模型的擴展和改進。該模型分為順序步驟,每個開發階段都有額外的測試步驟。V 模型通過功能測試的所有階段來驗證和驗證軟件。
V 模型的形狀顯示了與開發生命周期階段對應的測試階段。當從左到右查看時,模型展示了隨著時間推移的步驟順序,而從上到下查看則揭示了抽象級別。
優點
- 反饋機制:V 模型對于簡單和復雜的項目都很實用,因為它可以返回到之前的任何一個階段。
- 驗證和驗證:該模型允許檢查項目是否開發良好、是否完全實施并滿足用戶要求。
- 高質量的產品:開發過程組織嚴密,控制嚴密,保證了軟件的質量。
- 早期階段測試:測試團隊參與早期開發階段,從而從一開始就更好地了解項目。該模型顯著節省了開發后期測試的時間和資源。
缺點
- 不靈活:當出現問題時,團隊必須更新所有階段必須適應軟件的變化并進行更新,包括文檔。任何更改都會減慢開發過程。
- 成本高:實施 V 模型需要大量資源來支持眾多開發團隊。該模型更適合大型項目和企業。
敏捷模型
敏捷方法是一種快速迭代的軟件開發方法,它遵循敏捷宣言中定義的原則。它將軟件開發分解為小的增量和多次迭代。敏捷模型允許與最終用戶持續交互,并且需求不斷變化。敏捷模型中的測試發生在每次迭代中。此環境中的軟件測試需要通過自動化測試工具和測試框架對CI/CD 管道進行持續測試。
優點
- 快速開發:部署軟件比其他模型更快。該模型具有適應性和響應變化的能力,從而縮短了周轉時間。
- 更小的迭代:錯誤和缺陷更容易在更小的塊中發現和分析。交付軟件花費的時間更少,并且經常發生新的迭代。
- 高水平的用戶交互:持續的最終用戶反饋確保經常進行驗收測試。因此,產品在每次迭代中都更接近需求。
缺點
- 不可預測:盡管測試團隊收集了用戶反饋,但不能保證下一次迭代將包含這些更改。快節奏創造了不可預測的產品路線圖。
- 成本高:持續發布到生產和開發會導致更高的費用。預測每次更改所需的工作量變得很困難。
- 階段重疊:每次迭代都會經歷所有開發階段。隨著沖刺的進行,區分誰負責哪個任務變得更加棘手。
Scrum模型
Scrum 模型是一種使用敏捷模型原則的項目管理方法。該模型以目標為導向,并在稱為沖刺的迭代中受時間限制。每個沖刺都包含會議、里程碑和由 scrum 主管管理的事件。
Scrum 模型沒有測試團隊,開發人員負責構建和實施單元測試。在每個沖刺中,最終用戶也經常測試該軟件。一些 Scrum 團隊有功能測試員,在這種情況下,測試員必須在 Scrum 會議期間為每個測試會話提供時間估計。
優點
- 快節奏:scrum 模型確保項目交付快速發生,這使其適用于正在開發的快節奏項目。
- 成本效益:每個沖刺由幾個成員組成,快節奏的環境確保項目在指定的時間范圍內完成。
- 高水平的用戶交互:與敏捷模型一樣,scrum 經常發布代碼,從而導致持續的用戶交互。持續的反饋會在每個沖刺中滿足用戶需求。
缺點
- 高失敗率:Scrum 模型需要高水平的互動和承諾。日常會議壓力很大,一個團隊成員的離開會影響整個項目。該軟件在不合規的團隊中失敗的風險更高。
- 缺乏質量:當模型缺少測試團隊時,軟件的質量是不可接受的。由此產生的軟件的等級低于那些經過密集測試的軟件。
開發運營模式
DevOps 模型將持續測試結合到每個開發階段,同時在團隊中也有專門的測試角色。DevOps 管道中的測試目標側重于軟件質量和風險評估。自動化測試和測試驅動開發提高了代碼可靠性,這有助于最大限度地降低新構建破壞現有代碼的可能性。
優點
- 快速軟件交付:DevOps 提高了新功能和錯誤修復的交付速度。對問題的快速響應時間提高了客戶對產品的滿意度。
- 質量軟件:自動化測試和持續部署提高了軟件質量。DevOps 確保在將軟件部署到生產環境之前測試每個更改。
- 錯誤有效:在開發的初始階段集成測試避免了在開發周期的后期解決問題。
缺點
- 難以實施:DevOps 需要將開發與運營相結合,并遵循DevOps 原則,這在擁有復雜系統的大型組織中很難實現。
- 風險增加:DevOps 嚴重依賴自動化,如果配置不當會導致問題。問題一旦發生就很難追蹤。
- 成本過高:該模型需要對基礎架構和DevOps 工具進行大量投資。錯誤配置的系統會帶來難以管理的集成挑戰。
迭代開發
迭代開發根據功能將軟件開發步驟劃分為子系統。該方法是增量的,每個增量都交付一個完整的系統。每一次新的迭代都會改進每個子系統中的現有流程。早期版本提供軟件的原始版本,而隨后的每個版本都會改??進現有功能的質量。測試在早期階段更簡單,并且隨著迭代的進行而增加復雜性。
優點
- 風險控制:迭代開發允許首先從高風險任務開始。開發方法的受控特性可以通過迭代改進任何問題。
- 易于遵循:每次迭代都比上一次有所改進。對于項目經理來說,測量迭代之間的變化變得簡單。
- 早期培訓:由于迭代開發提供了完整軟件的更簡單版本,因此用戶會盡早參與并使用該軟件。用戶反饋基于整個系統,改進在后續迭代中更容易實現。
- 專用版本:版本控制軟件變得簡單,因為開發團隊可以專注于每次迭代的特定改進。例如,一次迭代改進了用戶界面,而下一次迭代改進了軟件的性能。該方法簡化了測試設計過程。
缺點
- 成本高:每次迭代都需要整個軟件開發團隊的參與。
- 缺乏完整的規范:迭代開發方法從簡單的需求開始創建系統。隨著時間的推移,條件也會發生變化。規格的流動性使得項目何時結束變得具有挑戰性。
- 難以管理:迭代開發需要對每次迭代進行密集的項目管理和風險評估。隨著項目的增長,系統的復雜性增加。
螺旋模型
螺旋模型是一種專注于風險評估的敏捷模型。該模型結合了自上而下和自下而上開發方法的優點。該方法使用瀑布模型階段作為越來越復雜的原型。
由于風險分析是每一步的重點,因此螺旋模型可以及早發現故障和漏洞。該模型對問題進行早期評估,從長遠來看,這可以降低安全測試的成本。
優點
- 靈活;螺旋模型可以適應需求的變化,即使是在開發了一個特性之后。報告問題時測試團隊的壓力較小。
- 安全;風險分析存在于開發過程的每一步,迭代方法也有助于管理風險。與其他開發模型相比,螺旋模型更側重于軟件安全。
- 高水平的用戶交互;螺旋模型中的迭代方法允許讓客戶參與開發過程并接收持續的反饋。開發團隊在開發過程中快速做出更改,從長遠來看可以節省成本和資源。
缺點
- 成本高:螺旋模型最適合大型項目和復雜的軟件。
- 專業的風險分析師:該模型依賴于在每個開發步驟中都包含高質量的風險分析師以進行有效的風險評估。
- 復雜:該模型難以遵循,需要在開發的每個步驟中更加關注協議和文檔。
- 時間管理:每個階段的持續時間是未知的。該模型容易超出預算并在時間限制上落后。
RAD模型
RAD(快速應用程序開發)模型是一種將原型制作與迭代開發相結合的敏捷方法。該方法側重于收集用戶需求,而其余的開發過程沒有具體的計劃或步驟。RAD 是一種快節奏的技術,專注于創建可重用的組件,作為后續項目或原型的模板。測試團隊在每次迭代中評估所有原型,并立即將組件集成到最終產品中。
優點
- 靈活:該模型可以快速實現需求變更并適應新的用戶需求。
- 可重用:創建可重用原型提供了一種模板化開發方法,提高了代碼的可重用性,并且從長遠來看需要更少的工作量。
- 快速:開發時間和短迭代支持持續的軟件集成和快速交付。RAD 模型結合了各種自動化工具來加速開發過程。
缺點
- 高專業知識依賴性:基于 RAD 的團隊規模小、技能高、技術強。RAD 模型需要經驗豐富的開發人員團隊來識別和建模用戶需求。
- 僅適用于模塊化系統:并非所有軟件都有明確的組件。RAD 需要創建可重復使用的更小的原型。復雜系統需要專門的功能,這些功能并不適用于所有用例。
極限編程
極限編程 (XP) 是一種敏捷的軟件開發方法,最適合中小型團隊(6-20 名成員)。該技術專注于為用戶提供直接結果的測試驅動開發和短迭代。
XP 沒有供開發團隊遵循的嚴格方法。相反,該方法提供了一個靈活的框架,其中的過程或步驟順序會根據活動而變化。敏捷宣言原則和?結對編程等技術是 XP 中的重要組成部分。
優點
- 專注于軟件開發:團隊創建軟件而不是專注于會議和文檔。工作環境對開發人員來說很舒適,有很多學習和提高技能的機會。
- 開發時間短:缺乏規則和程序使得軟件交付速度很快。快速的結果對客戶有利。
- 測試驅動開發:單元測試存在于編寫代碼之前,程序員在創建軟件之前就知道要測試什么。這種方法會刺激程序員在編碼時采取更好的預防措施。
缺點
- 難以實施:該方法難以實施。XP 需要紀律嚴明的程序員,他們接受并遵循所要求的原則,并能緊密合作。
- 客戶端依賴:客戶端選擇是否參與開發過程。不參與的客戶通常會導致軟件不盡如人意。
結論
高質量的軟件測試是區分高質量軟件和乏善可陳的項目的關鍵。軟件測試的重要性對開發至關重要,這就是為什么有這么多的測試方法和途徑。開發團隊應該遵循軟件測試的趨勢,并準備好從根本上改變他們的方法,以便從新的軟件測試方法和模型中獲利。