欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何使用JMeter完成常用的壓力測試

本篇文章為大家展示了如何使用JMeter完成常用的壓力測試,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作與策劃設(shè)計(jì),古城網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:古城等地區(qū)。古城做網(wǎng)站價(jià)格咨詢:13518219792

使用 JMeter 完成常用的壓力測試

這里介紹了 JMeter 相關(guān)的基本概念。并以 JMeter 為例,介紹了使用它來完成最常用的三種類型服務(wù)器,即 Web 服務(wù)器、數(shù)據(jù)庫服務(wù)器和消息中間件,壓力測試的方法、步驟以及注意事項(xiàng)。   

概述

JMeter 最早是為了測試 Tomcat 的前身 JServ 的執(zhí)行效率而誕生的。到目前為止,它的最新版本是2.1.1,它的測試能力也不再僅僅只局限于對于Web服務(wù)器的測試,而是涵蓋了數(shù)據(jù)庫、JMS、Web Service、LDAP等多種對象的測試能力。在最新的 2.1.1 中,它還提供了對于 JUNIT 的測試。

JMeter 的安裝非常簡單,從官方網(wǎng)站上下載,解壓之后即可使用。運(yùn)行命令在%JMETER_HOME%/bin 下,對于 Windows 用戶來說,命令是 jmeter.bat。運(yùn)行前請檢查JMeter 的文檔,查看是否具備相關(guān)的運(yùn)行條件。對于最新版(即2.1.1),需要JDK的版本要求是JDK 1.4。

JMeter 的主要測試組件總結(jié)如下:

1. 測試計(jì)劃是使用 JMeter 進(jìn)行測試的起點(diǎn),它是其它 JMeter 測試元件的容器。

2. 線程組代表一定數(shù)量的并發(fā)用戶,它可以用來模擬并發(fā)用戶發(fā)送請求。實(shí)際的請求內(nèi)容在Sampler中定義,它被線程組包含。

3. 監(jiān)聽器負(fù)責(zé)收集測試結(jié)果,同時(shí)也被告知了結(jié)果顯示的方式。

4. 邏輯控制器可以自定義JMeter發(fā)送請求的行為邏輯,它與Sampler結(jié)合使用可以模擬復(fù)雜的請求序列。

5. 斷言可以用來判斷請求響應(yīng)的結(jié)果是否如用戶所期望的。它可以用來隔離問題域,即在確保功能正確的前提下執(zhí)行壓力測試。這個(gè)限制對于有效的測試是非常有用的。

6. 配置元件維護(hù)Sampler需要的配置信息,并根據(jù)實(shí)際的需要會修改請求的內(nèi)容。

7. 前置處理器和后置處理器負(fù)責(zé)在生成請求之前和之后完成工作。前置處理器常常用來修改請求的設(shè)置,后置處理器則常常用來處理響應(yīng)的數(shù)據(jù)。

8. 定時(shí)器負(fù)責(zé)定義請求之間的延遲間隔。

JMeter的使用非常的容易,在 ONJava.com 上的文章 Using JMeter 提供了一個(gè)非常好的入門。

常用測試

壓力測試不同于功能測試,軟件的正確性并不是它的測試重點(diǎn)。它所看重的是軟件的執(zhí)行效率,尤其是短時(shí)間內(nèi)訪問用戶數(shù)爆炸性增長時(shí)軟件的響應(yīng)速度,壓力測試往往是在功能測試之后進(jìn)行的。在實(shí)際的開發(fā)過程中,軟件潛在的效率瓶頸一般都是那些可能有多個(gè)用戶同時(shí)訪問的節(jié)點(diǎn)。

就目前 Java EE 的平臺下開發(fā)的軟件來說,這種節(jié)點(diǎn)通??赡苁牵篧eb 服務(wù)器、數(shù)據(jù)庫服務(wù)器和 JMS 服務(wù)器。它們都是請求主要發(fā)生的地點(diǎn),請求頻率較其它的節(jié)點(diǎn)要高,而且處于請求序列的關(guān)鍵路徑之上。如果它們效率無法提高的話,對于整個(gè)軟件的效率有致命的影響。而且在這些節(jié)點(diǎn)上一般都會發(fā)生較大規(guī)模的數(shù)據(jù)交換,有時(shí)其中還包含有業(yè)務(wù)邏輯處理,它們正是在進(jìn)行壓力測試時(shí)首先需要考慮的。

本文以這三種節(jié)點(diǎn)為例,介紹如何使用 JMeter 來完成針對于它們的壓力測試。

Web 服務(wù)器

