從測試方法的角度可以分為手工測試和自動化測試。
1、靜態測試
所謂靜態測試(static testing)就是不實際運行被測軟件,而只是靜態地檢查程序代碼、界面或文檔中可能存在的錯誤的過程。
從概念中我們可以知道,其包括對代碼測試、界面測試和文檔測試三個方面:
對於代碼測試,主要測試代碼是否符合相應的標准和規范。
對於界面測試,主要測試軟件的實際界面與需求中的說明是否相符。
對於文檔測試,主要測試用戶手冊和需求說明是否符合用戶的實際需求。
其中后兩者的測試容易一些,只要測試人員對用戶需求很熟悉,並比較細心就很容易發現界面和文檔中的缺陷。而對程序代碼的靜態測試要復雜得多,需要我們按照相應的代碼規范模板來逐行檢查程序代碼。那么我們從哪里獲得這個規范模板呢?其實沒有一個統一的標准,每個公司內部一般都有自己的編碼規范,比如《c/c++編碼規范》,你只需要按照上面的條目逐條測試就可以了。當然很白盒測試工具中就自動集成了各種語言的編碼規范,比如parasoft公司的C++Test就集成了C/C++的編碼規范,我們只要點擊一個按鈕,這些工具就會自動幫助我們檢測代碼中不符合語法規范的地方,非常方便。
下面我們舉一個實際的例子。
C語言程序的靜態分析和動態分析
#include <stdio.h>
Max(float x, float y)
{
float z;
z=x>y?x:y;
return(z);
}
Main()
{
float a, b;
int c;
scanf(“%f, %f”&a,&b);
c=max(a,b);
printf(“Max is %d\n”, 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)程序適當加些空行。空行不占內存,會使程序看起來更清晰。
程序修改如下:
#include <stdio.h>
float max(float x, float y)//返回兩個單精度數中的大數
{
float z;
z=x>y?x:y;
return(z);
}
main()
{
float a;
float b;
int c;
scanf(“%f, %f”&a,&b);
c=max(a,b);
printf(“Max is %d\n”, c);
}
根據上面的分析,我們來編寫一個簡單的C語言代碼規范
規范編號 |
規范內容 |
是否通過 |
1 |
一行代碼只做一件事情 |
|
2 |
代碼行的最大長度控制在70-80字,否則不便於閱讀和打印 |
|
3 |
函數和函數之間,定義語句和執行語句之間加空行 |
|
4 |
在程序開頭加注釋,說明程序的基本信息;在重要的函數模快處加注釋,說明函數的功能 |
|
5 |
低層次的語句比高層次的縮進一個tab(4個空格) |
|
6 |
不要漏掉函數的參數和返回值,如果沒有,用void表示 |
|
2. 動態測試
動態測試(dynamic testing),指的是實際運行被測程序,輸入相應的測試數據,檢查實際輸出結果和預期結果是否相符的過程,所以判斷一個測試屬於動態測試還是靜態的,唯一的標准就是看是否運行程序。
我們還是以剛才的那段代碼為例,實際運行修改后的程序,輸入1.2 和3.5兩個實數,按回車,得到結果3.500000,與我們預期的相符合。
這是一個動態測試的過程。可能有的讀者會問,以上過程不也是黑盒測試的過程馬?黑盒白盒、動態靜態,它們之間有什么關系呢?
它們只是測試的不同角度而已,同一個測試,既有可能是黑盒測試,也有可能是動態測試;既有可能是靜態測試,也有可能是白盒測試。
黑盒測試有可能是動態測試(運行程序,看輸入輸出),也有可能是靜態測試(不運行,只看界面)
白盒測試有可能是動態測試(運行程序並分析代碼結構),也有可能是靜態測試(不運行程序,只靜態察看代碼)
動態測試有可能是黑盒測試(運行,只看輸入輸出),也有可能是白盒測試 (運行並分析代碼結構)
靜態測試有可能是黑盒測試(不運行,只察看界面),也有可能是白盒測試(不運行,只察看代碼)