靜態測試(Static testing)
定義
靜態方法是指不運行被測程序本身,而只是靜態地檢查程序代碼、界面或文檔中可能存在的錯誤的過程。僅通過分析或檢查源程序的語法、結構、過程、接口等來檢查程序的正確性,對需求規格說明書、軟件設計說明書、源程序做結構分析、流程圖分析、符號執行來找錯的過程。
靜態測試主要包括各階段的評審(人工檢查)、代碼檢查、靜態結構分析、代碼質量度量等,用於對被測程序進行特性分析。
分析如下:
檢查項:代碼風格和規則審核;程序設計和結構的審核;業務邏輯的審核;走查、審查與技術復審手冊。
靜態質量:度量所依據的標准是ISO9126。在該標准中,軟件的質量用以下幾個方面來衡量,即功能性(Functionality)、可靠性(Reliability)、可用性(Usability)、有效性(Efficiency)、可維護性(Maintainability)、可移植性(Portability)。具體到靜態測試,這里主要關注的是可維護性。要衡量軟件的可維護性,可以從四個方面去度量,即可分析性(Analyzability)、可改變性(Changeability)、穩定性(Stability)以及可測試性(Testability)。具體到軟件的可測試性怎么去衡量。又可以從三個度量元去考慮,例如圈復雜度、輸入/輸出的個數等。圈復雜度越大,說明代碼中的路徑越多;路徑越多,意味着要去做測試,需要寫更多的測試用例。輸入/輸出的個數同樣的道理。
為什么要進行靜態測試?
靜態分析潛在收益是很高的: 在軟件開發生命周期中,越是后來發現的缺陷,其去除成本呈指數上漲,所以缺陷越早發現越好。靜態分析是所有測試中可以最先發現缺陷的方法,極大的降低了軟件的修復成本。
對軟件經理,靜態分析有助於:
1) 減少部署后存在錯誤的風險,去除此時發現的錯誤是非常昂貴的;
2) 縮短產品上市時間;
3) 減少代碼審查和測試的成本和時間;
4) 自動化(部分)審查,沒有或多個有限的人工檢查;
5) 消除明顯的錯誤以便改善測試的速度和重點;
6) 提高代碼質量(堅持編碼標准);
7) 實現更高的覆蓋率(更多的代碼檢查):與測試覆蓋率相關但並不完全一樣,因為重點不同。
對軟件開發人員,靜態分析有助於:
1) 提早找到/阻止錯誤(在錯誤變得很難處理之前):工具可用作開發周期的一部分,像編譯器;更直接,明顯的反饋。
2) 發現/阻止“難以測試”的錯誤:例如,靜態分析善於檢測潛在的內存泄露和緩沖區溢出,從而使開發人員更高效,花費更少的時間調試。
包括三個方面
代碼測試、界面測試和文檔測試
對於代碼測試,主要測試代碼是否符合相應的標准和規范。
對於界面測試,主要測試軟件的實際界面與需求中的說明是否相符。
對於文檔測試,主要測試用戶手冊和需求說明是否符合用戶的實際需求。
對界面和文檔的靜態測試相對容易,只要測試人員對用戶需求仔細分析研究,就很容易發現界面和文檔中的缺陷。對程序代碼的靜態測試相對復雜,需要按照相應語言的代碼規范模板(無統一標准,各公司有自己的標准)來逐行檢查程序代碼。
靜態測試主要檢查點:
下面分別從代碼、界面、文檔三個方面進行詳細說明每一部分應該如何進行測試。
1) 界面測試:
主要從聯機功能、接口測試、報表測試和批量測試幾個方面進行闡述。
2) 文檔測試
主要是需求文檔與實際設計和實現是否相符,可以根據界面測試中的點進行測試。
3) 代碼測試
程序代碼的靜態測試要復雜得多,需要我們按照相應的代碼規范模板來逐行檢查程序代碼。
對代碼的檢查我們推薦使用現有的工具進行。那么我們從哪里獲得這個規范模板呢?其實沒有一個統一的標准,每個公司內部一般都有自己的編碼規范,比如《c/c++編碼規范》,你只需要按照上面的條目逐條測試就可以了。
這段C語言編寫的小程序,比較簡單,實現的功能為:在主函數里輸入兩個單精度的數a和b,
然后調用max子函數來求a和b中的大數,最后將大數輸出。我們現在就對代碼進行靜態分析,主要根據一些C語言的基礎知識來檢查。
我們把問題分為兩種,一種必須修改的,另一種建議修改的。
必須修改的問題有三個:
1)程序沒有注釋。
注釋是程序中非常重要的組成部分,一般占到總行數的1/4左右。程序開發出來不僅是給程序員看,其他程序員和測試人員也要看。有了注釋,別人就能很快地了解程序實現的功能。注釋應該包含作者,版本號、創建日期等,以及主要功能模塊的含義。
2)子函數max沒有返回值的類型。
由於類型為單精度,我們可以在max()前面加一個float類型聲明。
3)精度丟失問題。
大家注意“c=max(a,b)”語句,我們知道c的類型為整型int ,而max(a,b)的返回值z為單精度float, 將單精度的數賦值給一個整型的數,c語言的編譯器會自動地進行類型轉換,將小數部分去掉,比如z=2.5,賦給c則為2,最后輸出的結果就不是a和b 中的大數,而是大數的整數部分。
建議修改的問題也有三個;
1)Main函數沒有返回值類型和參數列表。
雖然main函數沒有返回值和參數,但是我們將其改為void main(void),來表明main函數的返回值和參數都為空,因為在有的白盒測試工具的編碼規范中,如果不寫void會認為是個錯誤。
2)一行代碼只定義一個變量。
3)程序適當加些空行。空行不占內存,會使程序看起來更清晰。
解釋和說明一下靜態測試技術
靜態測試不以測試數據的執行而是對測試對象的分析過程。
靜態測試存在於軟件生命周期的各級測試。如:需求分析、概要設計、詳細設計及組件測試、集成測試和系統測試的階段或層級。
靜態測試的方法主要有人工(手工)評審與靜態分析(人工或機器自動檢測)兩大類。通常可分別采用一種方法或混合使用兩種方法。
靜態測試中的評審(或審查)的基本思想和目標是對軟件缺陷或錯誤的一種預防措施。因而軟件技術文檔的審查是靜態測試的主要任務之一。
靜態測試的技術方法構成和說明:
針對需求分析和概要設計進行的評審。評審在需求分析和概要分析階段 建立的評審基礎上開展,有人工評審和靜態技術分析兩個過程。
人工評審分為正式評審和非正式評審。正式評審是執行對被測對象(文檔或程序)檢查的活動及過程(也稱為技術評審);非正式評審主要采用對文檔或程序的走查活動及過程。如,對某一個具體程序的走查。走查通常采用單獨或集體審閱的方式進行。
靜態測試內容及過程
(1)靜態測試內容
靜態測試的內容包含:測試需求分析、測試概要分析、測試詳細設計、測試執行與測試結果分析
(2)靜態測試過程
進行測試需求分析:這是靜態測試過程的首個階段,將確定測試的需求,建立起測試基礎與評審基礎。
進行測試概要設計:在測試需求分析基礎上,完成對測試方案的制定。如,測試內容、測試目標、測試策略、測試方法等。
進行測試詳細設計:這個階段主要完成測試進程中,各項具體任務安排和實施的細節考慮。如,測試用例設計等。
測試執行與結果分析:根據靜態測試的計划進行靜態測試執行的過程,各項測試任務的完成,並提交測試工作交付物。
靜態測試的實施與執行
(1) 靜態測試的實施
靜態測試通常采用兩種策略:人工靜態分析和借用工具靜態分析。
人工靜態分析發揮人的智力和具有的邏輯思維優勢,在分析過程中也常借助專用的靜態測試分析工具來輔助。目前,實際工作中基本都是采用兩種方法的混合模式,既充分發揮了發揮人的智慧,又運用了機器(工具)分析的高效便捷。
(2) 靜態分析的過程有別於編譯過程
編譯的功能是不能替代測試的。雖然編譯系統也能檢查軟件(程序)中的錯誤,但其主要的作用是檢查程序的語法等錯誤。這是因為編譯系統並不具備軟件測試的功能,並無針對性的去尋找特定的軟件測試對象中的缺陷、錯誤的功效。
而測試通常是要通過執行測試用例來實現的。同時,編譯是無法檢測到程序的邏輯錯誤或缺陷的。
(3) 代碼檢查
代碼檢查的內容主要包括:代碼走查、桌面檢查、代碼審查等活動及過程。主要檢查代碼和設計的一致性,代碼對標的遵循、可讀性,代碼的邏輯表達的正確性,代碼結果的合理性等方面。
代碼檢查的具體內容:變量檢查、命名和類型審查、程序邏輯審查、程序語法檢查和程序結構檢查等。
代碼檢查的優點:是能快速找到軟件缺陷或錯誤。測試業界實踐表明,通過代碼(通常是源代碼)的走查過程,可檢查到程序中 30-70%的程序邏輯設計及編碼中的缺陷或者錯誤。代碼檢查在實際軟件開發過程中被普遍采用,特別是針對組件(即單元)測試。
代碼檢查的缺點:非常耗費時間,而且代碼檢查需要知識和經驗的積累。
一般代碼審查以下方面:
1、 代碼是否與設計一致,是否符合軟件需求、概要和詳細設計,這不僅可以看出代碼問題,也可以反過來更早發現需求或設計是否正確。
2、 代碼書寫的規范性和可讀性。每個項目都有代碼編寫規范,如Java編寫規范,C語言編寫規范等。規范的代碼包括清晰且充分的注釋、漂亮的對齊、沒有冗余、規范的命名等等。
3、 代碼邏輯是否正確,有沒有死循環、內存泄露,異常處理是否充分,事務處理是否正確等等。
4、 代碼是否有安全漏洞、易被攻擊。
5、 代碼文件組織目錄是否合理,代碼的結構是否合理
6、 代碼的重用性或復用性是高還是低
7、 代碼嵌套調用是否過多等等
靜態測試的結構分析方法
(1)以圖形方式表現程序內部結構
靜態結構分析主要以圖形的方式來表達程序內部的結構關系。如,函數調用關系圖,函數內部控制流圖等。函數調用關系圖是以直觀的圖形方式描述一個程序中各個函數的調用和被調用的關系; 函數內部控制流圖以有向圖來表達函數內部的程序控制邏輯。
(2) 以程序的控制流圖顯示程序函數的邏輯結構
程序的控制流圖由多個節點和連接的邊所構成。一個節點代表一條語句或數條語句,連接結點叫作邊,邊表示節點之間的控制流向。
(3)檢查項
靜態測試的檢查項,主要有:代碼風格和規則的審核;程序設計和結構的審核;業務邏輯的審核。
(4) 代碼的質量度量
針對軟件的可測試性、可讀性(可維護性),通常有 3 種不同的代碼質量度量
參數。
Line(行)復雜度。Line 復雜度是以代碼的行數作為計算度量的基准。
Halstead(運算符與運算元)復雜度。Halstead 復雜度是以程序中使用到的運算符與運算元數量作為計數目標(直測指標),據此來計算程序的容量和工作量。
McCabe(圈)復雜度。它是將程序流程圖結構轉化為有向圖結構,以圖形(有向圖)為基礎來衡量軟件或程序的復雜度度量。
代碼質量度量常常通過靜態測試來獲得,所以靜態測試方法也稱為靜態分析,靜態測試是對被測程序進行質量特性分析方法的總稱。
(5)檢查與規范、標准的一致性
通過靜態測試工具可檢查測試對象是否與應用的程序規范、標准的相一致,以檢查軟件程序是否遵循了大部分的編程規則與標准規范。以工具檢查的優勢是可快速並准確的幫助開發者與測試人員進行自動化檢測過程,以發現被測對象與規范、標准的一致性。
動態測試(Dynamic testing)
動態測試是指通過運行被測程序,輸入相應的測試數據,檢查實際輸出結果與預期結果的差異,並分析運行效率、正確性、健壯性、性能等。
(1)動態測試有三部分組成:構造測試用例、執行程序、分析程序的輸出結果。
(2)大多數軟件測試都屬於動態測試。所謂軟件的動態測試,就是通過運行軟件來檢驗軟件的動態行為和運行結果的正確性。目前,動態測試也是公司的測試工作的主要方式。
是否查看代碼角度和是否執行程序角度的關系
黑盒測試有可能是動態測試(運行程序,只看輸入和輸出),也有可能是靜態測試(不運行程序,只是查看界面)
白盒測試有可能是動態測試(運行程序,並分析代碼結構),也有可能是靜態測試(不運行程序,只是靜態查看代碼)
動態測試有可能是黑盒測試(運行程序,只看輸入和輸出),也有可能是白盒測試(運行程序,並分析代碼結構)
靜態測試有可能是黑盒測試(不運行程序,只是查看界面),也有可能是白盒測試(不運行程序,只是靜態查看代碼)