1. 程式人生 > >Arcgis Server 使用 selenium grid +Java 壓力測試實錄

Arcgis Server 使用 selenium grid +Java 壓力測試實錄

1.測試思路

建立一臺測試虛擬機器,使用selenium 自動化UI測試方法測試 arcgis 地圖引擎, 驗證200臺終端同時持續的隨機訪問arcgis 伺服器時,arcgis 伺服器是否可以正常服務.

Arcgis 伺服器配置: 虛擬機器 Arcgis 10.5 安裝在windows2008, 記憶體32GB,硬碟500GB,CPU 4個

記憶體 100GB,硬碟100GB,CPU 40個,作業系統cenos7

建立完成後,記得優化centos7

2.構造一個簡單的頁面,可以開啟指定的地圖,這裡用的是cgs2000座標系, index.html 內容如下面的web程式碼,

3.用瀏覽器開啟這個頁面,確保可以開啟地圖。

4.把這個頁面部署到nginx 伺服器測試虛擬機器上。

這裡我用的是nginx docker, 外掛一個目錄,目錄裡放的是index.html

記得開啟web埠,8777 (不用80,8080 因為測試機在單位內網,單位禁止使用這2個埠)

5. 用瀏覽器開啟 http://11.23.3.114:8777/index.html 確保一切正常瀏覽。

6.測試方法 地圖上找個中心點 (下面用的是福州市的地圖中心點) //119.30239300, latitude=26.06971100 福州茶亭公園 wgs84, 修改index.html

7. 採用本地WebDriver 方式測試(我是在Mac + chrome )

8. 瀏覽器開啟 http://11.23.3.114:8777/index.html 這個頁面後, 隨機生成經度和緯度,偏差控制在 新的點在指定城市(福州市)地圖上即可,最好加上市區的落點概率80%,郊區的20%,也就是20%的市區面積有80%的訪問率,80%面積的郊區有20%的落點概率。

9. 載入圖層後,聯絡點選+ 放大圖層,直到最大。

9.重複7的步驟。

10. 確認單一chrome 瀏覽器測試正常,達到預期。

11. 部署 整套測試環境

    1.部署nginx

happy:nginx happy$ tree
.
├── start-docker.sh
└── www
    └── index.html

1 directory, 2 files
 

happy:nginx happy$ more start-docker.sh
#!/bin/bash
#確保shell 切換到當前shell 指令碼資料夾
current_file_path=$(cd "$(dirname "$0")"; pwd)
cd ${current_file_path}

sudo firewall-cmd --add-port=8777/tcp --zone=public --permanent
sudo firewall-cmd --add-port=443/tcp --zone=public --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

docker stop testnginx
docker rm   testnginx

docker run \
--restart=always \
--name=testnginx \
-p 8777:80 \
-p 443:443 \
-v `pwd`/www:/usr/share/nginx/html  \
-d nginx:1.13-alpine

echo "開啟http://localhost:8777/index.html 可以瀏覽"

happy:nginx happy$ more www/index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>ArcGIS JavaScript API: Image2013_CGCS2000</title>
    <script src="http://11.23.2.101/arcgis_js_api/library/3.20/3.20/init.js"></script>
    <link rel="stylesheet" href="http://11.23.2.101/arcgis_js_api/library/3.20/3.20/esri/css/esri.css">

    <script type="text/javascript">

        var m_map={};

        require([
            "esri/layers/ArcGISDynamicMapServiceLayer",
            "esri/layers/ArcGISTiledMapServiceLayer",
            "esri/map",
            "dojo/parser",
            "dojo/domReady!",
            "dijit/layout/BorderContainer",
            "dijit/layout/ContentPane"

        ], function(ArcGISDynamicMapServiceLayer, ArcGISTiledMapServiceLayer, Map, parser){
            parser.parse();
            var map = new Map("map");
            var layer;
            layer = new ArcGISTiledMapServiceLayer("http://11.23.2.101/arcgis/rest/services/Image2013_CGCS2000/MapServer");
            map.addLayer(layer);
            map.setZoom(3);
            //map.centerAt(new esri.geometry.Point(119.3,25.9,new esri.SpatialReference({wkid:4490})));
            //119.30239300, latitude=26.06971100
            map.centerAt(new esri.geometry.Point(119.30239300,26.06971100,new esri.SpatialReference({wkid:4490})));

            m_map=map;
            m_map.test = function (lon,lat,level) {
                map.setZoom(level);
                map.centerAt(new esri.geometry.Point(lon,lat,new esri.SpatialReference({wkid:4490})));
            }
        });

        var m_randomMove = function (lon,lat,level) {
            m_map.test(lon,lat,level);
        }
    </script> </head> <body >  <div id="map" style="width:1200px;height:1500px;" >
