Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)

Richaaaard發表於2015-12-31

Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)


jvm版本: 1.8.0_65

sahi版本: Sahi Pro 6.1.0

參考來源:

Sahi官網

Sahi Quick Tutorial

Sahi官方文件:壓力測試

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會出現執行時卡死的情況。

Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)

Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)

  • 以下是Mac(Linux)環境下的安裝步驟:

    1. 下載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
    2. 在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>              
    3. 儲存並重啟Sahi

    4. 命令列執行並測試

      $ ./testrunner.sh demo/sahi_demo.sah http://sahitest.com/demo/ phantomjs

      如果成功檢視log:

      Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)

壓力測試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會提示成功

Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)

檢視log與報告

Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)

Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)

Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)

設定ANT

在Sahi的安裝目錄下,新建ant配置檔案dload.xml

    <?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裡的代理瀏覽器缺少證照,手工匯入無果(沒有研究如何操作)

Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)

於是嘗試先用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

Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)

測試成功。

同樣方式我們嘗試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

測試結果:

Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)

Github上的答覆:

Sahi (3) —— 壓力測試Load Test以CAS SSO登陸場景為例(103 Tutorial)

問題

  • Sahi的壓力測試能否支援部署多個分散式Sahi測試節點?

  • Sahi的壓力測試除了Subject和Noise這種模式,是否還有需要其他支援,或者提供其他支援?

結束

還未對Sahi做全面評估,網上評論說Sahi比較適合Smoke Web UI,不過單純從個人角度就易上手程度來主管評價,Sahi相對於Selenium和JMeter較容易上手。

相關文章