軟件測試要求開發人員避免測試自己開發的程序。從心理學角度講,這是很有道理的。特別是一個相對復雜的系統,開發人員在剛剛開發完成的時候,尚沉浸于對自己設計的回味之中。此時去測試的話往往會側重于程序本身的功能通過性測試。很難發現錯誤。
測試是為發現錯誤而執行程序的錯誤。一個人發現別人身上的不足很容易,但發現自己身上的錯誤便不那么容易了。所謂“吾能指人之失而不能見己之失,吾能指 人之小失而不能見己之大失”者是也。一個軟件開發人員需要養成一種習慣,正視自己開發的軟件,特別是剛剛完成的軟件。要看到它的不足,知道他能做什么,不 能做什么。在不能做的時候是如何處理的。對邊界條件是否做了嚴格的判斷及約束。其實大道相通,有沒有這樣的意識往往跟一個人為人處世的心態,對自己的認知 有密切的聯系。一個追求完美,經常反思自己的人往往有一種虛懷若谷的情懷,“戰戰兢兢、如履薄冰、如臨深淵”者是也。所謂的方法、套路僅僅是方便于那些不 怎么思考,只會人云亦云、亦步亦趨的人設計的。
說了一些心態方面的,再來從方法學上說一下軟件測試的要點,對開發人員來說,白盒測試要比黑盒測試更重要,這決定著你的系統上線后你能不能安心的睡覺; 測試的階段主要在單元測試與集成測試方面。
先看一張測試相關的圖:
按照測試的過程,分為單元測試、集成測試、系統測試、驗收測試四點。對于開發人員來說,我只強調前面兩點。
單元測試主要測試編寫的類、類中的函數等。這是測試的最小單元。常用的測試工具有java的JUnit、BoostTest等。
集成測試側重于系統的整體功能性測試,這需要模擬各種可能的請求情況,特別是邊界條件。在多系統中,單個系統的測試完了后還需要各個系統之間的聯調。
測試目標方面,除了一般的功能測試之外還需要穩定性測試、性能測試、可靠性測試、適用性測試、易用性測試、安全性測試。
下面詳細介紹一下各個測試要點的測試內容。
1. 功能性測試:
在軟件測試領域的通用理解是:“功能測試是基于產品功能說明書,是在已知產品所應具有的功能,從用戶角度來進行功能驗證,以確認每個功能是否都能正常使 用、是否實現了產品規格說明書的要求、是否能適當地接收輸入數鋸而產生正確的輸出結果等。功能測試,包括用戶界面測試、各種操作的測試、不同的數據輸入、 邏輯思路、數據輸出和存儲等的測試。” 對于開發人員來說,功能性測試主要是對系統所支持的功能點的測試,對數據的測試,包括數據邊界的測試、數據包長度限制的測試、各個功能模塊數據的正確性測 試以及容錯處理。該項測試要先把系統的功能點全部列出來,對異常數據的處理也算在內。
2. 穩定性測試:
測試在壓力情況下內存使用情況,cpu使用情況,是否有內存泄露,各個模塊功能是否正常,能否正常提供服務,是否會在高壓情況下卡死等。這也需要用各種可 能數據進行壓力測試,要測試邊界條件下,收到攻擊時還能否正常工作,系統有沒有自清理功能等。個人的理解,該項測試類似于可靠性測試,要點在于測試系統在 極端情況下是否正常。比如一個房子在高強度地震下的抗震能力。
3. 性能測試:
測試程序(一般是服務器),每秒能正常處理的請求數。這項測試一般是尋找系統的性能瓶頸,看看能否滿足實際的需求。當下,一個服務器每天處理5000萬的請求便可以了。當然,通過優化對性能的追求是沒有止境的。
4. 安全性測試:
安全性測試的主要目的是 確保軟件不會去完成沒有預先設計的功能。這一點很重要,需要開發人員在開發時對可能出現的情況作細致的判斷。常見的安全性測試內容有:畸形的文件結構、畸 形的數據包、用戶輸入的驗證、驗證資源之間的依賴關系、配置文件等的格式等。因為開發人員常常假定他所獲取的資源內容是符合一定標準或規則的。附錄十常見 的web安全性測試的內容。
5. 適用性測試:
附: WEB安全性測試
一個完整的WEB安全性測試可以從部署與基礎結構、輸入驗證、身份驗證、授權、配置管理、敏感數據、會話管理、加密。參數操作、異常管理、審核和日志記錄等幾個方面入手。
1. 安全體系測試
1) 部署與基礎結構
l 網絡是否提供了安全的通信
l 部署拓撲結構是否包括內部的防火墻
l 部署拓撲結構中是否包括遠程應用程序服務器
l 基礎結構安全性需求的限制是什么
l 目標環境支持怎樣的信任級別
2) 輸入驗證
l 如何驗證輸入
A. 是否清楚入口點
B. 是否清楚信任邊界
C. 是否驗證Web頁輸入
D. 是否對傳遞到組件或Web服務的參數進行驗證
E. 是否驗證從數據庫中檢索的數據
F. 是否將方法集中起來
G. 是否依賴客戶端的驗證
H. 應用程序是否易受SQL注入攻擊
I. 應用程序是否易受XSS攻擊
l 如何處理輸入
3) 身份驗證
l 是否區分公共訪問和受限訪問
l 是否明確服務帳戶要求
l 如何驗證調用者身份
l 如何驗證數據庫的身份
l 是否強制試用帳戶管理措施
4) 授權
l 如何向最終用戶授權
l 如何在數據庫中授權應用程序
l 如何將訪問限定于系統級資源
5) 配置管理
l 是否支持遠程管理
l 是否保證配置存儲的安全
l 是否隔離管理員特權
6) 敏感數據
l 是否存儲機密信息
l 如何存儲敏感數據
l 是否在網絡中傳遞敏感數據
l 是否記錄敏感數據
7) 會話管理
l 如何交換會話標識符
l 是否限制會話生存期
l 如何確保會話存儲狀態的安全
8) 加密
l 為何使用特定的算法
l 如何確保加密密鑰的安全性
9) 參數操作
l 是否驗證所有的輸入參數
l 是否在參數過程中傳遞敏感數據
l 是否為了安全問題而使用HTTP頭數據
10) 異常管理
l 是否使用結構化的異常處理
l 是否向客戶端公開了太多的信息
11) 審核和日志記錄
l 是否明確了要審核的活動
l 是否考慮如何流動原始調用這身份
2. 應用及傳輸安全
WEB應用系統的安全性從使用角度可以分為應用級的安全與傳輸級的安全,安全性測試也可以從這兩方面入手。
應用級的安全測試的主要目的是查找Web系統自身程序設計中存在的安全隱患,主要測試區域如下。
l 注冊與登陸:現在的Web應用系統基本采用先注冊,后登錄的方式。
A. 必須測試有效和無效的用戶名和密碼
B. 要注意是否存在大小寫敏感,
C. 可以嘗試多少次的限制
D. 是否可以不登錄而直接瀏覽某個頁面等。
l 在線超時:Web應用系統是否有超時的限制,也就是說,用戶登陸一定時間內(例如15分鐘)沒有點擊任何頁面,是否需要重新登陸才能正常使用。
l 操作留痕:為了保證Web應用系統的安全性,日志文件是至關重要的。需要測試相關信息是否寫進入了日志文件,是否可追蹤。
l 備份與恢復:為了防范系統的意外崩潰造成的數據丟失,備份與恢復手段是一個Web系統的必備功能。備份與恢復根據Web系統對安全性的要求可以采用多種手 段,如數據庫增量備份、數據庫完全備份、系統完全備份等。出于更高的安全性要求,某些實時系統經常會采用雙機熱備或多級熱備。除了對于這些備份與恢復方式 進行驗證測試以外,還要評估這種備份與恢復方式是否滿足Web系統的安全性需求。
傳輸級的安全測試是考慮到Web系統的傳輸的特殊性,重點測試數據經客戶端傳送到服務器端可能存在的安全漏洞,以及服務器防范非法訪問的能力。一般測試項目包括以下幾個方面。
l HTTPS和SSL測試:默認的情況下,安全HTTP(Soure HTTP)通過安全套接字SSL(Source Socket Layer)協議在端口443上使用普通的HTTP。HTTPS使用的公共密鑰的加密長度決定的HTTPS的安全級別,但從某種意義上來說,安全性的保證 是以損失性能為代價的。除了還要測試加密是否正確,檢查信息的完整性和確認HTTPS的安全級別外,還要注意在此安全級別下,其性能是否達到要求。
l 服務器端的腳本漏洞檢查:存在于服務器端的腳本常常構成安全漏洞,這些漏洞又往往被黑客利用。所以,還要測試沒有經過授權,就不能在服務器端放置和編輯腳本的問題。
l 防火墻測試:防火墻是一種主要用于防護非法訪問的路由器,在Web系統中是很常用的一種安全系統。防火墻測試是一個很大很專業的課題。這里所涉及的只是對防火墻功能、設置進行測試,以判斷本Web系統的安全需求。