</div>  </body>
</html>

    2.部署selenium-grid

在測試虛擬機器上。

mkdir -p /var/server/selenium-grid

happy:selenium-grid happy$ more start-selenium-grid-docker.sh
#!/bin/bash
#確保shell 切換到當前shell 指令碼資料夾
current_file_path=$(cd "$(dirname "$0")"; pwd)
cd ${current_file_path}

echo "命令格式 ./start-selenium-grid-docker.sh {瀏覽器docker容器數量}"
echo "命令格式 ./start-selenium-grid-docker.sh {瀏覽器docker容器數量}"
echo "將執行$1個瀏覽器docker,按CTRL+C 中斷退出"

if [ ! -n "$1" ] ;then
    echo "請輸入瀏覽器docker容器數量"
    exit 1
else
    echo "瀏覽器docker容器數量 是 $1"
fi

sleep 10


docker stop $(docker ps -a | grep 'selenium' | awk '{print $1 }')
docker rm $(docker ps -a | grep 'selenium' | grep 'Exited' | awk '{print $1 }')

#docker stop $(docker ps -a | grep 'selenium' | awk '{print $1 }')
#docker rm $(docker ps -a | grep 'selenium' | awk '{print $1 }')

#docker stop selenium-hub
#docker rm   selenium-hub

dockerimage_compressed_tgz="selenium-hub-20180930.image.tgz"
dockerimage_name_version="selenium/hub:latest"
dockerimagelist=$(docker images | grep -v REPOSITORY | awk '{a=$1;b=$2;c=(a":"b);print c}')
found=0
#判斷dockerimagelist裡是否包含$dockerimage_name_version
case "${dockerimagelist}" in
  *${dockerimage_name_version}*)
    found=1;;
esac

if found==1 ; then
   echo "${dockerimage_name_version}已經存在."
else
   echo "本系統尚未載入${dockerimage_name_version} docker映象,馬上載入,請稍等一會兒..."
   gunzip -c ${dockerimage_compressed_tgz} | docker load
fi
#gunzip -c selenium-hub-20180930.image.tgz | docker load
#gunzip -c selenium-node-chrome-20180930.image.tgz | docker load
#gunzip -c selenium-node-firefox-20180930.image.tgz | docker load

firewall-cmd --add-port=4444/tcp --zone=public --permanent
firewall-cmd --reload

docker run -d -p 4444:4444 --name selenium-hub selenium/hub:latest

COUNT=$1
for i in $(seq 1 $COUNT);
    do
        echo $i;
        #docker run -d --link selenium-hub:hub selenium/node-firefox:latest
        docker run -d --link selenium-hub:hub selenium/node-chrome:latest
    done

echo "http://localhost:4444/grid/console"

12. 修改webdriver 為 RemoteWebDriver

    public static void main(String[] args) throws Exception {

        ArcgisPerformanceTest test = new ArcgisPerformanceTest();
        String driverType="chrome";

//        //1.本地測試,方便初期驗證測試方法是否正確.
//        for(int i=0;i<5;i++) {
//            new Thread(()-> test.localTask(driverType)).start();
//            test.waitFor(100);
//        }
//        test.waitFor(1000*60*60*24);

        //2.selenium-grid 遠端測試,用於大規模的壓力測試,模擬真實使用者訪問.
        int thread_number=180;  //
        for(int i=1;i<=thread_number;i++){
            new Thread(()-> test.remoteTask(driverType)).start();
            test.waitFor(100);
        }
    }

13. 執行測試 我是採用200個docker 例項

14. 手動開啟Arcgis 看看是否還能開啟,監控網路流量.

java 測試程式碼如下:

package com.linyingjie.tool.documentTranslate;

import com.linyingjie.tool.documentTranslate.translate.GoogleFreeTranslate;

import com.linyingjie.tool.documentTranslate.translate.TranslateDirection;

import com.linyingjie.tool.documentTranslate.webdriver.config.DriverFactory;

import org.openqa.selenium.By;

import org.openqa.selenium.JavascriptExecutor;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.firefox.FirefoxDriver;

import org.openqa.selenium.interactions.Actions;

import org.openqa.selenium.remote.DesiredCapabilities;

