2015年10月6日 星期二

Performance Testing、Load Testing & Stress Testing

哈囉!!! 大家好~

今天要跟大家聊一聊什麼是「Performance Testing(效能測試)、Load Testing(負載測試)、Stress Testing(壓力測試)」

這三種測試名稱,意義都很接近、又容易混淆的名詞,即使是資深的軟體相關從業人員,也不見得能輕易地說出三者的差異。

這裏有一個QA面試時,可能常常會被問到的問題:
如何定義效能測試、負載測試、壓力測試?

大部分相關的技術人員常常會用到這些專有名詞,但是實際上他們也常常分辨不出來,它們之間到底有什麼不同的差異?


以下是這一節的圖解大綱:

Step 1: Performance Testing (效能測試)
效能測試的目的不是為了要找出臭蟲 (Bug),而是要解決瓶頸後做回歸測試 (Regression Testing) 時建立一個標準。效能測試一般是進行在嚴謹控制的量測和分析流程內,理想上軟體應該在夠穩定的情況下進行測試,因此測試的過程才可以很順利的進行。

「要清楚效能測試的定義」
以 Web Application 測試為例 ,需注意如下 : 
.expected load in terms of concurrent users or HTTP connections
 期望條件下的線上使用者,或是HTTP的連線數
.Acceptable response time
 可接受的回應時間
.Application Level
 應用程式層:開發者可以使用工具,找出無效率的程式碼
.Database Level
 資料庫層:開發者或 DBA可以使用資料庫專用的最佳化工具
.Operating System Level
 作業系統層:系統工程師可以使用小程式或監控工具,以觀察硬體資源
.Network Level
 網路層:網路工程師能使用封包探測工具

從測試的角度來看,因為系統是「由內而外」做不同角度的測試和分析,所以會被認為是白箱測試 (White-Box Testing)的一種。但實際上對系統而言,是用黑箱測試 (Black-Box Testing)的方法執行負載測試。主要是用測試工具模擬定量HTTP連線,以觀察系統反應時間是否達到期望目標。

當測試完後,系統反應如果未達標時,就會對「程式碼與資料庫」做些調整。而 TDD人員會規劃出合適的架構,利用壓測工具做定時的負載測試,並對原程式碼做單元測試,測試完後會做些調整,且確認程式是可以執行的。

資料庫的部分,對作業系統和硬體都要 Tuning 成最佳化,以達到符合效能的需求。

當調整程式與資料庫之後,系統效能還是不符時,還有提供以下幾個改程式碼以外的方法 : 
.Use Web cache mechanisms, such as the one provided by Squid
.Publish highly-requested Web pages statically, so that they don't hit the database
.Scale the Web server farm horizontally via load balancing

.Scale the database servers horizontally and split them into read/write servers and  read-only servers, then load balance the read-only servers
.Scale the Web and database servers vertically, by adding more hardware resources (CPU, RAM, disks)
.Increase the available network bandwidth

效能調整有時候可以說是一門藝術或學問,因為在複雜環境下與日新月異的程式設計,往往需要同時把握好時間、修改和測試等三個方面。

在不同的測試環境中,在修改過後的程式,有時候很難可以複製出和之前一樣的環境來證明測試結果。所以在有些實驗室的測試環境,當沒有辦法複製出跟客戶一模一樣的工作環境時,只能分段或分開來做模擬測試,當然在這樣的環境下,對於測試結果的效能表現,並不要太高的期望。

「執行Load Testing =>分析效能 =>調校系統」的循環下會一直反覆下去,直到系統達到預期的效能。因為這樣可以讓測試者建立一個底線,讓系統處於一個基本的水準,而這個基準可以在回歸測試中持續使用,用來測試新版本時,判定是否符合效能的基準點。

一般來說系統的測試基準值 (Benchmark),大部分會依業界公認的認證標準來做測試基準。所以業界的軟硬體供應商,都會盡量調整自己的系統以達到認證標準,甚至成為該領域的認證標準。

Step 2: Load Testing (負載測試)
「負載測試」總的來說是屬於效能測試的一種,這表示利用自動化測試工具,持續增加負載到受測試系統中的方式。如果以網頁程式為例,負載就是線上的使用者、HTTP session 的連線數等等。

一般在測試文件中,「負載測試」常被定義為系統在正常運作下的「最大工作量」。而負載測試通常被稱為「容量測試 (Volume Testing)、壽命測試 (Longevity Testing)、耐力測試(Endurance Testing)」。

Examples of Volume Testing : 
.Testing a word processor by editing a very large document
 (用文字編輯器去編輯一個大的文字檔)
