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

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


jvm版本: 1.8.0_65javascript

sahi版本: Sahi Pro 6.1.0html

參考來源:java

Sahi官網node

Sahi Quick Tutorialweb

Sahi官方文檔:壓力測試chrome

Sahi社區論壇:SAHI for performance testing數據庫

Sahi (1) —— 快速入門(101 Tutorial)macos

Sahi (2) —— https/SSL配置(102 Tutorial))瀏覽器

Sahi的壓力測試腳本包含了2個子腳本,一個是用來生成壓力的,這個腳本被稱爲「noise」,跑在一個無頭(headless)的瀏覽器上,在「noise」文件中的腳本會一直無限循環執行下去。另外一個腳本被稱爲「subject」,這個腳本是被用來定時執行,而後查看不一樣壓力下的性能指標的。cookie

準備

配置

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)環境下的安裝步驟:

    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:

壓力測試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的安裝目錄下 ,新建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裏的代理瀏覽器缺乏證書,手工導入無果(沒有研究如何操做)

因而嘗試先用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較容易上手。

相關文章
相關標籤/搜索