Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)
jvm版本: 1.8.0_65
sahi版本: Sahi Pro 6.1.0
參考來源:
Sahi社群論壇:SAHI for performance testing
Sahi (1) —— 快速入門(101 Tutorial)
Sahi (2) —— https/SSL配置(102 Tutorial))
Sahi的壓力測試指令碼包含了2個子指令碼,一個是用來生成壓力的,這個指令碼被稱為“noise”,跑在一個無頭(headless)的瀏覽器上,在“noise”檔案中的指令碼會一直無限迴圈執行下去。另一個指令碼被稱為“subject”,這個指令碼是被用來定時執行,然後檢視不同壓力下的效能指標的。
準備
配置
PhantomJS
由於“noise”是通過PhantomJS在後臺執行的,所以我們需要先安裝PhantomJS。如果有brew的童鞋可以簡單執行下面命令列安裝:
brew install phantomjs
寫這篇文章的時候PhantomJS的最新穩定版本是2.0.0,但是我們需要較低的1.9.8版本
$ phantomjs --version
2.0.0
原因是Sahi6.1(也是當前最新穩定版)這個版本對於PhantomJS只支援到1.x,如果使用2.0會出現執行時卡死的情況。
以下是Mac(Linux)環境下的安裝步驟:
下載PhantomJS到 /usr/local/share
解壓後執行以下命令(1.9以下版本需要)
sudo ln -s /usr/local/share/phantomjs-1.9.8-macosx/bin/phantomjs /usr/local/share/phantomjs sudo ln -s /usr/local/share/phantomjs-1.9.8-macosx/bin/phantomjs /usr/local/bin/phantomjs sudo ln -s /usr/local/share/phantomjs-1.9.8-macosx/bin/phantomjs /usr/bin/phantomjs
完成後可以通過命令列檢視當前PhantomJS的版本號
$ phantomjs --version
在Dashboard上點選Configure加入以下配置
<browserType> <name>phantomjs</name> <displayName>PhantomJS</displayName> <icon>phantomjs.png</icon> <path>$sahiDir/ext/phantomjs/sahi_phantomjs.sh</path> <options>--proxy=localhost:9999 $sahiDir/ext/phantomjs/phantomsahi.js</options> <processName>phantomjs</processName> <capacity>100</capacity> <useSystemProxy>false</useSystemProxy> </browserType>
對於SSL錯誤,還需要修改配置為(--ignore-ssl-errors=yes):
<browserType> <name>phantomjs</name> <displayName>PhantomJS</displayName> <icon>phantomjs.png</icon> <path>$sahiDir/ext/phantomjs/sahi_phantomjs.sh</path> <options>--ignore-ssl-errors=yes --debug=yes --proxy=localhost:9999 $sahiDir/ext/phantomjs/phantomsahi.js</options> <processName>phantomjs</processName> <capacity>100</capacity> <useSystemProxy>false</useSystemProxy> </browserType>
儲存並重啟Sahi
命令列執行並測試
$ ./testrunner.sh demo/sahi_demo.sah http://sahitest.com/demo/ phantomjs
如果成功檢視log:
壓力測試Demo
Sahi6.1官方在安裝包下提供了壓力測試的示例,我們嘗試執行該測試。
首先啟動Sahi Dashboard:
$ ./start_dashboard.sh
再執行:
$ ./dload.sh demo/load/noise.sah demo/load/subject.sah http://sahitest.com/demo/training/ firefox
如果完成沒有出錯Sahi的DLoadRunner會提示成功
檢視log與報告
設定ANT
在Sahi的安裝目錄下
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
/**
* Copyright Tyto Software Pvt. Ltd.
*/
-->
<project name="demo" default="dloadrun">
<taskdef name="sahiload" classname="in.co.sahi.ant.DAntLoadRunner" classpath="lib/ant-sahi.jar"/>
<target name="dloadrun">
<sahiload scriptsPathMaster="scripts"
subject="demo/load/subject.sah"
baseurl="http://sahitest.com/demo/training/"
sahihost="localhost"
sahiport="9999"
failureproperty="sahi.failed"
haltonfailure="false"
browsertype="chrome"
noise="demo/load/noise.sah"
noiseBrowserType="phantomjs"
min="1"
max="9"
incrementBy="2"
interval="5"
subjectRepeatCount="3"
ignorePattern=".*(svn|copied).*">
<node host="localhost" port="9999"/>
<!--
<node host="machine2" port="9999"/>
<node host="machine3" port="9999"/>
-->
</sahiload>
<antcall target="failsahi"/>
</target>
<target name="failsahi" if="sahi.failed">
<fail message="Sahi tests failed!"/>
</target>
</project>
然後我們通過命令列執行
ant -f dload.xml
沒有安裝好ant的也可以通過brew安裝
$ brew install ant
錄製與修改指令碼
在錄製指令碼的時候,不知何原因,無法在通過https訪問本地搭建的sso環境https://sso.hoau.com:8433/cas 同時應用程式客戶端https://app1.hoau.com:8413/cas1 也無法正常訪問。比較Sahi裡面的瀏覽器和正常的瀏覽器證照的設定發現(Firefox-> Preferences -> Advanced -> Certificates -> View Certificates)Sahi裡的代理瀏覽器缺少證照,手工匯入無果(沒有研究如何操作)
於是嘗試先用http錄製,然後在PhantomJS後臺通過--ignore-ssl-errors=yes模式嘗試https
首先錄製http://sso.hoau.com:8083/cas
_setValue(_textbox("username"), "test01");
_setValue(_password("password"), "psw01");
_click(_submit("登陸"));
_assertExists(_div("msg"));
_assertEqual("Log In Successful You, test01, have successfully logged into the Central Authentication Service. When you are finished, for security reasons, please Log Out and Exit your web browser.", _getText(_div("msg")));
然後更改目標的地址的startURL,並且命令列下執行:
$ ./testrunner.sh my/cas_sso.sah https://sso.hoau.com:8433/cas/ phantomjs
測試成功。
同樣方式我們嘗試http://app1.hoau.com:8081
得到類似指令碼:
_setValue(_textbox("username"), "test01");
_setValue(_password("password"), "psw01");
_click(_submit("登陸"));
_assertExists(_link("test01"));
自動化測試
但如果重複playback會出錯,因為瀏覽器會保持JSESSION的session cookie,記錄下曾經登陸的狀態,無法重複playback。因此,我們需要清除瀏覽器的cookie。
Sahi官網上介紹了如何清除瀏覽器cookie,但我嘗試過發現此方法無效:
// Shows all cookies for www.yahoo.com domain.
_navigateTo("http://www.yahoo.com/_s_/dyn/Cookies_showAll");
// Click the checkbox to choose all cookies.
_check(_checkbox("_sahi_chooseAll"));
// Delete the cookies.
_click(_button("Delete"));
// Shows all cookies again so that you can verify that all cookies have been deleted.
_navigateTo("http://www.yahoo.com/_s_/dyn/Cookies_showAll");
*懷疑
可能是瀏覽器版本
我本地的Chrome版本為:42.0.2311.152 (64-bit)
Firefox版本為:43.0.2可能是路徑原因Sahi清除cookie頁面裡的javascript指令碼執行的目標路徑有問題
"_sendToServer(...)"
這個問題還沒有研究出根本原因在哪,不過有方法可以繞過去。
我有另外一片文章介紹過CAS SSO的時序圖,並且分析過http的request和Response訊息頭訊息體裡面的內容,我們可以通過將head Cookie置空達到清除cookie的目的,修改好以後的指令碼如下:
_setHttpHeader("Cookie", "");
_navigateTo("https://app2.hoau.com:8423/cas2/");
_setValue(_textbox("username"), "test01");
_setValue(_password("password"), "psw01");
_click(_submit("登陸"));
這樣我們就能重複playback,而且經測試發現資料庫中也會生成大量ticket
壓力測試
以上工作完成後,我們現在正式開始對CAS SSO的登陸做壓力測試。
我以官網的樣例為模板稍作修改:
<!--
/**
* Copyright Tyto Software Pvt. Ltd.
*/
-->
<project name="demo" default="dloadrun">
<taskdef name="sahiload" classname="in.co.sahi.ant.DAntLoadRunner" classpath="../lib/ant-sahi.jar"/>
<target name="dloadrun">
<sahiload scriptsPathMaster="scripts"
subject="my/load/subject.sah"
baseurl="https://app2.hoau.com:8423/cas2/"
sahihost="localhost"
sahiport="9999"
failureproperty="sahi.failed"
haltonfailure="false"
browsertype="chrome"
noise="my/load/subject.sah"
noiseBrowserType="phantomjs"
min="1"
max="999"
incrementBy="20"
interval="5"
subjectRepeatCount="3"
ignorePattern=".*(svn|copied).*">
<node host="localhost" port="9999"/>
<!--
<node host="machine2" port="9999"/>
<node host="machine3" port="9999"/>
-->
</sahiload>
<antcall target="failsahi"/>
</target>
<target name="failsahi" if="sahi.failed">
<fail message="Sahi tests failed!"/>
</target>
</project>
我們將baseurl指定為測試的目標地址,“subject”瀏覽器為Chrome,“noise”瀏覽器為PhantomJS,同時我們將增加執行緒數的為20,執行緒從1增長至999最大,為了專注與登陸的壓力,我同時將subject和noise都指向了登陸的指令碼。有興趣的童鞋可以嘗試以下其他的方式,以及修改引數試試。
可以通過ant執行
$ ant -f dload-sso.xml
然後竟然被我遇到了一個core dev認可,4.1.3版本的major
測試結果:
Github上的答覆:
問題
Sahi的壓力測試能否支援部署多個分散式Sahi測試節點?
Sahi的壓力測試除了Subject和Noise這種模式,是否還有需要其他支援,或者提供其他支援?
結束
還未對Sahi做全面評估,網上評論說Sahi比較適合Smoke Web UI,不過單純從個人角度就易上手程度來主管評價,Sahi相對於Selenium和JMeter較容易上手。