import org.openqa.selenium.remote.RemoteWebDriver;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import java.util.concurrent.TimeUnit;

public class Application {

private static List<DriverFactory> webDriverThreadPool = Collections.synchronizedList(new ArrayList<DriverFactory>());

private static ThreadLocal<DriverFactory> driverThread;

public static void main(String[] args) throws Exception {

String driverType="chrome";

for(int i=1;i<=180;i++){

new Thread(()-> remoteTask(driverType)).start();

waitFor(100);

}

for(int i=0;i<20;i++) {

new Thread(()-> localTask(driverType)).start();

waitFor(100);

}

waitFor(1000*60*60*24);

}

public static void remoteTask(String driverType){

String seleniumGridHubURL="http://11.23.3.114:4444/wd/hub";

try {

WebDriver webDriver = getRemoteDriver(driverType, seleniumGridHubURL);

String entryURL = "http://11.23.3.114:8777/index.html";

arcgisTest(webDriver, entryURL);

}catch(Exception e){

e.printStackTrace();

}

}

public static void localTask(String driverType){

try {

WebDriver webDriver = getLocalDriver(driverType);//getDriver();

String entryURL = "http://11.23.3.114:8777/index.html";

arcgisTest(webDriver, entryURL);

}catch(Exception e){

e.printStackTrace();

}

}

/**

* 遠端版

* @throws Exception

*/

public static void remoteDriverTest() throws Exception {

DesiredCapabilities firefoxDesiredcap = DesiredCapabilities.firefox();

DesiredCapabilities chromeDesiredcap = DesiredCapabilities.chrome();

//DesiredCapabilities ieDesiredcap = DesiredCapabilities.internetExplorer();

//DesiredCapabilities desiredCapabilities = firefoxDesiredcap;

DesiredCapabilities desiredCapabilities = chromeDesiredcap;

//String seleniumGridHubURL="http://192.168.102.6:4444/wd/hub";

String seleniumGridHubURL="http://11.23.3.114:4444/wd/hub";

WebDriver webDriver = new RemoteWebDriver(new URL(seleniumGridHubURL), desiredCapabilities);

webDriverTest(webDriver);

}

/**

* 遠端版

* @throws Exception

*/

public static WebDriver getRemoteDriver(String driverType,String seleniumGridHubURL) throws Exception {

DesiredCapabilities desiredCapabilities = null;

if("firefox".equals(driverType.toLowerCase())){

desiredCapabilities = DesiredCapabilities.firefox();

}

else if("chrome".equals(driverType.toLowerCase())){

desiredCapabilities = DesiredCapabilities.chrome();

}

else if("ie".equals(driverType.toLowerCase())){

desiredCapabilities = DesiredCapabilities.internetExplorer();

}

else {

throw new UnsupportedOperationException("尚未支援的型別....");

}

System.out.println("driverType="+driverType+" desiredCapabilities="+desiredCapabilities);

WebDriver webDriver = new RemoteWebDriver(new URL(seleniumGridHubURL), desiredCapabilities);

return webDriver;

}

public static void localWebDriverTest(){

WebDriver driver = getLocalDriver("chrome");//getDriver();

webDriverTest(driver);

}

//http://11.23.3.114:8777/

public static void arcgisTest(WebDriver webDriver, String entryURL) {

try {

try {

webDriver.manage().window().maximize();

}catch(Exception e){

e.printStackTrace();

}

webDriver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);

//driver.manage().timeouts().pageLoadTimeout(20,TimeUnit.SECONDS);

//driver.manage().timeouts().setScriptTimeout(20,TimeUnit.SECONDS);

webDriver.get(entryURL);

Thread.sleep(4000);

System.out.println(entryURL+" 載入成功.");

long step = 100000+System.nanoTime()%100000;

randomMove(webDriver,step);

webDriver.close();

} catch (Exception e) {

e.printStackTrace();

System.exit(1);

}

if (webDriver != null) {

System.out.println("driver!=null");

} else {

System.out.println("driver==null");

}

}