對于大多數(shù)的項(xiàng)目來說,并不會自行開發(fā)一個(gè)Web服務(wù)器,因此Web服務(wù)器壓力測試的對象實(shí)際就是--發(fā)布到Web服務(wù)器中的軟件。最簡單的Web測試計(jì)劃只需要三個(gè) JMeter 的測試元件,如下圖:

如何使用JMeter完成常用的壓力測試

其中:

  • 在線程組中定義線程數(shù)、產(chǎn)生線程發(fā)生的時(shí)間和測試循環(huán)次數(shù)。

  • 在http請求中定義服務(wù)器、端口、協(xié)議和方法、請求路徑等。

  • 表格監(jiān)聽器負(fù)責(zé)收集和顯示結(jié)果。

這種設(shè)置對于包含了安全機(jī)制的 web 應(yīng)用是不夠的,典型的 web 應(yīng)用一般都會:

1. 有一個(gè)登錄頁,它是整個(gè)應(yīng)用的入口。當(dāng)用戶登錄之后,應(yīng)用會將用戶相關(guān)的安全信息放到 session 中。

2. 有一個(gè) filter,它攔截請求,檢查每個(gè)請求相關(guān)的 session 中是否包含有用戶安全信息。如果沒有,那么請求被重定向到登錄頁,要求用戶提供安全信息。

在這種配置下應(yīng)用上面的測試計(jì)劃,那么除了登錄頁之外的其它請求都將因?yàn)槿鄙儆脩舭踩畔?,而使請求?shí)際定位到登錄頁。如果不加斷言,那么在監(jiān)聽器看來所有的請求都是成功。而實(shí)際上,這些請求最終都沒有到達(dá)它們應(yīng)該去的地方。顯然,這種測試結(jié)果不是我們所期望的。

為了成功的測試,至少有2種方法:

  • 方法一,去掉程序的安全設(shè)置,如filter,使得不需要用戶安全信息也能訪問受限內(nèi)容;

  • 方法二,不修改程序,使用JMeter提供的"Http URL重寫修飾符"或"Http Cookie管理器"。

對于第一種方法,有其局限性:

  • 需要修改程序配置,如去掉web.xml中關(guān)于安全filter的設(shè)置。需要維護(hù)多個(gè)版本的web.xml,如壓力測試和功能測試分別各自的web.xml,增加了維護(hù)成本,而且有可能會在測試之后忘記將web.xml修改回來。

  • 對于一些需要用戶安全信息的頁面無能為力,如某些業(yè)務(wù)審計(jì)操作需要用戶安全信息來記錄。因?yàn)槿鄙龠@樣的信息,注定了測試的失敗。如果解決為了這個(gè)問題進(jìn)一步的修改程序,那么因?yàn)榇嬖诙鄠€(gè)版本的程序,那么其維護(hù)難度將大大增加。

雖然,第二種方法配置難度增加了,但是它不用修改程序。而且還可將測試計(jì)劃保存成文件,以便重復(fù)使用。因此,選用第二種方法是較為理想的做法。下面以一個(gè)簡化的例子說明使用方法二的配置步驟。

1. 例子由以下幾個(gè)文件組成:

  • AuthorizenFilter.java,過濾器負(fù)責(zé)檢驗(yàn)session中是否存在用戶信息。如果沒有,那么就轉(zhuǎn)向到 login.jsp。它的主要方法 doFilter 內(nèi)容如下:

    public void doFilter(ServletRequest request,
                         ServletResponse response,
                         FilterChain chain)
                         throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse res = (HttpServletResponse)response;
        HttpSession session= req.getSession();
        User user = (User)session.getAttribute("user");
        if(null == user){
            String uri= req.getRequestURI();
            //如果請求頁是登錄頁,不轉(zhuǎn)向
            if( uri.equalsIgnoreCase("/gWeb/login.jsp")){
                chain.doFilter(request, response);
    		} else{
                res.sendRedirect("/gWeb/login.jsp");
    		}
    	}else{
            chain.doFilter(request, response);
        }    
    }

           

  • User.java,用戶類負(fù)責(zé)記錄用戶的信息。為了簡化,這里的登錄操作只允許指定用戶名和密碼。主要內(nèi)容如下:

    public class User {
    	private String user;
    	private String pwd;
    	public User(String user, String pwd) {
    		this.user = user;
    		this.pwd = pwd;
    	}
    	public boolean login(){
    		return user.equals("foxgem") && pwd.equals("12345678");
    	}
    	public String getUser() {
    		return user;
    	}
    	public void setUser(String user) {
    		this.user = user;
    	}
    }

           

  • Login.jsp 和welcome.jsp。其中 login.jsp 負(fù)責(zé)生成 User 對象,并調(diào)用 User 的login。當(dāng) login 返回為 true 時(shí)轉(zhuǎn)向到 welcome.jsp。其驗(yàn)證部分的代碼:

    <%
      if( request.getParameter("Submit") != null) {
    	  User ur= new User( request.getParameter("user"), request.getParameter("pwd"));
          if( ur.login()){
      	     session.setAttribute("user", ur);
             response.sendRedirect("/gWeb/welcome.jsp");
          } else{
             session.setAttribute( "LOGIN_ERROR_MSG", 
    "無效的用戶,可能原因:用戶不存在或被禁用。");
             response.sendRedirect("/gWeb/index.jsp");
             return;
          }
      }
    %>

           

  • web.xml,配置 filter 攔截所有訪問 JSP 頁面的請求:

    <filter>
        <filter-name>authorizen</filter-name>
        <filter-class>org.foxgem.jmeter.AuthorizenFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>authorizen</filter-name>
    	<url-pattern>*.jsp</url-pattern>
    </filter-mapping>

           

2. 創(chuàng)建如下結(jié)構(gòu)的Web測試計(jì)劃:

如何使用JMeter完成常用的壓力測試

其中主要測試元件說明如下:

  • http請求默認(rèn)值負(fù)責(zé)記錄請求的默認(rèn)值,如服務(wù)器、協(xié)議、端口等。

  • 第一個(gè)http請求,請求login.jsp,并附加驗(yàn)證所需要的參數(shù)(user=foxgem,pwd=12345678,Submit=Submit);其包含的響應(yīng)斷言驗(yàn)證url中包含"welcome.jsp",這一點(diǎn)可以從程序中反應(yīng)。

  • 第二個(gè)http請求,請求是welcome.jsp;其包含的響應(yīng)斷言驗(yàn)證響應(yīng)文本中包含"foxgem",它是welcome.jsp頁面邏輯的一部分。

  • http cookie管理器負(fù)責(zé)管理整個(gè)測試過程中使用的cookie,它不需要設(shè)置任何屬性。

  • 循環(huán)控制器設(shè)置發(fā)送第二個(gè)請求的循環(huán)次數(shù),表格監(jiān)聽器負(fù)責(zé)收集和顯示第二個(gè)請求的測試結(jié)果。

啟動測試計(jì)劃之后,執(zhí)行的順序是:首先,第一個(gè)請求登錄頁進(jìn)行登錄;成功登錄之后,使用循環(huán)控制器執(zhí)行第二個(gè)請求。請求welcome.jsp時(shí),響應(yīng)斷言用來驗(yàn)證是否確實(shí)是welocme.jsp來處理請求,而不是因?yàn)槠渌?。在這個(gè)測試計(jì)劃中需要注意的是http cookie管理器。正是由于它的作用,使得第二個(gè)請求能順利的發(fā)送到welcome.jsp進(jìn)行處理,而不是因?yàn)槿鄙儆脩舭踩畔⑥D(zhuǎn)發(fā)到login.jsp。

在這個(gè)例子中,我們并沒有在程序中使用cookie(使用的是session),那么http cookie管理器怎么會起作用呢?這是因?yàn)樵趕ervlet/jsp規(guī)范中對于session的狀態(tài)跟蹤有2種方式:

  • 使用cookie,保留和傳遞sessionid。它不要求程序?qū)τ趗rl有什么特殊的處理,但是要求瀏覽器允許cookie。在這個(gè)例子中,就是這種情形。

  • 使用url重寫,每次顯式的在瀏覽器和服務(wù)器之間傳遞sessionid。它要求程序?qū)rl進(jìn)行編碼,對瀏覽器沒有要求。

對于第二種情形,可以使用JMeter前置管理器中的http url重寫修飾符來完成。對于Tomcat,Session參數(shù)是jsessionid,路徑擴(kuò)展使用";"。使用url編碼時(shí)需要注意,必須將瀏覽器的cookie功能關(guān)閉。因?yàn)閡rl編碼函數(shù),如encodeURL,會判斷是否需要將sessionid編碼到url中。當(dāng)瀏覽器允許cookie時(shí),就不會進(jìn)行編碼。

如果cookie而不是session來保存用戶安全信息,那么直接使用http cookie管理器就行了。此時(shí),需要將使用的cookie參數(shù)和值直接寫到管理器中,由它負(fù)責(zé)管理。對于其它的cookie使用,也是如此操作。

登錄問題解決之后,對于 Web 服務(wù)器的測試就沒什么難點(diǎn)了。剩下的就是根據(jù)實(shí)際需要,靈活運(yùn)用相關(guān)的測試組件搭建編寫的測試計(jì)劃。(當(dāng)然,對于安全問題還有其它的使用情景。在使用時(shí)需要明確:JMeter 是否支持,如果支持使用哪種測試組件解決。)

數(shù)據(jù)庫服務(wù)器

數(shù)據(jù)庫服務(wù)器在大多數(shù)企業(yè)項(xiàng)目中是不可缺少的,對于它進(jìn)行壓力測試是為了找出:數(shù)據(jù)庫對象是否可以有效地承受來自多個(gè)用戶的訪問。這些對象主要是:索引、觸發(fā)器、存儲過程和鎖。通過對于SQL語句和存儲過程的測試,JMeter 可以間接的反應(yīng)數(shù)據(jù)庫對象是否需要優(yōu)化。

JMeter 使用 JDBC 發(fā)送請求,完成對于數(shù)據(jù)庫的測試。一個(gè)數(shù)據(jù)庫測試計(jì)劃,建立如下結(jié)構(gòu)即可:

如何使用JMeter完成常用的壓力測試

其中:

  • JDBC連接配置,負(fù)責(zé)配置數(shù)據(jù)庫連接相關(guān)的信息。如:數(shù)據(jù)庫url、數(shù)據(jù)庫驅(qū)動類名、用戶名和密碼等等。在這些配置中,"綁定到池的變量名"(Variable Name Bound to Pool)是一個(gè)非常重要的屬性,這個(gè)屬性會在JDBC請求中被引用。通過它, JDBC請求和JDBC連接配置建立關(guān)聯(lián)。(測試前,請將所需要的數(shù)據(jù)庫驅(qū)動放到JMeter的classpath中)。

  • JDBC請求,負(fù)責(zé)發(fā)送請求進(jìn)行測試。

  • 圖形結(jié)果,收集顯示測試結(jié)果。

在實(shí)際的項(xiàng)目中,至少有2種類型的JDBC請求需要關(guān)注:select語句和存儲過程。前者反應(yīng)了select語句是否高效,以及表的索引等是否需要優(yōu)化;后者則是反應(yīng)存儲過程的算法是否高效。它們?nèi)绻实拖?,必然會帶來響?yīng)上的不盡如人意。對于這兩種請求,JDBC請求的配置略有區(qū)別:

  • Select語句

如何使用JMeter完成常用的壓力測試
  • 存儲過程

如何使用JMeter完成常用的壓力測試

如果對于Oracle,如果測試的是函數(shù),那么也可以使用select語句來進(jìn)行配置,此時(shí)可以使用:select 函數(shù)(入?yún)? from dual形式的語句來測試,其中dual是oracle的關(guān)鍵字,表示啞表。對于其它廠商的數(shù)據(jù)庫產(chǎn)品,請查找手冊。

JMS服務(wù)器

MOM 作為消息數(shù)據(jù)交換的平臺,也是影響應(yīng)用執(zhí)行效率的潛在環(huán)節(jié)。在 Java 程序中,是通過 JMS 與 MOM 進(jìn)行交互的。作為 Java 實(shí)現(xiàn)的壓力測試工具,JMeter 也能使用 JMS 對應(yīng)用的消息交換和相關(guān)的數(shù)據(jù)處理能力進(jìn)行測試。這一點(diǎn)應(yīng)該不難理解,因?yàn)樵谡麄€(gè)測試過程中,JMeter 測試的重點(diǎn)應(yīng)該是消息的產(chǎn)生者和消費(fèi)者的本身能力,而不是 MOM本身。

根據(jù) JMS 規(guī)范,消息交換有2種方式:發(fā)布/訂閱和點(diǎn)對點(diǎn)。JMeter針對這兩種情形,分別提供了不同的Sampler進(jìn)行支持。以下MOM我們使用ActiveMQ 3.2.1,分別描述這兩種消息交換方式是如何使用 JMeter 進(jìn)行測試。

1. 測試前的準(zhǔn)備(兩種情況都適用)

JMeter 雖然能使用 JMS 對 MOM 進(jìn)行測試,但是它本身并沒有提供JMS需要使用的包。因此,在測試之前需要將這些包復(fù)制到 %JMETER_HOME%/lib 下。對于 ActiveMQ 來說,就是復(fù)制 %ACTIVEMQ_HOME%/lib。%ACTIVEMQ_HOME%/optional 是可選包,可根據(jù)實(shí)際情況來考慮是否復(fù)制。

JMeter 在測試時(shí)使用了 JNDI,為了提供 JNDI 提供者的信息,需要提供 jndi.properties。同時(shí)需要將 jndi.properties 放到 JMeter 的 classpath 中,建議將它與 bin下的 ApacheJMeter.jar 打包在一起。對于 ActiveMQ,jndi.properties 的示例內(nèi)容如下:

java.naming.factory.initial = org.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616

#指定connectionFactory的jndi名字,多個(gè)名字之間可以逗號分隔。
#以下為例:
#對于topic,使用(TopicConnectionFactory)context.lookup("connectionFactry")
#對于queue,(QueueConnectionFactory)context.lookup("connectionFactory")
connectionFactoryNames = connectionFactory

#注冊queue,格式:
#queue.[jndiName] = [physicalName]
#使用時(shí):(Queue)context.lookup("jndiName"),此處是MyQueue
queue.MyQueue = example.MyQueue

#注冊topic,格式:
# topic.[jndiName] = [physicalName]
#使用時(shí):(Topic)context.lookup("jndiName"),此處是MyTopic
topic.MyTopic = example.MyTopic

     

2. 發(fā)布/訂閱

在實(shí)際測試時(shí),發(fā)布者和訂閱者并不是需要同時(shí)出現(xiàn)的。例如,有時(shí)我們可能想測試單位時(shí)間內(nèi)消息發(fā)布者的消息產(chǎn)生量,此時(shí)就不需要消息發(fā)布者,只需要訂閱者就可以了。本例為了說明這兩種Sampler的使用,因此建立如下的測試計(jì)劃:

如何使用JMeter完成常用的壓力測試

其中JMS Publisher和JMS Subscriber的屬性:選擇"使用jndi.properties",連接工廠是connectionFactory,主題是MyTopic,其它使用默認(rèn)配置。對于JMS Publisher,還需提供測試用的文本消息。

啟動ActiveMQ,運(yùn)行測試計(jì)劃。如果配置正確,那么與ActiveMQ成功連接之后,在JMeter的后臺會打印出相關(guān)信息。在測試過程中,JMeter 后臺打印可能會出現(xiàn)java.lang.InterruptedException 信息,這個(gè)是正?,F(xiàn)象,不會影響測試過程和結(jié)果。這一點(diǎn)可以從 bin 下的 jmeter.log 看出。

3. 點(diǎn)對點(diǎn)

對于點(diǎn)對點(diǎn),JMeter只提供了一種Sampler:JMS Point-to-Point。在例子中,建立如下圖的測試計(jì)劃:

如何使用JMeter完成常用的壓力測試

其中:Communication style是Request Only。對于另一種風(fēng)格:Request Response,會驗(yàn)證收到消息的JMS Header中的JMSCorrelationID,以判斷是否是對請求消息的響應(yīng)。

上述內(nèi)容就是如何使用JMeter完成常用的壓力測試,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站欄目:如何使用JMeter完成常用的壓力測試
網(wǎng)站地址:http://aaarwkj.com/article36/gjdesg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作商城網(wǎng)站、微信公眾號ChatGPT、電子商務(wù)、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
婷婷中文字幕在线不卡视频 | 蜜桃臀视频一区二区三区| 日韩精品91一区二区| 日本不卡视频二区三区| 成人黄片免费在线播放| 久娜娜精品视频在线观看| 久久精品性少妇一区=区三区| 公交车上没穿内裤被插高潮不断| 日本不卡一区二区三区四| 久久最新视频中文字幕| 久久视频在线播放视频| 亚洲av成人免费在线| 亚洲激情精品成人在线| 欧美日韩美足一区二区| 免费国产成人在线视频| 亚洲午夜精品理论在线不卡| 国产激情视频在线观看你懂的| 久久亚洲第一视频网站| 国产黄色免费精品网站| av熟妇人妻一区二区三区| 国产婷婷综合一区二区| 91精品人妻二区三区| 丝袜美腿精尽福利视频网址大全 | 涩五月婷婷开心中文字幕| 91久久一区二区秋霞免费| 亚洲一区二区精品91眼镜| 欧美激情网页一区三区| 91在线人妻一区二区三区| 精品国产乱码一区二区三区| av天堂午夜在线观看| 久久99精品国产99久久无| 人妻丝袜中文字幕在线| 四虎永久精品国产毛片| 日韩欧美在线一区二区| 亚洲精品国产精品乱码不| 欧美精品日本一区二区| 国产成人精品手机在线观看| 97高清视频在线观看| 免费观看在线黄色大片| 国产激情久久久久久久久久久| 婷婷综合伊人久久狠狠|