性能測試新手誤區(四):一切來自錄制
性能測試新手誤區(二):為什么我模擬的百萬測試數據是無效的?
經常會有性能測試新手問這樣的問題:
C/S的系統如何錄制,應該選擇什么協議呢?
待測系統A的一個功能,是由B系統調用的,也需要搭建B系統的測試環境并對其錄制么?
我的回答是,先弄清楚你想測的是什么?對它而言,壓力又是什么?
新手總是想著如何錄制客戶端的操作,如何模擬客戶端的點擊。這種想法應該是受到了主流測試工具影響,性能測試的入門基本都是從工具開始,比如使用最廣的 LR,其最方便好用的功能應該就是錄制了。但是需要清楚的是,錄制只是為性能測試提供便利的一個功能(可以傻瓜式的產生向服務器施加壓力的腳本),錄制本 身并不是性能測試的根本或者所必需,能夠產生壓力的那些腳本或是程序才是關鍵所在。
第一個問題,比如一個即時通訊類的軟件如何測試?
首先要明確你想測的是客戶端還是服務端,如果是服務端,那么服務端承受的壓力是什么呢?
是每一條消息都要經過服務器么?
服務器是要將消息進行存儲,還是僅僅轉發?
不同的功能,如普通會話和多人會話,從服務端來看的區別是什么?
客戶端是如何同服務端通信的,是采用了一些標準的開源協議(如XMPP),還是經過了自己的重新擴展?
……
為了回答那兩個看似很簡單的問題(想測什么?壓力是什么?),其實你需要了解整個系統的運行方式。這些信息完全可以從一些設計文檔或者開發人員的口中獲取到,并不需要你能讀懂源碼。
如果我知道了這個軟件使用了XMPP協議,一條普通的會話是客戶端向服務器發送了這樣一條信息:
消息類型:普通 接收人:A 消息內容:XXX |
而多人會話是客戶端發送了這樣的信息:
消息類型:多人 接收人:A, B, C 消息內容:XXX |
那么應該會知道,表面上這些不同的功能,其實只是客戶端發送信息中個別字段的區別而已。那么我就可以想辦法直接向服務器發送這些信息,讓服務器根據接收 信息的內容去完成相應的功能。也許根本沒有必要去想如何錄制客戶端發起一個會話并發送消息這個動作,或者發送文件、群消息等等其他操作。
至于如何實現,如果你有編碼能力,可以將開源代碼引入到自己的測試代碼中(需是標準協議),否者可能需要讓程序的開發人員實現一個測試程序。不 要不敢開口,開發人員協助進行性能測試是很正常的,而且這種工作量不會很大,只是把程序中的一些代碼封裝成一個可配置可方便調用的執行文件。
讓開發人員來實現測試工具不丟臉,怕的是你自己不知道測試工具應該實現成什么樣。(當然,如果自己可以看源碼來實現工具那就更好了)
第二個問題,同樣的,所謂的B系統調用A系統這個動作,是如何實現的?
會不會只是一個簡單的HTTP請求?
或者是調用A系統的一個webservice接口?
你要測的是A的這個功能么?
如果是,那我們為什么一定要通過B系統來錄制這A的這個功能呢?完全可以直接向A發送請求或者是調用接口(如LR中的webservice協議)。
至于具體如何做,可能有很多現成的接口測試工具,也可能仍然需要開發人員的協助。比如B與A之間傳遞的數據是經過加密的,那對(黑盒)測試來說就會非常困難,這種情況下,確實有可能通過B來錄制會更簡單。
在51Testing上看到的一個問題,問如何測試一個統計報表的另存為(excel)功能。
點這個按鈕后,服務器會生成一張報表,然后彈出瀏覽器的另存為對話框,保存為本地文件。提問題的這個人遇到的困難是,LR中好像沒法錄制“另存為”這個動作。
之所以會有這樣的問題,根本原因還是沒有理解系統的運行原理,沒有區分哪是服務器、哪是客戶端。
一般來說,這個過程是這樣的:
1、點另存為按鈕時,向服務器發送了一個計算報表的請求,這個請求中會包含一些參數,如報表類型、統計時間等等。
2、服務器計算完成后,將結果數據返回給客戶端(瀏覽器)。
3、瀏覽器本身的功能,將數據保存為一個本地文件。
(這里假設了計算過程是另存為按鈕觸發的,如果是打開頁面時就計算完,那點按鈕時甚至有可能根本沒與服務器進行交互)
如果明白了這個過程,那么就不會糾結于錄制“另存為”這種事情了,你要做的只是向服務器發送一個請求,然后接收響應數據。
那么就不需要生成本地文件了么?當然不是,否則怎么驗證返回的數據沒有問題呢。只不過這個文件的操作需要自己來實現了,創建文件、寫入數據、關閉文件。
最后再總結一下要點:
● 理解系統的運行原理
● 區分服務端和客戶端
● 弄清楚你要測的是什么,哪些東西其實是可有可無的
● 要模擬的是服務器的壓力,而不是客戶端的操作
● 錄制只是一種手段,很多情況下并不是最佳選擇
● 開發人員的協助是應當的,但前提是你要明確的知道應該如何測試
相關鏈接:
posted on 2012-09-17 10:16 順其自然EVO 閱讀(222) 評論(0) 編輯 收藏 所屬分類: 性能測試