一個開發對jmeter的使用需求的總結

概念介紹

image.png

測試計劃

測試計劃是JMeter腳本的根元素,其中可以包含其他元件,例如,線程、配置元素、定時器、前置處理器、后置處理器、斷言以及監聽器。同時,測試計劃也提供
了一小部分自己的配置。首先,可以定義用于腳本中的用戶變量(鍵_值對)。然后,可以配置測試計劃所含的線程組應該如何運行,即,指定線程組是否同時運行。隨著時間的推移,一個測試計劃通常會有多個線程組。通過這個選項決定線程組如何運行。默認所有線程組同時運行。剛開始的時候一個比較有用的選項是Functional Test Mode。檢查結束時,每個樣本返回的服務器響應都會被記錄下來。對于小的模擬運行,確保JMeter設置正確且服務器端返回了預期的結果是非常有用的,但是不好的地方是JMeter的性能會惡化且文件非常大。這個選項默認是關閉(off) 的,在模擬真正的測試場景時通常是不會選中的。另一個比較有用的選擇是添加第三方庫的能力,這可用于為測試用例提供額外的功能。當你的模擬測試場景需要JMeter默認自帶庫以外的其他庫時就用到這個選項了。通常,你都會通過這個選項來添加JAR文件。

線程組

線程組是所有測試計劃的入口點。它們代表了JMeter用于運行測試計劃的線程用戶的數量。一個測試的所有控制器和采樣器都必須放在線程組下面。在你想把其他元素(如 監聽器)應用于所有 線程組時,可以直接把這些元素 放在測試計劃下,如果它們只應用于一個線程組,就放在指定的線程組下。線程組設置提供的選項包括指定用于測試計劃的線程個數、所有線程啟動要花的時間以及測試將會運行的次數。每一個線程都將完全獨立于其他線程運行測試計劃。JMeter將 多個線程拆分開來模擬對服務器的并發連接。注意,啟動所有線程的時間應該設置足夠長以避免在測試開始時負載過大,過大的負載可能導致網絡飽和,測試結果失敗。如果你希望模擬系統中的X個活躍用戶,最好慢慢提升并增加迭代次數。最后一個設置選項是調度器。通過調度器可以設置測試執行的開始時間和結束時間。比如,可以在非高峰時段啟動測試,可以精確到小時。

控制器

控制器負責驅動測試的運行,包括取樣控制器和邏輯控制器。一方面,取樣控制器向服務器端發送請求。其中包括HTTP、FTP、JDBC、LDAP等請求。盡管JMeter有一系列取樣器,但因為我們主要關注Web應用的測試。另一方面,邏輯控制器可以定制用于發送請求的邏輯。例如,循環控制器可以用于重復執行指定次數的操作,選擇控制器可以用于選擇性執行請求,同時條件控制器會持續執行請求,直到某些條件不滿足等。

取樣器用于向服務器發送請求并等待響應。所有樹上的請求會依次處理。JMeter包含以下類型的取樣器:
●HTTP請求;
●JDBC請求;
●L DAP請求;
●SOAP/XML- RPC請求;
●WebService (SOAP) 請求;
●FTP請求。
這些取樣器的屬性可以根據需求進一步調整。多數情況下,可以使用默認的配置。為取樣器增加斷言,可以對服務器響應進行基本驗證。通常在測試過程中,服務器端都會返回狀態碼200,代表請求是成功的,但是可能無法正確顯示頁面。在這種情況下,斷言可以幫助你確保請求是成功的。

邏輯控制器

邏輯控制器幫助我們定制用于決定請求如何發往服務器的邏輯。其中可能涉及修改請求,重復發送請求,交錯發送請求,控制請求執行的時間,切換請求,測量請求執行所花的總時間等。請參考Apache網站上的JMeter在線用戶指南來了解每一種邏輯控制器的詳細說明。

測試塊

測試塊是專門用于測試計劃中代碼重用的一種特殊的控制器。它們在測試計劃樹上與線程組處于同一級,除非被包含或被模塊控制器引用,否則它們不會執行。

監聽器

監聽器主要用于收集用于進一步分析的測試執行結果。此外,監聽器也可將數據直接寫入文件,供下一步使用。此外,監聽器還可以定義保存哪些字段以及使用CSV格式還是XML格式。所有監聽器都會保存相同的數據,唯一不同的是展現在屏幕上的方式。監聽器可以在測試的任何地方添加,包括直接加在測試計劃下面。監聽器
只會收集同級或下級元素的數據。針對各種不同的用途,JMeter包含 了18種不同的監聽器。雖然你可能經常只會用到其中的一部分,但是建議你熟悉它們,知道在什么時候使用。

定時器

默認JMeter線程組在發送每個請求的過程中不會暫停。建議為線程組添加一個定時器,用于指定一個短暫的延時。這將使測試計劃更接近實際使用場景,真正的用戶不可能同時發送多個請求。定時器用于使JMeter在發送每個請求前暫停固定的時間。

斷言

斷言用于判斷從服務器端接收到的響應。從本質上說,通過斷言可以判斷應用的功能是否正確以及服務器端是否返回預期結果。斷言可在XML、JSON、 HTTP以及從服務器端返回的其他形式的響應上運行。因為斷言也會占用大量資源,所以在實際測試運行期間不要使用斷言。

配置元件

配置元件通常和取樣器起使用, 可以修改或添加請求。 只有在放置元件的分支里面,才能訪問樹中的配置元件。配置元素包括HTTP Cookie管理器、HTTP頭管理器等。

前置處理器和后置處理器

顧名思義,前置處理器在發出請求之前會執行一系列操作。前置處理器通常用于在請求執行前修改請求設置或更新那些不是從響應文本中提取出來的變量。后置處理器會在發出請求后執行一系列操作。后置處理器通常用于操作響應文本并從中提取相關數值。

jmeter入門

首先打開Jmeter軟件。

image

jmeter_gui

添加線程組

所有的測試工作都是從新建一個線程組開始的。

image

它的作用其實是為了模擬用戶,所以也叫Users。一個線程組模塊可以包含多個線程,每個線程代表一個用戶,這樣可以模擬高并發下的請求,并根據網站的響應信息來判斷網站的相關性能。

image

線程組包含很多屬性,目前我們只關注線程屬性那一塊。其中線程數代表訪問的并發數,默認是1。Ramp-UpPeriod表示多長時間內容啟動所有線程,如果時間很短,會造成網站的瞬間高并發,默認值是1秒。循環次數是表示執行多少次,默認值為1,表示執行一次結束,這里可以勾選永遠,讓其一直運行下去。

這些屬性暫時不用動,因為還沒有將工程配置好,測試工程配置的時候使用單次測試容易排查問題,以后壓力測試直接修改該面板的值即可。

添加HTTP請求

因為是HTTP接口,這里添加一個HTTP請求,用來訪問網站的API接口。

image

HTTP請求面板主要的目的是設置測試時候HTTP請求的相關信息,模擬瀏覽器訪問或者其他程序訪問后臺的相關配置。

image

該面板主要的配置包括協議、服務器IP、端口、方法、路徑和參數等內容,接下來可以將測試樣例的相關信息填入。

這里測試使用的是淘寶IP地址庫,首頁有RestAPI接口的測試接口說明:

1.請求接口(GET):

/service/getIpInfo.php?ip=[ip地址字串]

2.響應信息:

(json格式的)國家、省(自治區或直轄市)、市(縣)、運營商

 3.返回數據格式:

{"code":0,"data":{"ip":"210.75.225.254","country":"\u4e2d\u56fd","area":"\u534e\u5317",

"region":"\u5317\u4eac\u5e02","city":"\u5317\u4eac\u5e02","county":"","isp":"\u7535\u4fe1",

"country_id":"86","area_id":"100000","region_id":"110000","city_id":"110000",

"county_id":"-1","isp_id":"100017"}}

其中code的值的含義為,0:成功,1:失敗。

因為是GET請求,所以具體內容填寫如下:

image

該接口的參數比較簡單,只有一個ip參數,如果復雜的可以添加多個或者直接在路徑后面添加也可,例如:/service/getIpInfo.php?ip=xxx.xxx.xxx.xxx

添加結果樹

現在基本配置已經OK,但是這樣執行后返回的結果卻沒有地方查看。為了方便查看結果,這里添加ViewResultsTree面板,有很多其它的結果查看面板,大家可以自己嘗試一下。

image

從不同使用場景思考如何使用

如果想對壓測結果進行數據分析怎么辦?

只需要將結果導出為excel即可,所以問題變成了如何將壓測結果導出為excel,如何添加 beanshell 取樣器

添加bean shell取樣器

image
image

運行,循環寫入數據

image
image

某些情況不知道怎么配置測試計劃怎么辦,怎么辦,比如要對zookeeper壓測,或者嫌jmeter這些概念太復雜?

自己編寫jmeter腳本

建立maven項目

在這里插入圖片描述

添加maven依賴:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.soybean</groupId>
    <artifactId>redpacketJmeter</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_java</artifactId>
            <version>4.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.jmeter</groupId>
            <artifactId>ApacheJMeter_java</artifactId>
            <version>4.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.37</version>
        </dependency>
        <dependency>
            <groupId>com.soybean</groupId>
            <artifactId>base-utils</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <!-- 用于打可執行jar包 -->
            <!-- 打包jar文件時,配置manifest文件,加入lib包的jar依賴 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <classesDirectory>target/classes/</classesDirectory>
                    <archive>
                        <manifest>
                            <!-- 主函數的入口 -->
                            <mainClass>com.soybean.Application</mainClass>
                            <!-- 打包時 MANIFEST.MF文件不記錄的時間戳版本 -->
                            <useUniqueVersions>false</useUniqueVersions>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>.</Class-Path>
                        </manifestEntries>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <type>jar</type>
                            <includeTypes>jar</includeTypes>
                            <!--<useUniqueVersions>false</useUniqueVersions> -->
                            <outputDirectory>
                                ${project.build.directory}/lib
                            </outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

建立執行類

<font size="3">??????新建一個類,類名為BaseJmeterHttp,該類繼承AbstractJavaSamplerClient類,AbstractJavaSamplerClient存在于ApacheJMeter_java.jar這個JAR包中,引用即可調用。</font>

<font size="3">??????BaseJmeterHttp類在繼承AbstractJavaSamplerClient類的時候,需要實現四個方法,分別是</font>

  • setupTest():初始化方法,用于初始化性能測試時的每個線程;

  • getDefaultParameters():主要用于設置傳入的參數;

  • runTest():為性能測試時的線程運行體;

  • teardownTest():測試結束方法,用于結束性能測試中的每個線程。

<font size="3">??????具體代碼:</font>

package com.soybean.test.http;

import com.soybean.common.logger.DushuLogger;
import com.soybean.test.Entity.Packet;
import com.soybean.test.Entity.PacketShareUrlVO;
import com.soybean.test.util.HttpClientUtils;
import com.soybean.test.util.HttpResult;
import com.soybean.test.util.JsonUtil;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.threads.JMeterVariables;

import java.util.*;
import java.util.concurrent.*;

/**
 * <br>
 * Description: BaseJmeterHttpImpl<br>
 * Company    : *********科技有限公司 <br>
 * Author     : WangLei<br>
 * Date       : 2018/10/15 14:20<br>
 * Modify     : 修改日期          修改人員        修改說明          JIRA編號<br>
 * v1.0.0      2018/10/15             WangLei         新增              1001<br>
 ********************************************************************/
public class BaseJmeterHttp extends AbstractJavaSamplerClient {

    //    private  String ip ="http://gateway-java-bench.dushu.io";
    private final String ip = "http://10.80.60.181:1111";

    // 線程數
    private final static int THREAD_SIZE = 30;
    private final ExecutorService executorService = Executors.newFixedThreadPool(THREAD_SIZE);

    @Override
    public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
        Packet packet = new Packet();

        JMeterVariables jMeterVariables = javaSamplerContext.getJMeterVariables();
        Iterator<Map.Entry<String, Object>> iterator = jMeterVariables.getIterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Object> entry = iterator.next();//把Object型強轉成int型
            DushuLogger.info("獲取到的參數為:" + JsonUtil.toJSONObject(entry));

            if (entry.getKey().equals("senderId")) {
                packet.setUserId((String) entry.getValue());
            }
            if (entry.getKey().equals("orderNo")) {
                packet.setOrderNo((String) entry.getValue());
            }
            if (entry.getKey().equals("token")) {
                packet.setToken(entry.getValue().toString().split("-"));
            }
            if (entry.getKey().equals("getId")) {
                packet.setGetterId(entry.getValue().toString().split("-"));
            }

            packet.setAppId("1001");

        }

        boolean flag = true;
        String errorInfo = "";
        SampleResult sr= new SampleResult();
        List<Future<Integer>> futures = new ArrayList<>();
        int countSuccess = 0;

        try {
            // 記錄程序執行時間以及執行結果
            sr.sampleStart();
            DushuLogger.info("接收到的參數:" + JsonUtil.toJSON(packet));
            DushuLogger.info("開始創建紅包");
            HttpResult httpResult = HttpClientUtils.postUrlAsJson(ip + "/redPacket-system/redPacket/generateRedPacket", JsonUtil.toJSONObject(packet));
            if (!httpResult.isSuccess()) {
                DushuLogger.error("調用生成紅包接口失敗");
                errorInfo = "調用生成紅包接口失敗";
                flag = false;
            }
            Map map = JsonUtil.fromJSON(httpResult.getResponse(), Map.class);
            DushuLogger.info("創建紅包返回結果:" + JsonUtil.toJSON(map));
            if (map.get("data") == null || !"0000".equals(map.get("status"))) {
                DushuLogger.error("創建紅包失敗");
                errorInfo = "調用生成紅包接口成功,但是處理失敗:" + JsonUtil.toJSON(map) + "  ,請求參數為:" + JsonUtil.toJSONObject(packet);
                flag = false;
            } else {
                //領紅包
                final CountDownLatch latch = new CountDownLatch(THREAD_SIZE);
                for (int i = 0; i < THREAD_SIZE; i++) {
                    PacketShareUrlVO packetShareUrlVO = new PacketShareUrlVO();
                    packetShareUrlVO.setRedPacketId(Long.parseLong(map.get("data").toString()));
                    packetShareUrlVO.setAppId(packet.getAppId());
                    packetShareUrlVO.setToken(packet.getToken()[i]);
                    packetShareUrlVO.setUserId(packet.getGetterId()[i]);
                    DushuLogger.info(JsonUtil.toJSON(packetShareUrlVO));
                    DushuLogger.info(packetShareUrlVO);

                    Callable<Integer> task1 = () -> {
                        String resultInfo = "";
                        //領紅包
                        HttpResult httpResultSmall = HttpClientUtils.postUrlAsJson(ip + "/redPacket-system/redPacket/bindSmallPacketAndUser", JsonUtil.toJSONObject(packetShareUrlVO));
                        if (!httpResultSmall.isSuccess()) {
                            DushuLogger.error("【領紅包失敗】調用領紅包接口失敗:" + JsonUtil.toJSONObject(packetShareUrlVO));
                            resultInfo = "【領紅包失敗】調用領紅包接口失敗:" + JsonUtil.toJSONObject(packetShareUrlVO);
                        }
                        Map smallPacketMap = JsonUtil.fromJSON(httpResultSmall.getResponse(), Map.class);
                        if (smallPacketMap.get("status") == null || !"0000".equals(smallPacketMap.get("status"))) {
                            DushuLogger.error("【領紅包失敗】調用領紅包接口成功,但是處理失敗,入參為:" + JsonUtil.toJSONObject(packetShareUrlVO) + "處理結果為:" + JsonUtil.toJSONObject(smallPacketMap));
                            resultInfo = "【領紅包失敗】調用領紅包接口成功,但是處理失敗,入參為:" + JsonUtil.toJSONObject(packetShareUrlVO) + "處理結果為:" + JsonUtil.toJSONObject(smallPacketMap);
                        } else {
                            //更新會期
                            Map<String, Object> addVipParamMap = new HashMap<>();
                            addVipParamMap.put("token", packetShareUrlVO.getToken());
                            HttpResult addVipTermResult = HttpClientUtils.postUrlAsJson(ip + "/redPacket-system/redPacket/addVipTerm", addVipParamMap);
                            if (!addVipTermResult.isSuccess()) {
                                DushuLogger.error("【更新會期失敗】調用更新會期接口失敗:" + JsonUtil.toJSONObject(addVipParamMap));
                                resultInfo = "【更新會期失敗】調用更新會期接口失敗:" + JsonUtil.toJSONObject(addVipParamMap);
                            }
                            Map addVipMap = JsonUtil.fromJSON(addVipTermResult.getResponse(), Map.class);
                            if (addVipMap.get("status") == null || !"0000".equals(addVipMap.get("status"))) {
                                DushuLogger.error("【更新會期失敗】調用更新會期接口成功,但是處理失敗,入參:" + JsonUtil.toJSONObject(addVipParamMap) + "處理結果為:" + JsonUtil.toJSONObject(addVipMap));
                                resultInfo = "【更新會期失敗】調用更新會期接口成功,但是處理失敗,入參:" + JsonUtil.toJSONObject(addVipParamMap) + "處理結果為:" + JsonUtil.toJSONObject(addVipMap);
                            } else {
                                DushuLogger.info("更新會期成功");
                            }
                        }
                        latch.countDown();
                        return "".equals(resultInfo) ? 1 : 0;
                    };
                    futures.add(executorService.submit(task1));
                }
                latch.await();
            }

            //統計結果

            for (Future f : futures) {
                countSuccess = countSuccess + (int) f.get();
            }

            DushuLogger.info("【統計結果】一共搶紅包的人有:" + THREAD_SIZE + "個,其中成功搶到紅包的有:" + countSuccess + "個");
            flag = countSuccess == 15;
            if (!flag) {
                errorInfo =errorInfo + "請求參數為:" + JsonUtil.toJSONObject(packet)  +"【統計結果】一共搶紅包的人有:" + THREAD_SIZE + "個,其中成功搶到紅包的有:" + countSuccess + "個";
            }
            sr.setSuccessful(flag);

        } catch (Exception e) {
            sr.setSuccessful(false);
        } finally {
            sr.sampleEnd();
        }

        //將數據打印到查看結果樹當中
        sr.setResponseData(flag ? "紅包流程執行成功,共有 " + countSuccess + " 個成功搶到紅包,請求參數為:" + JsonUtil.toJSONObject(packet) : "紅包流程執行失敗,原因:" + errorInfo, null);
        sr.setDataType(SampleResult.TEXT);
        return sr;
    }
}

Jmeter運行分析

<font size="3">??????1、將上述代碼打包成jar包,生成的包名稱為redpacketJmeter.jar,將jar包拷貝到Jmeter的安裝目錄lib/ext下面。
<img src="https://img-blog.csdnimg.cn/2018102615592684.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tpc3NjYXRmb3JldmVy,size_27,color_FFFFFF,t_70" alt="在這里插入圖片描述">
<font size="3">??????2、把依賴的jar包都拷貝到Jmeter安裝目錄的lib下,替換原有的同名jar包
<img src="https://img-blog.csdnimg.cn/20181026155812182.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tpc3NjYXRmb3JldmVy,size_27,color_FFFFFF,t_70" alt="在這里插入圖片描述"></font></font>

在這里插入圖片描述

<font size="3">??????2、運行Jmeter,添加線程組及java請求,顯示如下:
<img src="https://img-blog.csdnimg.cn/20181026160107189.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tpc3NjYXRmb3JldmVy,size_27,color_FFFFFF,t_70" alt="在這里插入圖片描述">
<font size="3">??????3、添加監聽器,這里我們添加查看結果樹和聚合報告就好。</font></font>

<font size="3">??????結果顯示如下圖:
<img src="https://img-blog.csdnimg.cn/20181026160145135.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tpc3NjYXRmb3JldmVy,size_27,color_FFFFFF,t_70" alt="在這里插入圖片描述"></font>

如果一個接口依賴數據庫中的正確數據,如何壓測,比如壓測登錄接口?

先使用navcat將數據導出為csv,在使用該csv為入參。所以這里問題就變成了,將csv文件設置為測試計劃的動態參數。

準備csv文件

桌面創建一個CityData.csv文件,根據前面接口測試文件,關于天氣API三個變量,寫入csv文件,最后一欄,中文是我添加的城市名稱備注,例如下圖


image.png

打開JMeter,創建一個Thread Group,設置如下

image.png

因為我們8個城市,只有一個Http Request,所以這個地方需要循環測試8次

添加一個CSV Data Set Config,設置如下

image.png

設置如下

第一個紅圈,文件名要寫對路徑,第二個紅圈是空白的,如果你csv第一行寫的變量,就像我上面這樣,這個地方就不填寫

添加一個HTTP Request,設置如下

image.png

通過 ${變量名}來告訴JMeter是從外部文件讀取變量

測試,查看結果

image.png

點擊切換這8個 HTTP Request,看看是不是分別對應csv文件八個城市。JMeter如何通過CSV文件讀取變量就介紹到這里。

單機壓測的qps沒法達到預期,如何使用分布式壓測?

充分利用剩余服務器資源,問題就變成了,如何在centos中執行任務

下載:

<pre>
wget https://mirrors.bfsu.edu.cn/apache//jmeter/binaries/apache-jmeter-5.3.tgz
</pre>

解壓:

<pre>
tar -xvf apache-jmeter-5.3.tgz
</pre>

用cli模式運行并加載測試模板,最后生成html報告:

<pre>
cd apache-jmeter-5.3.tgz && bin/jmeter -n -t Test\ Plan.jmx -l result.jtl -e -o ./html
</pre>

參數:

<pre>

-n:以非GUI形式運行Jmeter

-t:運行JMX測試計劃腳本文件的路徑

-l:運行結果保存路徑(.jtl),此文件必須不存在

-j: jmeter運行日志

-r: 運行分布式壓測服務器,指明用jmeter屬性"remote_hosts"

-R:運行分布式服務器,其后跟著服務器列表

-e:在腳本運行結束后生成html報告,此參數要與-l一起使用。

-o:用于存放html報告的目錄,此目錄必須為空。此參數與-e一起使用。 </pre>

測試模板請在本機window下運行jmeter GUI來生成,保存后再上傳到測試服務器上。

如果需要同時測幾個測試接口太長,接口太復雜 不知道如何建立計劃怎么辦?

使用chrome瀏覽器錄制工具通過錄制功能,不需要自己構建計劃

下載插件BlazeMeter

直接在網上搜索是全英的,推薦大家從一個中文谷歌插件網下載,非常方便,具體方法可以參考這個鏈接。

https://blog.csdn.net/make_1998/article/details/103499772

下載完將插件文檔移入谷歌網頁的擴展程序中即可。

進行錄制

image

點擊網頁右上角的圖標,開始Start recording錄制開始即可。

轉格式

錄制完成后的默認格式是.YAML的,需要轉換成.JMX格式,這時候就需要登錄賬號BlazeMeter。由于是谷歌的插件,所以可以用谷歌賬號進行登錄。登陸后返回BlazeMeter界面,點擊JMeter Script,

image

選擇jmx即可

image

然后將下載的文件導入JMeter,任務完成。

Jmeter詳細使用教程下載

https://www.wangdaye.net/upload/2021/11/jmeter%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B-786279483b524a8aabf91908a953da46.zip

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容