private static void randomMove(WebDriver webDriver,long step){

WebElement plusButton = null;

try {

plusButton = webDriver.findElement(By.xpath("//div[contains(@class,'esriSimpleSliderIncrementButton')]"));

}catch(Exception e){

e.printStackTrace();

}

//WebElement minusButton = webDriver.findElement(By.xpath("//div[contains(@class,'esriSimpleSliderDecrementButton')]"));

for(int i=0;i<step;i++) {

//119.30239300, latitude=26.06971100 福州茶亭公園

//119.30033306347656,26.06078460839844

double fuzhouCenterLongitude=119.30239300;

double fuzhouCenterLatitude=26.06971100;

double longitude=(fuzhouCenterLongitude-0.5)+0.5*Math.random();

double latitude=(fuzhouCenterLatitude-0.2)+0.5*Math.random();

int zoomLevel=1+(int)(Math.random()*8);

String randomMoveJavascript = "m_randomMove("+longitude+","+latitude+","+zoomLevel+");";

waitFor(1000);

if (webDriver instanceof JavascriptExecutor) {

try {

((JavascriptExecutor) webDriver).executeScript(randomMoveJavascript);

}catch(Exception e){

e.printStackTrace();

}

} else {

throw new IllegalStateException("This driver does not support JavaScript!");

}

int maxZoomLevel=12;

int k=1+(int)(Math.random()*maxZoomLevel);

if(plusButton!=null) {

for (int t = 0; t < k; t++) {

plusButton.click();

waitFor(100);

}

}

long timeWaitForInMilliseconds=3000+(long)(Math.random()*2000);

System.out.println("將等待"+timeWaitForInMilliseconds+"毫秒. longitude="+longitude+" latitude="+latitude);

waitFor(timeWaitForInMilliseconds);

}

}

public static void waitFor(long timeInMilliseconds) {

try {

Thread.sleep(timeInMilliseconds);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

public static WebDriver getLocalDriver(String name) {

if ("firefox".equals(name.toLowerCase())) {

return getLocalFireFoxDriver();

}

if ("chrome".equals(name.toLowerCase())) {

return getLocalChromeDriver();

}

return null;

}

public static WebDriver getLocalFireFoxDriver() {

// declaration and instantiation of objects/variables

System.setProperty("webdriver.firefox.marionette", "/Users/happy/server/selenium/firefox/mac/0.21.0/geckodriver");

WebDriver driver = new FirefoxDriver();

return driver;

}

public static WebDriver getLocalChromeDriver() {

System.setProperty("webdriver.chrome.driver", "/Users/happy/server/selenium/chrome/mac/2.40/chromedriver");

WebDriver driver = new ChromeDriver();

return driver;

}

}

相關推薦

Arcgis Server 使用 selenium grid +Java 壓力測試實錄

1.測試思路 建立一臺測試虛擬機器,使用selenium 自動化UI測試方法測試 arcgis 地圖引擎, 驗證200臺終端同時持續的隨機訪問arcgis 伺服器時,arcgis 伺服器是否可以正常服務. Arcgis 伺服器配置: 虛擬機器 Arcgis

JMeter-Java壓力測試工具-02

tab bsp int 測試工具 顯示 有一個 response 結果 ken 這節介紹幾個Listener下面的組件 Aggregate Report-匯總報告 從左到右依次:具有相同標簽的樣本數、一組結果的平均時間、一組結果的中間時間(50%的樣本不超過這個時間)、9

Selenium Grid分布式測試入門詳解

lena 客戶端 odi before ons cycle lean efault 命令 本文對Selenium Grid進行了完整的介紹,從環境準備到使用Selenium Grid進行一次完整的多節點分布式測試。 運行環境為Windows 10,Selenium版本為

java+Selenium+TestNg搭建自動化測試架構(1)實現代碼和數據的分離

bsp bubuko puts 過去 frame 添加 img 通過 ava 1.主要介紹介紹Java+Selenium+POM的自動化測試框架的搭建,第一個首先實現代碼和賬號URL等信息的分離。第二點支持跨瀏覽器,通過讀取配置文件的方式實現。 1)將賬號URL等

Java + Selenium + Appium手機自動化測試

人員 自動化測試 操作系統 find ppi new 世界 auto maven項目 一、啟動Android模擬器(Genymotion俗稱世界上最快的模擬器,可自行百度安裝) 二、啟動Appium(Appium環境安裝可自行百度) 三、安裝應用到Genymotion上,

Java+Maven+selenium+testing+reportNG自動化測試框架

都是 tlist image pub tro snapshot htm sea cells 最近公司新出了一個產品,需要搭建自動化測試框架,這是一個學以至用的好機會,跟上級申請後,決定搭建一個java自動化測試框架。 Java自動化測試對我來講可以說不難不易,因為java是

Java+Selenium Web UI自動化測試的一些小總結