.Testing a printer by sending it a very large job
 (傳一個大的工作量給列表機做測試)
.Testing a mail server with thousands of users mailboxes
 (用上千位使用者的信箱去測試郵件主機)
.A specific case of volume testing is zero-volume testing, where the system is fed empty tasks
 (測試系統是否可以執行內容是0的工作)

Examples of Longevity Testing or Endurance Testing : 
.Testing a client-server application by running the client in a loop against the server over an extended period of time
 (用Client測試一個 Client-Server的應用程式,以考驗Server在延長一段工作時間下的情況)

Goals of load testing : 
.Expose bugs that do not surface in cursory testing, such as memory management bugs, memory leaks, buffer overflows, etc.
(指出基本的測試錯誤。如: 記憶體控制不良、記憶體溢漏、緩衝區溢位…等等 )
.Ensure that the application meets the performance baseline established during performance testing. This is done by running regression tests against the application at a specified maximum load.
(確認應用程式符合效能測試所建立的效能底線。利用回歸測試確保應用程式符合特定的最大負載量)

雖然效能測試和負載測試看起來似乎一樣,但是目的是不同的:
1. 效能測試使用負載測試技術或工具,使用各種負載測試的方式,測試出效能的基準線。
2. 負載測試的方式:是先定義一個負載的測試方法,例如一般都限定在某種高負載下,測試系統是否一樣能正常運作。
(注意:負載測試並只是一直提高負載,直到中斷系統為止,相反的是要讓系統在高負載的情況下,一樣可以維持良好的運作狀況。)

在有關聯性的負載測試中,要能提供一個大型資料庫以協助做測試,因為在過往的經驗中,有許多嚴重的錯誤,並不是很容易或輕易的浮現。所以就需要有上千位使用者般的龐大負載來做  Load Testing (例如:在測試 LDAP、NIS、Active Directory、Mail Server 的上千個郵件信箱、數 Gigabyte Tables 的資料庫、多層的檔案或目錄架構的檔案系統...等等),而這些大資料量都需要測試者利用工具產生。

Step 3: Stress Testing (壓力測試)
「壓力測試」是讓系統在特定壓力下,例如藉由超出系統資源或拿走系統資源,這種情況有時被稱為「負面測試 (Negative Testing)」的壓力下,做的一種測試。這種測試有時也會試著中斷系統並確保系統在失效後,測試系統能正常地的恢復工作的一種測試 ,這種測試稱為系統的「可復原性 (Recoverability)測試」,以上的測試都是壓力測試的測試方式。

效能測試是需要在受控制的環境下,做反覆性的測試。而壓力測試則是給系統不可預期的壓力下,做正常與非正常的測試後,驗證系統是否可以繼續正常運作。

以網頁程式為例,這裏有許多不同的壓力方式可以應用於系統上做測試:
.Double the baseline number for concurrent users/HTTP connections
.Randomly shut down and restart ports on the network switches/routers that connect the servers (via SNMP commands for example)
.Take the database offline, then restart it
.Rebuild a RAID array while the system is running
.Run processes that consume resources (CPU, memory, disk, network) on the web and database servers

相信每位測試者自己會運用各種方式來施壓對系統做測試,但是壓力測試並不只是簡單的,只是給予系統壓力,例如中斷系統而已,而壓測目的最重要的是,需要測試者仔細觀察系統在失效之後的各種反應:
1. 系統是否保留原來的狀態或是突然當機?
2. 還是系統是否只是凍結 (freeze) 或只是很平和的失效而已?
3. 在重啟系統之後是否有辦法,重新回到上次的工作狀態?
4. 系統會不會正確的顯示出錯誤訊息或是顯示一些亂碼給使用者
5. 會不會因為某些意外的錯誤而危及到系統安全?
以上這些案例都不勝枚舉。

Step 4: Conclusion (結論)
效能測試:利用負載測試方式,反覆測試與調整直到系統符合預期效能。
負載測試:給特定大量的負載,測試系統是否能正常運作。
壓力測試:在給予壓力的特定條件下,經過正常 (Functional Test) 與非正常 (Error Handling Test...) 的測試後,驗證系統是否依然可以正常運作。

最後出一個考題給大家「效能、負載、壓力測試在實作時,常常會遇到的測試盲點是應該針對「系統」做測試?還是對「Client端」做測試?

關於效能、負載和壓力這三種測試,這一節就先討論到這裡。如果有任何問題,歡迎各位可以在底下留言,或直接寫Email,太陽哥都會盡快幫各位解答,那我們就下次見囉!~ 掰掰 ~

~ See you ~

參考出處:
Agile Testing


2 則留言: