<ruby id="rxdll"></ruby><strike id="rxdll"></strike>

    <rp id="rxdll"></rp>
      <del id="rxdll"><meter id="rxdll"></meter></del>
      <pre id="rxdll"><font id="rxdll"></font></pre>
        <pre id="rxdll"></pre>
      <p id="rxdll"><thead id="rxdll"></thead></p><dl id="rxdll"><progress id="rxdll"><form id="rxdll"></form></progress></dl>

      <ol id="rxdll"><thead id="rxdll"><track id="rxdll"></track></thead></ol>
      <i id="rxdll"><dfn id="rxdll"></dfn></i>
      <font id="rxdll"><meter id="rxdll"></meter></font>

        <mark id="rxdll"><dfn id="rxdll"></dfn></mark>
        • 軟件測試技術
        • 軟件測試博客
        • 軟件測試視頻
        • 開源軟件測試技術
        • 軟件測試論壇
        • 軟件測試沙龍
        • 軟件測試資料下載
        • 軟件測試雜志
        • 軟件測試人才招聘
          暫時沒有公告

        字號: | 推薦給好友 上一篇 | 下一篇

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

        發布: 2007-5-31 17:24 | 作者: 網絡轉載 | 來源: 網絡 | 查看: 316次 | 進入軟件測試論壇討論

        領測軟件測試網  本文介紹了 JMeter 相關的基本概念。并以 JMeter 為例,介紹了使用它來完成最常用的三種類型服務器,即 Web 服務器、數據庫服務器和消息中間件,壓力測試的方法、步驟以及注意事項。

         講到測試,人們腦海中首先浮現的就是針對軟件正確性的測試,即常說的功能測試。但是軟件僅僅只是功能正確是不夠的。在實際開發中,還有其它的非功能因素也起著決定性的因素,例如軟件的響應速度。影響軟件響應速度的因素有很多,有些是因為算法不夠高效;還有些可能受用戶并發數的影響。

        在眾多類型的軟件測試中,壓力測試正是以軟件響應速度為測試目標,尤其是針對在較短時間內大量并發用戶的訪問時,軟件的抗壓能力。本文以 JMeter 為例,介紹了如何使用它來完成常用的壓力測試:Web 測試、數據庫測試和 JMS 測試。

        概述

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

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

        JMeter 的主要測試組件總結如下:

        1. 測試計劃是使用 JMeter 進行測試的起點,它是其它 JMeter 測試元件的容器。

        2. 線程組代表一定數量的并發用戶,它可以用來模擬并發用戶發送請求。實際的請求內容在Sampler中定義,它被線程組包含。

        3. 監聽器負責收集測試結果,同時也被告知了結果顯示的方式。

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

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

        6. 配置元件維護Sampler需要的配置信息,并根據實際的需要會修改請求的內容。

        7. 前置處理器和后置處理器負責在生成請求之前和之后完成工作。前置處理器常常用來修改請求的設置,后置處理器則常常用來處理響應的數據。

        8. 定時器負責定義請求之間的延遲間隔。

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

        回頁首

         常用測試

        壓力測試不同于功能測試,軟件的正確性并不是它的測試重點。它所看重的是軟件的執行效率,尤其是短時間內訪問用戶數爆炸性增長時軟件的響應速度,壓力測試往往是在功能測試之后進行的。在實際的開發過程中,軟件潛在的效率瓶頸一般都是那些可能有多個用戶同時訪問的節點。

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

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

        Web 服務器

        對于大多數的項目來說,并不會自行開發一個Web服務器,因此Web服務器壓力測試的對象實際就是--發布到Web服務器中的軟件。最簡單的Web測試計劃只需要三個 JMeter 的測試元件,如下圖:


         其中:

        • 在線程組中定義線程數、產生線程發生的時間和測試循環次數。
        • 在http請求中定義服務器、端口、協議和方法、請求路徑等。
        • 表格監聽器負責收集和顯示結果。

        這種設置對于包含了安全機制的 web 應用是不夠的,典型的 web 應用一般都會:

         1. 有一個登錄頁,它是整個應用的入口。當用戶登錄之后,應用會將用戶相關的安全信息放到 session 中。
         2. 有一個 filter,它攔截請求,檢查每個請求相關的 session 中是否包含有用戶安全信息。

         如果沒有,那么請求被重定向到登錄頁,要求用戶提供安全信息。

         在這種配置下應用上面的測試計劃,那么除了登錄頁之外的其它請求都將因為缺少用戶安全信息,而使請求實際定位到登錄頁。如果不加斷言,那么在監聽器看來所有的請求都是成功。而實際上,這些請求最終都沒有到達它們應該去的地方。顯然,這種測試結果不是我們所期望的。

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

        • 方法一,去掉程序的安全設置,如filter,使得不需要用戶安全信息也能訪問受限內容;
        • 方法二,不修改程序,使用JMeter提供的"Http URL重寫修飾符"或"Http Cookie管理器"。
         對于第一種方法,有其局限性:

        • 需要修改程序配置,如去掉web.xml中關于安全filter的設置。需要維護多個版本的web.xml,如壓力測試和功能測試分別各自的web.xml,增加了維護成本,而且有可能會在測試之后忘記將web.xml修改回來。
        • 對于一些需要用戶安全信息的頁面無能為力,如某些業務審計操作需要用戶安全信息來記錄。因為缺少這樣的信息,注定了測試的失敗。如果解決為了這個問題進一步的修改程序,那么因為存在多個版本的程序,那么其維護難度將大大增加。
         雖然,第二種方法配置難度增加了,但是它不用修改程序。而且還可將測試計劃保存成文件,以便重復使用。因此,選用第二種方法是較為理想的做法。下面以一個簡化的例子說明使用方法二的配置步驟。

        1. 例子由以下幾個文件組成:

        AuthorizenFilter.java,過濾器負責檢驗session中是否存在用戶信息。如果沒有,那么就轉向到 login.jsp。它的主要方法 doFilter 內容如下:

        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();
        //如果請求頁是登錄頁,不轉向
        if( uri.equalsIgnoreCase("/gWeb/login.jsp")){
        chain.doFilter(request, response);
        } else{
        res.sendRedirect("/gWeb/login.jsp");
        }
        }else{
        chain.doFilter(request, response);
        }
        }

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

        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 負責生成 User 對象,并調用 User 的login。當 login 返回為 true 時轉向到 welcome.jsp。其驗證部分的代碼:

        <%
        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. 創建如下結構的Web測試計劃:

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

        • http請求默認值負責記錄請求的默認值,如服務器、協議、端口等。
        • 第一個http請求,請求login.jsp,并附加驗證所需要的參數(user=foxgem,pwd=12345678,Submit=Submit);其包含的響應斷言驗證url中包含"welcome.jsp",這一點可以從程序中反應。
        • 第二個http請求,請求是welcome.jsp;其包含的響應斷言驗證響應文本中包含"foxgem",它是welcome.jsp頁面邏輯的一部分。
        • http cookie管理器負責管理整個測試過程中使用的cookie,它不需要設置任何屬性。
        • 循環控制器設置發送第二個請求的循環次數,表格監聽器負責收集和顯示第二個請求的測試結果。               

        啟動測試計劃之后,執行的順序是:首先,第一個請求登錄頁進行登錄;成功登錄之后,使用循環控制器執行第二個請求。請求welcome.jsp時,響應斷言用來驗證是否確實是welocme.jsp來處理請求,而不是因為其它頁。在這個測試計劃中需要注意的是http cookie管理器。正是由于它的作用,使得第二個請求能順利的發送到welcome.jsp進行處理,而不是因為缺少用戶安全信息轉發到login.jsp。

        在這個例子中,我們并沒有在程序中使用cookie(使用的是session),那么http cookie管理器怎么會起作用呢?這是因為在servlet/jsp規范中對于session的狀態跟蹤有2種方式:

        • 使用cookie,保留和傳遞sessionid。它不要求程序對于url有什么特殊的處理,但是要求瀏覽器允許cookie。在這個例子中,就是這種情形。
        • 使用url重寫,每次顯式的在瀏覽器和服務器之間傳遞sessionid。它要求程序對url進行編碼,對瀏覽器沒有要求。
         對于第二種情形,可以使用JMeter前置管理器中的http url重寫修飾符來完成。對于Tomcat,Session參數是jsessionid,路徑擴展使用";"。使用url編碼時需要注意,必須將瀏覽器的cookie功能關閉。因為url編碼函數,如encodeURL,會判斷是否需要將sessionid編碼到url中。當瀏覽器允許cookie時,就不會進行編碼。

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

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

          數據庫服務器

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

          JMeter 使用 JDBC 發送請求,完成對于數據庫的測試。一個數據庫測試計劃,建立如下結構即可:


           其中:

          • JDBC連接配置,負責配置數據庫連接相關的信息。如:數據庫url、數據庫驅動類名、用戶名和密碼等等。在這些配置中,"綁定到池的變量名"(Variable Name Bound to Pool)是一個非常重要的屬性,這個屬性會在JDBC請求中被引用。通過它, JDBC請求和JDBC連接配置建立關聯。(測試前,請將所需要的數據庫驅動放到JMeter的classpath中)。
          • JDBC請求,負責發送請求進行測試。
          • 圖形結果,收集顯示測試結果。
           在實際的項目中,至少有2種類型的JDBC請求需要關注:select語句和存儲過程。前者反應了select語句是否高效,以及表的索引等是否需要優化;后者則是反應存儲過程的算法是否高效。它們如果效率低下,必然會帶來響應上的不盡如人意。對于這兩種請求,JDBC請求的配置略有區別:
          • Select語句

          • 存儲過程

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

          JMS服務器

          MOM 作為消息數據交換的平臺,也是影響應用執行效率的潛在環節。在 Java 程序中,是通過 JMS 與 MOM 進行交互的。作為 Java 實現的壓力測試工具,JMeter 也能使用 JMS 對應用的消息交換和相關的數據處理能力進行測試。這一點應該不難理解,因為在整個測試過程中,JMeter 測試的重點應該是消息的產生者和消費者的本身能力,而不是 MOM本身。

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

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

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

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

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

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

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

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

          2. 發布/訂閱

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



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

          啟動ActiveMQ,運行測試計劃。如果配置正確,那么與ActiveMQ成功連接之后,在JMeter的后臺會打印出相關信息。在測試過程中,JMeter 后臺打印可能會出現java.lang.InterruptedException 信息,這個是正,F象,不會影響測試過程和結果。這一點可以從 bin 下的 jmeter.log 看出。

          3. 點對點

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


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

          回頁首

           結論

          本文介紹了如何使用JMeter完成最常用的三種類型服務器的壓力測試,這三種類型的壓力測試涵蓋了很大一部分的使用情形,然而需要記住的是工具畢竟是工具。效果好不好,關鍵還是在于使用的人。而且,對于壓力測試,測試計劃的好壞是關鍵。針對不同的情況,分析后有針對的進行測試,比起拿槍亂打、無的放矢顯然要高效得多。

          延伸閱讀

          文章來源于領測軟件測試網 http://www.k11sc111.com/

          TAG: jmeter 測試 常用 使用 壓力 完成


          關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
          版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
          北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
          技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

          軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

          国产女主播精品_国产片婬乱18一级毛片视频_国产午夜激无码av毛片不卡_国产精品欧美久久久天天影院
            <ruby id="rxdll"></ruby><strike id="rxdll"></strike>

            <rp id="rxdll"></rp>
              <del id="rxdll"><meter id="rxdll"></meter></del>
              <pre id="rxdll"><font id="rxdll"></font></pre>
                <pre id="rxdll"></pre>
              <p id="rxdll"><thead id="rxdll"></thead></p><dl id="rxdll"><progress id="rxdll"><form id="rxdll"></form></progress></dl>

              <ol id="rxdll"><thead id="rxdll"><track id="rxdll"></track></thead></ol>
              <i id="rxdll"><dfn id="rxdll"></dfn></i>
              <font id="rxdll"><meter id="rxdll"></meter></font>

                <mark id="rxdll"><dfn id="rxdll"></dfn></mark>