The 隱藏 ase 默認 get over rip cli 不可 - Chrome 關於Chrome的配置網上信息很多,直說一點,當選擇在linux環境跑用例的時候,我們會優先選擇headless run,默認情況下headless run的瀏覽器大小好像只有900*76

docker+selenium Grid搭建自動化分布式測試環境

connect try 資源 created ole sele registry www. web 當自動化測試需要考慮到兼容性的時候,之前的做法是每個執行機上安裝不同版本的瀏覽器,實際上這樣做會很浪費資源,現在有了docker容器化技術,讓一切變得簡單 1、首先安裝一

selenium-java自動化測試環境搭建中的問題以及解決方法

執行如下程式碼,報錯:   package test;   import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver;   public class

selenium-java自動化測試環境搭建

1、jdk環境配置(參見如下地址) https://jingyan.baidu.com/article/6dad5075d1dc40a123e36ea3.html 2、eclipse安裝(略) 3、selenium相關jar包匯入(參見如下地址) https://blog.csdn.net/hszxd

java服務端程式部署伺服器以及壓力測試過程

這段時間負責公司的服務端Java程式開發,做了一個遊戲的登入、註冊、支付、token驗證以及相關統計介面的服務端程式。 考慮到遊戲中如果是多使用者的情況下登入註冊介面在開服的時候會產生很大的併發,所以再上線之前做了一些壓力測試。 伺服器配置:亞馬遜雲伺服器8核心、15G記憶體、200G硬碟、

jmeter壓力測試報錯:java.net.BindException: Address already in use: connect

jmeter壓力測試報錯:java.net.BindException: Address already in use: connect 最近在實現介面壓力測試的時候遇到這樣的一個問題 當執行緒數持續上升到一個點的時候,執行指令碼的時候有很多報錯,如圖: java.net.BindExc

[搬運工系列]-JMeter(二十一)壓力測試-測試Java請求

目錄 一、核心步驟 二、例項 三、JMeter Java Sampler介紹 四、自帶Java Request Sampler   一、核心步驟 1.建立一個Java工程; 2.將JMeter的lib目錄下的jar檔案新增進此工程的Build Path; 3.建立一個類並實現Jav

shell方式telnet方式lua方式java方式壓力測試redis

redis-benchmark執行99999999個命令測試 redis-benchmark -h 192.168.199.190 -p 6382 -n 99999999 redis-benchmark選取88888888個隨機數作為key,執行99999999個set

走進Java介面測試之簡單快速的Mock Server Moco

文章目錄 引言 簡介 原理 使用 約定請求 URI 約定請求 Queries 約定請求 Get 方法 約定請求 Post 方法 約定請求 Headers 約定請求

java程序在經過壓力測試後,系統記憶體佔用比居高不下

JVM記憶體診斷問題:後臺omc系統,經過壓力測試之後,程序佔用的作業系統記憶體比例一直居高不下。懷疑係統可能存在記憶體洩漏。排查思路:確定問題範圍收集問題相關情報根據具體情況,猜測原因猜測原因,並驗證得出結論 問題解決步驟:使用top命令檢視問題程序top - 17

【開發筆記】茶餘飯後:2、Java問題排查(壓力測試效能監控)

       Java效能問題監控排查,主要就是對Java執行緒的堆疊進行分析,這就用到了Thread Dump工具,就是打印出Java應用執行時的堆疊資訊來定位執行步驟中出現的問題。 【記壓力測試關閉其他因素:1、修改java應用的日誌等級;2、必要

運用Jmeter做Java Web壓力測試例項

ROCCOffline Web例項Local Server URL:http://roccoffline.easternphoenix.com流程1.UserLogin  2.Choose BMU  3.SyncLibraryData  4.CreatePerform  5.

【高併發】壓力測試 java.io.IOException: Too many open files解決方案

 對作業系統做相關的設定,增加最大檔案控制代碼數量。Linux在Linux核心2.4.x中需要修改原始碼,然後重新編譯核心才生效。編輯Linux核心原始碼中的 include/linux/fs.h檔案,將 NR_FILE 由8192改為65536,將NR_RESERVED_FILES 由10 改為 128。編

Selenium+Java自動化測試的方法

1.設定等待時間Thread.sleep(2000); (1000代表1s)2.斷言assertion:驗證應用程式的狀態是否同所期望的一致。常見的斷言包括:驗證頁面內容,如標題是否為X或當前位置是否正確,或是驗證該複選框是否被勾選。斷言被用於三種模式: assert 、verify、waitforAsser