性能測試連載 (11)-jmeter 下的 webdriver 驅動,模擬真實用戶場景


https://pan.baidu.com/s/1df1HDkFzChYNAbsSazizpw 提取碼:hhn7
jmeter 全系列文檔資料

https://pan.baidu.com/s/1rD3H9EGbu0u11E8ofpAl3A 提取碼:8q65
性能測試初級到高級系列資料

概述

我們在做性能測試的時候,不同的視角看到的結果都不一樣
例如響應時間

用戶通過客戶端向服務端發出請求的時間為: T1
服務端接收到請求,處理該請求的時間為:T2
服務端返回數據給客戶端時間為: T3
客戶端接收到響應數據,處理數據呈現給用戶時間為:T4

從系統視角來看:
系統的響應時間 Ts= T1+T2+T3。該時間沒有包括客戶端對數據處理並呈現的時間 T4

從用戶視角來看:
用戶眼中的的響應時間:Tu = T1+T2+T3+T4。用戶通過客戶端發出業務請求,到客戶端展現相應的請求結果,這個過程的時間越短越好

從服務器視角來看:
服務器接收到客戶端發送的請求,並給出響應,這個過程所消耗的時間為響應時間,即服務器僅關注 T2

從不同的視角下,衡量響應時間的指標也各不相同。在實際測試過程中,要明確以什么視角驗證被測對象的性能。
大多數情況下,我們用 jmeter 做性能測試的響應時間都以用戶視角去看待。

那么我們在性能測試的過程中,想要獲取用戶的真實體驗數據,就要盡可能的去模擬用戶的真實使用場景。

什么是真實用戶場景?比如一個用戶登錄,用戶想要執行登錄,首先要打開登錄頁面,然后輸入用戶名密碼,點擊登錄,直到登錄加載完成。這一系列的操作中,有很多靜態資源需要加載,比如 css,js,jpg 等等。這些靜態資源也是需要響應時間的,都需要消耗資源。那么我們在性能測試中就必須把這些東西統計進去。

詳細描述

jmeter 中有四種加載 html 資源的方法

一:請求中加載靜態資源

GET 請求下,在 Sampler-Advanced 中,勾選獲取所有內含的資源。發送請求之后,可以在結果樹中看到所有加載的靜態資源

 

 

 

二:發送並行請求( Parallel HTTP Requests)

在並行請求中,可以同時發送很多個 sampler(get 請求)。結果樹中會自動加載所有靜態資源。

 

 

 

三:通過抓包的方式,抓取所有的靜態資源

我們可以通過抓包獲取到所有頁面的靜態資源,統一放在事物控制器下面。事物控制器會把所有的靜態資源消耗的時間整合在一起,聚合報告中會看到合並后的性能數據

四:Chrome Driver 驅動瀏覽器

通過 Chrome Driver 得出的性能數據更加貼近真實使用場景,准確度和可信度更高。jmeter 會把我們瀏覽器驅動中的所有操作當做一個完整的事物。在聚合報告中可以看到一個完整的事物響應時間。

 

 

try { var pkg = JavaImporter(org.openqa.selenium, org.openqa.selenium.support.ui) ##此處是導入support.ui的類對應的是selenium-support.jar WDS.log.info('WDS Name:' + WDS.name) WDS.sampleResult.sampleStart() WDS.browser.navigate().to("https://qas.cttq.com") ##調用navigate方法跳轉url對應的方法在selenium-remote-driver.jar中 WDS.log.info('Browser Title:' + WDS.browser.getTitle()) ##調用getTitle方法捕捉title對應的方法在selenium-remote-driver.jar中 WDS.log.info('Browser CurrentUrl:' + WDS.browser.getCurrentUrl()) WDS.log.info('Cookie:' + WDS.browser.manage().getCookies()) WDS.log.info('Request Header: ' + WDS.sampleResult.getRequestHeaders()) var what = WDS.browser.findElement(pkg.By.name('username')) what.sendKeys(['8107000']) ##定位name元素觸發sendKeys事件填寫登錄名 var where = WDS.browser.findElement(pkg.By.name('password')) where.sendKeys(['000000']) ##定位name元素觸發sendKeys事件填寫登錄名 var button = WDS.browser.findElement(pkg.By.id('login-btn')) button.click() ##定位id元素觸發click事件點擊登錄 ##上面調用的幾種封裝元素和事件對應的方法在selenium-remote-driver.jar中 var wait = new pkg.WebDriverWait(WDS.browser, 5000) ##調用了WebDriverWait對應的方法在selenium-support.jar中數值為ms wait.until(pkg.ExpectedConditions.presenceOfElementLocated(pkg.By.xpath("/html/body/div/header/div[1]/div/img"))) ##調用前面的wait 5s強制等待元素出現 var results = WDS.browser.findElements(pkg.By.xpath("/html/body/div/header/div[1]/div/img")) WDS.log.info('Result: ' + results) if(results.empty) { WDS.sampleResult.successful = false WDS.sampleResult.responseMessage = 登錄失敗} else{WDS.log.info("登錄")} ##斷言元素是否捕捉成功 WDS.sampleResult.sampleEnd() } catch(ex) { WDS.log.error(ex) WDS.sampleResult.successful = false WDS.sampleResult.responseMessage = 'There were no results returned' WDS.sampleResult.sampleEnd() } 

 

 

但是這種 Chrome Driver 的方式在負載測試中有一個弊端

 

那就是,系統會根據你的線程數去啟動瀏覽器。也就是說你設置了多少線程,它就會啟動多少瀏覽器。這樣一樣,機器內存瞬間就會被消耗掉

那么我們能不能像 loadrunner 一樣,即使不啟動瀏覽器,也可以模擬出瀏覽器的效果?答案是可以的。

jmeter 中提供了selenium gird和htmlunit兩種方案可以達到這種效果。
點擊傳送門:jmeter 與 java_selenium 自動化


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM