軟件測試(英文:軟件 Testing)是根據軟件開發各階段的規格說明和程序的內部結構而設計一批測試用例,并利用這些測試用例來執行程序的過程。軟件測試通過使用人工或自動的手段來運行軟件系統,發現軟件中存在的缺陷,從而保證軟件質量。
軟件測試伴隨著軟件的產生而產生,20世紀50年代,軟件測試主要以調試為主,直到1957年,隨著查爾斯·貝克(Charles Baker)所著圖書《軟件測試發展》的出版,才開始與調試區分開來。隨著軟件技術的發展,軟件的復雜程度越來越高,軟件測試的意義開始被重視,多名學者開始出版專著對軟件測試的定義和目標進行描述。到了20世紀80年代,開發團隊不再只是找出并修復軟件錯誤,而是在現實環境中測試應用程序。20世紀90年代,軟件行業開始迅猛發展,出現了從測試到更全面的質量保證流程的轉變。整個測試的生命周期擴展為由計劃、分析、設計、開發、執行和維護組成,即測試開始貫穿整個軟件的生命周期。21世紀以來,軟件質量的重要性得到了全球的認可,智能測試時代正式開啟。
1983年IEEE將其定義為質量保障的核心活動,主要分為靜態測試(代碼分析)與動態測試(運行檢測),結合黑盒(功能驗證)和白盒(代碼結構分析)技術。按測試過程又可分為單元測試、集成測試、系統測試等。軟件測試的目的不僅是簡單地糾正軟件的錯漏,也是促使項目管理人員及時、準確地了解軟件中潛在的漏洞與風險,從而在明確錯誤的基礎上,采取有效的彌補措施,研究其產生的原因和相應的分布特征。
發展歷程
軟件測試是伴隨著軟件的產生而產生的,20世紀50年代,計算機剛誕生不久,英國計算機科學家艾倫·麥席森·圖靈給出了軟件測試的原始定義。他認為,測試是程序正確性證明的一種極端實驗形式。但相對于軟件開發而言(軟件開發行業的整體成熟度更高,人們對軟件開發的理解也更為全面深入),軟件測試還處于次要位置。軟件測試的含義比較狹隘,開發人員將測試等同于“調試”,主要針對機器語言和匯編語言。直到1957年,隨著查爾斯·貝克(Charles Baker)所著圖書《軟件測試發展》的出版,才開始將其與調試區分開來,這也是軟件測試史上一個重要的里程碑。
直到20世紀70年代,隨著軟件技術的發展,軟件的復雜程度越來越高,軟件測試的意義開始被重視。1972年,在北卡羅來納大學舉行了首屆軟件測試正式會議。1975 年,約翰·顧德那夫(John Good Enough)和蘇珊·格哈特(Susan Gerhart)發表了名為《測試數據選擇的原理》的文章,使軟件測試得到了許多研究者的重視。1979 年,哥倫福德·邁爾斯(Glendford J.Myers)出版了軟件測試領域非常重要的一本專著《軟件測試的藝術》,該書中對軟件測試的定義、目標等進行了描述。
到了20世紀80年代,人們的質量意識越來越高,開發團隊不再只是找出并修復軟件錯誤,而是在現實環境中測試應用程序。1983年,美國國家標準局提出了測試界很有名的兩個名詞:驗證(Verification)和確認(Validation),即V&V理論。1983年IEEE提出的軟件工程術語中給軟件測試下的定義是:“使用人工或自動的手段來運行或測定某個軟件系統的過程,其目的在于檢驗它是否滿足規定的需求或弄清預期結果與實際結果之間的差別”。
20世紀90年代,Bill Hetzel在《軟件測試完全指南》中將其定義為質量度量活動,推動測試轉向系統化質量保障。軟件行業開始迅猛發展,出現了從測試到更全面的質量保證流程的轉變。整個測試的生命周期擴展為由計劃、分析、設計、開發、執行和維護組成,即測試開始貫穿整個軟件的生命周期。同時,軟件規模的劇增映襯人工的測試效率非常低,一些測試工具開始發展,提高了軟件測試的自動化程度。
21世紀以來,軟件質量的重要性得到了全球的認可。全球的標準化組織開始制定軟件質量的標準和最佳實踐。而隨著人工智能和機器學習技術的發展,軟件測試的方法也在不斷進步,敏捷測試開始受到歡迎,它以小增量開發和測試系統,通常在編寫代碼、故事或功能之前開發測試。在軟件測試工具方面,商業化的軟件測試工具,如捕獲/回放工具、Web測試工具、性能測試工具、代碼測試工具等大量涌現。2023年,在2023世界人工智能大會上,出現了一種大模型測試技術,該技術可以更深入、全面的理解軟件功能和性能,從而更準確找出軟件開發中可能存在的問題和錯誤。
測試目的和原則
測試目的
軟件測試的目的在于檢驗被測系統是否滿足規定的要求或弄清預期結果與實際結果之間的差別,通過測試分析錯誤產生的原因和錯誤的發生趨勢,促使項目管理人員及時、準確地了解軟件中潛在的漏洞與風險,從而在明確錯誤的基礎上,采取有效的彌補措施,研究其產生的原因和相應的分布特征。最后證明軟件的功能和性能與需求說明項目。
測試原則
軟件測試一般從用戶和開發者兩個角度來進行,通過測試,能夠為開發者提供修改建議,以便其提供軟件質量,同時為用戶提供合格的軟件產品。測試原則可概括為以下內容:
早期與持續測試
盡早地和不斷地進行測試可以全面的發現缺陷。IBM360操作系統的歷史教訓表明,缺陷修復成本隨著各個階段的靠后而上升,軟件缺陷的積累與放大效應是導致軟件危機的最主要原因。另外,不應該把軟件測試僅僅看作是軟件開發的一個獨立階段,而應當把它貫穿于整個軟件的生命周期中。
不能完全覆蓋
對一個程序進行完全測試就是意味著在測試結束之后,再也不會發現其他的軟件錯誤了, 但這是不可能的。即使是規模很小的軟件或者軟件產品,其邏輯路徑和輸入數據的組合也幾乎是無窮的,測試人員基本不可能實現對測試對象進行完全的檢查和覆蓋。
避免開發者自測
測試工作應該由獨立的軟件測評機構或測試小組來完成,不能由開發人員承擔,這是由于開發者有一定的思維定式,其設計的測試用例偏重于采用正常數據,而進行測試需要異常數據和邊界數據。
設計測試用例
測試用例是指執行條件和預期結果的集合,是針對要測試的內容所確定的一組信息,是為得到最佳的測試效果或高效地揭露隱藏的錯誤而設計的測試數據。
測試用例應涵蓋合法和非合法輸入、邊界條件及特殊狀態,如網絡中斷或電源斷電。測試用例遵循“5C原則”:準確、清晰、簡潔、完整、一致,以揭示隱藏錯誤。
安排測試計劃
在對軟件進行測試之前所做的測試計劃中,應該結合多種針對性強的測試方法,列出所有可使用資源,建立一個明確的測試目標,本著嚴謹、準確的原則做好測試前期的準備工作,避免測試的隨意性。一個合理的測試計劃有助于測試工作順利有序地進行。
測試模型
V模型
V模型體現開發任務和測試任務是相互對等的活動且同等重要的思想,V模型的左右兩側組成英文字母V的兩個邊,左側代表軟件開發過程,右側則描述相應的集成和測試過程,通過不斷組合軟件組件,形成更大的子系統。V模型將測試分成了不同的級別,每個不同的測試級別都有各自主要的測試關注點和不同的測試目的,主要開發活動有用戶需求、需求分析與系統設計、概要設計、詳細設計和編碼,相應的測試級別有單元測試、集成測試、確認測試與系統測試和驗收測試。
W模型
W模型在V模型的基礎上增加了軟件開發各個階段的驗證和確認活動,由兩個V組成,分別代表開發和測試過程,避免將最初的設計錯誤帶入代碼中再進行驗證,造成程序錯誤難以回溯的問題。其強調測試過程伴隨著整個軟件的開發過程,測試的對象不僅是可運行的程序,還包括軟件需求說明、設計以及源代碼等,有利于盡早地全面發現軟件設計過程中的問題。在W模型中,開發、測試活動都保持著一種前后關系,只有上一階段結束,才可以正式開始下一階段的工作。
H模型
H模型將測試準備和測試執行分離,形成一個完全獨立的流程,測試準備包括測試需求分析、測試計劃、測試設計、測試用例和測試驗證等,而測試執行則包括測試運行、測試報告、缺陷分析和回歸測試。當某個測試時間點就緒時,軟件測試就從測試準備階段進入測試執行階段,開展測試執行活動,并且不同的測試活動課按照某個次序先后進行,也可以反復進行。
X模型
X模型強調單元測試和集成測試,是對V模型和W模型的改進,X模型左邊描述的是針對單獨的程序片段進行相互分離的編碼和測試,然后通過頻繁的交接,最終集成為可執行的程序。X模型還定位了探索性測試,這是一種不進行事先計劃的特殊類型的測試,能夠幫助測試人員在測試計劃之外發現更多的軟件錯誤。
測試方法
按測試狀態分類
靜態測試
靜態測試是指不運行被測程序本身,僅通過分析或檢查源程序的語法、結構、過程和接口等來檢查程序的正確性。對需求規格說明書、軟件設計說明書、源程序進行結構分析、流程圖分析、符號執行來找錯。靜態測試包括代碼檢查、靜態結構分析、代碼質量度量等。此類測試的優點在于能夠消耗較短時間、較少資源完成對軟件、軟件代碼的測試,能夠較為明顯地發現此類代碼中出現的錯誤。靜態測試從軟件開發過程的早期開始進行,識別開發早期的缺陷,以助于提高軟件質量。靜態測試方法適用范圍較大,尤其適用于較大型的軟件測試。
動態測試
動態測試是指通過運行被測程序,檢查運行結果與預期結果的差異,并分析運行效率和健壯性等性能,動態測試由三部分組成:構造測試實例、執行程序、分析程序的輸出結果。動態測試是在編碼和開發完成后進行的,目的是驗證軟件在不同場景中的功能和行為,結果包括功能、基礎、系統、性能和可用性測試。
按執行階段分類
白盒測試
白盒測試專注于程序內部邏輯和結構,從開發者視角出發,直接對源代碼進行測試,其核心在于不需基于功能測試,而是通過分析代碼來發現潛在缺陷或錯誤。這種測試方法能深入檢查代碼的每條分支和路徑,確保代碼覆蓋率高,但缺點也比較明顯,如對軟件規格的正確性不進行驗證,而且對測試人員的要求較高。白盒測試的類型包括分支測試、路徑測試和語句測試。
對白盒測試設計測試用例時,依據程序的內部邏輯結構,一般采用邏輯覆蓋法設計測試用例,常用的邏輯覆蓋有:語句覆蓋、判定覆蓋、表達式覆蓋、條件覆蓋、判定條件覆蓋、條件值組合覆蓋、路徑覆蓋。
黑盒測試
黑盒測試側重于被測軟件的功能實現,被測對象的內部結構、運作情況對測試人員是不可見的,測試人員把測試的軟件系統看做一個黑盒子,不需要關心盒子的內部結構和內部特性,而只關注軟件產品的輸入數據和輸出結果,從而檢查軟件產品是否符合它的功能說明。相對于白盒測試而言,黑盒測試的測試數據的生成比較容易,但會造成程序路徑的漏洞,難以發現復雜程序中隱藏的問題。黑盒測試用例的設計方法主要有等價類劃分法、邊界值分析法、決策表法、魚骨圖分析等。
灰盒測試
灰盒測試是一種綜合測試法,介于白盒測試與黑盒測試之間,它不僅關注輸出、輸入的正確性,同時也關注程序內部的情況。灰盒測試以程序的主要功能和主要性能為測試依據,測試方法主要根據程序流程圖、需求說明書以及測試者的實踐經驗來設計測試方法。
按測試過程分類
單元測試
單元測試是對代碼中的最小可測試部分進行檢查的過程,它針對應用程序中的單個組件(通常是函數或方法)進行驗證,以確保其正確性。單元測試的目的是驗證代碼塊是否按照開發人員的預期邏輯執行。在單元測試中,通過提供輸入值并檢查輸出結果的斷言(真或假)來與代碼塊交互。?
集成測試
集成測試是在單元測試的基礎上,將所有的模塊按照設計的要求進行集成,主要驗證組裝后的功能以及模塊之間的接口是否正確安裝的測試工作,主要目的是檢測軟件與概要設計說明說的符合程度。
系統測試
系統測試是將已經通過集成測試的軟件系統,與計算機硬件、外設、數據庫、網絡等其他元素結合在一起,在實際運行環境下,進行的一系列的測試工作,其目的是驗證系統是否滿足了需求規格,找出與需求規格不符或與之矛盾的地方,其通常由獨立的測試團隊來完成。
驗收測試
驗收測試是部署軟件應用之前的最后一個測試操作,分為正式驗收測試(UAT)和非正式驗收測試(α測試和β測試)。
回歸測試
回歸測試主要指軟件在測試或其他活動中發現的缺陷經過修改后重新進行測試,目的是驗證修改后缺陷是否得到了正確的修復,同時需要關注有沒有引入新的缺陷或導致其他代碼產生缺陷或錯誤。
測試策略和技術
功能和非功能性測試
功能性測試用于驗證軟件應用程序的功能,在功能測試性中,每個函數都通過給出值、確定輸出以及用期望值驗證實際輸出來進行測試,它涉及測試軟件的特性和功能,例如輸入/輸出、錯誤處理和用戶界面。
非功能測試用于測試非功能參數,側重于測試軟件的非功能方面,例如軟件的可靠性、負載測試、性能和問責制。非功能測試的主要目的是根據非功能參數測試軟件系統的讀取速度。
性能測試
性能測試是指在一定軟件、硬件及網絡環境下,對系統的各項性能指標來進行測試,主要檢測其特性能否滿足特點的性能需求,常用的性能指標包括并發數、響應時間、每秒處理的事務數、吞吐量、點擊率、訪問量以及硬件資源等。
自動化測試
自動化測試是一種讓計算機代替測試人員進行軟件測試的技術,通過自動化測試工具或其他手段,按照測試工程師的預定計劃進行自動的測試。軟件測試自動化實現的原理和方法主要有:直接進行靜態和動態分析、測試過程的捕獲和回放、測試腳本技術、虛擬用戶技術和測試管理技術等。基本的自動化測試框架有模塊化測試框架、測試庫框架和關鍵字驅動或者表驅動測試框架。
容量測試
容量測試是指檢查當系統運行在大量數據,甚至最大或更多的數據測試環境下,系統是否會出問題,即設定的界限或極限值,容量測試是面向數據的,并且它的目的是顯示系統可以處理目標內確定的數據容量。
破壞性測試
破壞性測試(DT),通過將軟件應用程序置于極端條件下以識別漏洞和弱點。該方法包括各種技術,如輸入模糊測試、故障注入和壓力測試,這些技術被系統地應用于評估軟件在脅迫下的響應方式。通過模擬不利場景,破壞性測試有助于發現和解決漏洞,從而增強軟件應用程序的整體健壯性和安全性。
蛻變測試
蛻變測試(MT),通過驗證程序執行結果是否滿足某一個特定的“關系”來判斷其是否正確,該技術能夠有效解決預期結果難以構造的問題。蛻變測試過程包括篩選原始測試用例、構造一組蛻變關系、基于蛻變關系將原測試用例轉化成衍生測試用例、用原始與衍生測試用例兩次執行程序,判斷程序的正確性。
恢復測試
恢復測試是測試工程師測試應用程序以檢查軟件或應用程序從災難或崩潰中恢復的程度,是為了驗證應用程序在經歷任何軟件、硬件崩潰或網絡故障等之后,可以多快、多好地改進或學習軟件的功能。
安全測試
安全測試用于發現系統中的漏洞,并確定系統的數據和資源是否受到保護,免受可能的入侵者的侵害。安全測試包括滲透測試、應用程序安全測試、API安全測試、漏洞管理、配置掃描等
壓力測試
壓力測試是用于檢查軟件的可訪問性和健壯性超出常規功能限制的測試,主要考慮關鍵軟件,執行壓力測試的主要目的是確認軟件不會因缺少計算資源而崩潰、有助于確定軟件應用程序在整個極端負載中的數據完整性,可以使用壓力測試來發現硬件和數據損壞問題。
質量評估
軟件質量特性
ISO/IEC 9126質量特性國際標準將質量屬性歸納為6個質量特性,即功能性、可靠性、易用性、效率、可移植性和可維護性。
軟件質量度量
軟件產品的度量項包括四個方面,分別是規模、工作量、進度和質量缺陷。
軟件缺陷
缺陷分類
軟件缺陷是指在程序中存在的錯誤,如語法錯誤、拼寫錯誤或一個不正確的程序語句等,按照定義,可以將軟件缺陷分為文檔缺陷、代碼缺陷、測試缺陷和過程缺陷。
缺陷狀態
缺陷狀態是指缺陷通過一個跟蹤修復過程的進展情況,從缺陷的初始狀態開始,軟件缺陷的狀態共有十種,分別是:New、Open、Fixed、Close、Reopen等。
測試流程
軟件測試的流程大致分為測試計劃與控制、測試分析與設計、測試實現與執行、測試評估與報告和測試結束活動。
測試計劃與控制
測試計劃是描述了要進行的軟件測試活動的范圍、方法、資源和進度的文檔;是對整個信息系統應用軟件組裝測試和確認測試安排。這個階段確定測試項、被測特性、測試任務、誰執行任務、各種可能的風險等。實施測試計劃可以有效預防計劃的風險,保障計劃的順利實行。
測試分析與設計
測試設計階段就是將測試計劃階段制定的測試需求進行細化分解為若干個可執行的測試過程,為測試工作的開展確立了目標、方向、策略、進度、風險控制等事項,主要體現在測試策略、測試方法的選取以及測試規程的設計上,即編寫測試方案。測試方案主要是對測試需求進行細化,分析測試用例設計方法,規劃測試環境以及對測試工具的選取等。
測試實現與執行
測試實現階段主要根據測試方案設計來完成,包括測試腳本的開發和測試用例的寫作,測試腳本通常用在自動化測試和性能測試中,根據自動化測試的目標、性能測試場景來開發相應的測試腳本,測試用例主要用來指導測試執行。在這個階段,測試人員需要搭建和維護測試環境,保證測試執行環境和測試管理(配置管理、缺陷管理)的可用。
測試評估與報告
測試工程師根據缺陷的記錄,進行分析與評估,主要分析缺陷的分布、密度以及發展趨勢,還要分析軟件在整個研發過程中引發缺陷的根本原因,最后編寫缺陷報告,為軟件產品的質量提供真實的數據依據。
測試結束活動
測試結束是在測試執行全部完成后,完成相關部門的檢查歸檔工作,除了測試報告的寫作之外,還要對測試中涉及到的所有文檔、數據以及相關資料進行整理歸檔。
軟件測試相關工具
常見的測試工具
缺陷管理工具
相關應用
應用于軟件工程
軟件工程項目需要精細化項目管理和集中項目管理兩者協調統一。在進行軟件工項目的整個實施過程中,無論是整體設計還是精細化管理,都需要軟件測試參與其中,以測試角度對軟件工程項目的設計和實施進行指導和輔助,從而糾正一些設計上的錯誤和細節上的缺陷。設立軟件測試機構,能夠對項目細分的各階段、各模塊進行軟件測試,從而確保軟件質量。
應用于Web開發
軟件測試在Web開發中可以用來評估代碼質量、檢測軟件功能、用戶端測試反饋和內存檢測等。由于軟件開發過程中是使用多種語言共同編成的,可能在程序中存在很多細節方面的問題,軟件測試能夠將問題建立為一個資源庫,通過分析資源庫,避免類似錯誤的重復產生,為其他軟件項目的研發提供借鑒,并且有效地解決代碼冗多難以檢查的難題,大大減少時間成本。
應用于信息工程建設
信息工程建設中軟件測試工作是基于企業及單位網絡平臺構建需求提供的數據檢測措施。憑借軟件測試工作的全面性,鞏固信息工程平臺構建的穩定性,并確保系統運行具備可持續化的優勢,同時能夠提升整體維修人員的工作效率。應用在信息工程安全方面,軟件測試可以保證信息工程建設的安全性,避免惡意系統的攻擊,避免病毒的侵襲。
發展趨勢
軟件測試行業正在向智能測試、測試服務化等方向發展,以往的傳統的手工測試滿足不了對軟件的要求,于是自動化測試開始出現。而大數據時代下,傳統的軟件測試平臺達不到處理大規模數據的要求,云計算平臺應運而生,它為軟件測試提供強大支撐,提供了大量資源,測試者可以在短時間內使用云服務器進行大量測試。同時,云計算也能夠在多種不同的環境下對軟件進行測試,以保證軟件的兼容性和可靠性,提供一個全面的軟件測試環境。
此外,在2023世界人工智能大會上,用大模型測試大模型的技術趨勢已經開始涌現。大規模測試技術可以通過機器自動化進行大部分的測試工作,提高了效率的同時,還能夠更深入、更全面地理解軟件的功能和性能,從而更準確地找出可能的問題和錯誤。
參考資料 >
什么是軟件測試?.IBM.2024-01-31
軟件質量發展歷程, 大模型開啟智能測試新時代.中國日報中文網.2024-01-31
Agile Testing Has Evolved! Trends To Watch In 2023.accelq.2024-02-04
Agile Testing.Safe Studio.2024-02-04
Static Testing VS Dynamic Testing – Key Differences.testsigma.2024-02-04
測試用例設計方法和系統. Google Patents.2024-02-01
什么是單元測試?.AWS.2024-02-01
User Acceptance Testing.Stanford University.2024-01-31
Functional Testing.JavaTpoint.2024-02-01
Difference Between Functional and Non-Functional Testing.JavaTpoint.2024-02-01
Why Non-Functional Testing.JavaTpoint.2024-02-01
Destructive Testing Techniques in Software Testing.testsigma.2024-02-01
蛻變測試研究進展及其在并行程序測試中的研究展望.軟件學報.2024-02-01
Recovery testing.JavaTpoint.2024-02-01
SecurityTesting.Geekforgeeks .2024-02-01
Security Testing: Types, Tools, and Best Practices.Brightsec.2024-02-01
Stress Testing.JavaTponit.2024-02-01
軟件缺陷管理.清華大學出版社.2024-02-18
JUnit Tutorial.tutorialspoint.2024-02-01
Apache JMeter?.Apache.2024-02-01
Introduction to Silk Test Workbench.microfocus.2024-02-01
FindBugs.The University of Texas at Austin.2024-02-01