Jmeter接口测试
一、什么是性能?什么是性能测试?
性能就是软件质量属性中的效率特性。
性能效率特性:
(1)时间特性:表示系统处理用户请求的响应时间
(2)资源特性:表示系统运行过程中,系统资源消耗的情况。资源包括:CPU、内存、磁盘等。
性能测试:使用自动化工具,模拟不同的场景,对软件各项性能指标进行测试和评估的过程。
性能测试的作用:
(1)系统上线,评估当前系统能力
(2)系统上线后,寻找性能瓶颈、优化性能。
(3)评估软件是否能够满足未来的需要。
二、常用的压力测试工具对比
1、loadrunner
性能稳定,压测结果及细粒度大,可以自定义脚本进行压测,但是太过于重大,功能比较繁多。
2、apache ab(单接口压测最方便)
模拟多线程并发请求,ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目标服务器造成巨大的负载,简单DDOS攻击等。
3、webbench
webbench首先fork出多个子进程,每个子进程都循环做web访问测试,子进程把访问的结果通过pipe告诉父进程,父进程做最终的统计结果。
三、Jmeter的是什么
Jmeter是Apache组织使用Java开发的一款测试工具
1、可以用于对服务器、网络或对象模拟巨大的负载
2、通过创建带有断言的脚本来验证程序是否能返回期望的结果
3、Jmeter可以压测不同的协议和应用
- web-HTTP,HTTPS(Java,NodeJS,PHP,ASP.NET,。。。)
- SOAP/RESET WebServices
- FTP
- Database via JDBC
- LDAP 轻量目录访问协议
- Message-oriented middelware(MOM) via JMS
- Mail - SMTP(S),POP3(S) and IMAP(S)
4、使用场景及优点
- 功能测试
- 压力测试
- 分布式压力测试
- 纯java开发
- 上手容易,高性能
- 提供测试数据分析
- 各种报表数据图形展示
四、Jmeter的优缺点
优点:1、开源、免费 2、跨平台 3、支持多协议 4、小巧 5、功能强大
缺点:1、不支持IP欺骗 2、使用JMeter无法验证JS程序,也无法验证页面UI,所以要和Selenium配合来完成Web2.0应用的测试
五、Jmeter的主要组件
1、线程组(Thread Group)
线程数:模拟的用户数量
Ramp-Up时间(Ramp-Up Period):达到指定线程数所需要的时间。例如。线程数为100,Ramp-Up时间为5s,则每秒启动20个线程。
循环次数(Loop Count):测试循环的次数
2、取样器(Sampler)
用于向服务器发送请求,如HTTP请求、JDBC请求等。
在线程组下添加取样器,配置请求的URL、方法、参数等。
3、逻辑控制器(Logical Controller)
用于控制测试的执行逻辑,如循环、条件判断等。
常见的逻辑控制器有IF控制器、循环控制器等。
4、前置处理器(PreProcessor)和后置处理器(PostProcessor)
前置处理器在请求发送前执行操作,如设置请求头、生成数据等。
后置处理器在请求发送后执行操作,如处理相应数据、提取需要的值等。
5、断言(Assertion)
用于验证相应是否符合预期
可以使用正则表达式、XPath、JSON path等方式进行断言。
6、监听器(Listener)
用于展示测试结果,如查看结果树、聚合报告等。
在测试计划或线程组下添加监听器,以查看和分析测试结果。
六、Jmeter高级功能
1、参数化
使用CSV Data Set Config等方式实现参数化,方便进行批量测试。
在测试计划中配置CSV文件路径和变量名,然后在取样器中使用这些变量。
2、定时器(Timer)
用于控制请求的发送频率
在线程组或取样器下添加定时器,配置延迟时间和执行时间等参数。
3、分布式测试
通过配置多个Jmeter实例,实现分布式测试,提高测试效率
需要设置主节点和从节点,以及配置相关的测试计划和数据文件等。
七、Jmeter安装
(1)Jmeter是使用Java编写的,必须安装Java环境
JDK:java SE development kit(java开发工具包,为JAVA程序开发提供环境支持)
JRE:java Runtime Environment(java运行环境,为JAVA程序运行提供环境支持)
(2)下载并安装JMeter
下载路径https://jmeter.apache.org/download_jmeter.cgi
下载完毕并解压
修改中文编码集,打开jmeter.properties,更改为UTF-8格式
启动并运行Jmeter
有时候会报错
要下载binary的包
双击ApacheJMeter.jar
也可以直接切换中文环境
八、Jmeter目录文件讲解
bin:核心可执行文件,包含配置
jmeter.bat:windows启动文件
jmeter.sh:mac或者linux启动文件
jmeter-server:mac或者linux分布式压测使用的启动文件
jmeter-server.bat:mac或者windows分布式压测使用的启动文件
jmeter.properties:核心配置文件
shutdown.sh: 关闭文件
extras:插件拓展的包
lib:核心的依赖包
ext:核心包
Junit:单元测试包
九、使用springboot写API测试接口
使用springboot快速编写几个API接口测试
接口列表:
1、模拟GET请求,用户列表接口
2、模拟POST请求,用户登录接口
HelloController.java
package com.example.springboot_01;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class HelloController {
@RequestMapping(value = "users",method = RequestMethod.GET)
public @ResponseBody Object users(){
List<String> userlist=new ArrayList<>();
userlist.add("tom");
userlist.add("marry");
userlist.add("jack");
System.out.println("get request,user api");
return userlist;
}
@RequestMapping(value = "login",method = RequestMethod.POST)
public @ResponseBody Object login(String name,String pwd){
Map<String,Object> map=new HashMap<>();
if("123".equals(pwd)&& "jack".equals(name)){
map.put("status",0);
}else{
map.put("status",-1);
}
System.out.println("get request,login api");
return map;
}
}
Springboot01Application.java
package com.example.springboot_01;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import java.util.Arrays;
@SpringBootApplication
public class Springboot01Application {
public static void main(String[] args) {
SpringApplication.run(Springboot01Application.class, args);
}
@Bean
public CommandLineRunner commandLineRunner(ApplicationContext ctx){
return args -> {
System.out.println("let's inspect the beans provided by spring boot");
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for(String beanName:beanNames){
System.out.println(beanName);
}
};
}
}
运行结果如下:
十、Jmeter测试API接口
先启动API测试接口,在启动Jmeter
创建一个测试计划
添加http请求
开始压测
可以看到ideal中users函数执行了
如果想查看结果,添加查看结果树
运行后如下
十一、Jmeter基础功能组件介绍线程组和Sampler
11.1 Jmeter常用按钮
11.2 Jmeter里面的GUI菜单栏主要组件
11.2.1 线程组的配置
添加线程组:右键点击"Test Plan"->添加->线程(用户)->线程组,可添加测试需要的线程组。
线程组可配置线程组名称、注释、线程数、Ramp-Up时间、循环次数、调度器等参数。
参数解释:
- 线程数:虚拟用户数。一个虚拟用户占一个进程或者线程。设置多少虚拟用户数就是设置多少个线程数。
- Ramp-Up Period(in seconds)准备时长:全部线程启动的市场,设置的虚拟用户数需要多长时间全部启动。如果线程数为5,准备时长为1,name需要1秒钟启动5个线程,也就是说每秒钟启动5个线程。
- 循环次数:每个线程发送请求的次数。如果线程数为100,循环次数为10,那么每个线程发送10次请求。总请求数为100*10=1000。如果勾选"永远",则所有线程会一直发送请求,知道选择停止运行脚本。
- Same user on each iteration:用于控制每次迭代是否使用相同的线程(即用户)。当该参数被勾选时,JMeter在每次迭代时都会使用相同的线程来模拟用户行为。在连续的请求中,会保持相同的用户身份(如会话、Cookie等)。
- 调度器:设置线程组启动的开始时间合结束时间(配置调度器时,需勾选循环次数为永远)
- 启动延迟(秒):测试延迟的启动时间
- 持续时间(秒):测试持续的时间
11.2.2 添加HTTP请求
右键点击线程组->添加->(Sampler)取样器->HTTP请求(一个线程组下面可以添加几个Sampler),添加一个HTTP请求
对网址http://www.baidu.com/s?ie=utf-8&wd=jmeter进行性能测试,参考下图配置
参数解释:
- 名称:取样器名称
- 注释:对这个取样器的描述
- web服务器
- 协议:向目标服务器发送HTTP请求协议,可以是HTTP或HTTPS,默认为HTTP
- 服务器名称或IP:HTTP请求发送的目标服务器名称或IP
- 端口号:目标服务器的端口号,默认值为80
- Http请求同请求一起发送参数:在请求中发送URL参数,可以将URL中所有参数设置在本表中,表中每行为一个参数对应URL中的name=value)
- 方法:发送HTTP请求的方法,可用方法包括GET、POST、HEAD、PUT、DELETE等
- 路径:目标URL路径(URL中去掉服务器地址、端口以及参数后剩余部分)
- User multipart/from-data for HTTP POST:当发送POST请求时,使用Use multipart/from-data方法发送,默认不选中。
-
- 内容编码:编码方式,默认为ISO-8859-1编码,这里配置成utf-8
11.2.3 添加查看结果树
Jmeter的结果查看树用于查看和分析HTTP请求的相应结果。
右键点击线程组->添加->监听器->查看结果树,添加一个查看结果树。
将查找下方的响应数据格式改为HTML Source Formatted,点击上方的绿色三角按钮,运行http请求。
查看生成结果树
如果访问实现准备的springboot写的API测试接口
查看结果树可以看到返回的3个user数据,userlist
如果访问错误的url
可以看到返回的失败错误码404
可以测试Post请求
生成结果树
11.2.4 Jmeter断言的使用
添加响应断言:线程组->添加->断言->响应断言
apply to(应用范围):
Main sample only:仅当父取样器进行断言,一般一个请求,如果发一个请求会触发多个,则就有sub sample(比较少用)
要测试的响应字段:
响应文本:即响应的数据,比如json等文本
响应代码:http的响应状态码,比如200,302,404等这些
响应信息:http响应代码对应的响应信息,比如:OK、Found
模式匹配规则:
包括:包含在里面就成功
匹配:响应内容完全匹配,不区分大小写
equals:完全匹配,区分大小写
添加user结果树
先运行ideal中的API测试接口
再运行jmeter测试,运行jmeter结果如下
断言结果监听器:线程组->添加->监听器->断言结果
里面的内容是sampler采样器的名称
断言失败,查看结果树任务结果颜色标红(通过结果树里面双击不通过的记录,可以看到错误信息)
每个sample下面可以加单独的结果树,然后同时加多个断言,最外层可以加个结果树进行汇总。
查看相应的状态码
更改匹配规则为状态码
匹配结果
如果更改匹配码为201
匹配结果
更改匹配规则为相等
匹配结果
11.2.5 聚合报告
添加聚合报告
调整线程组
调整测试模式
开始压测,压测完成后产生聚合报告
label:采样器sample名称,可以看成一个接口
samples:总共发出多少请求
average:平均响应时间
mdian:中位数
90%line:90%的用户响应时间不会超过这个值
...
min:最小响应时间
max:最大响应时间
error%:错误的请求总数/请求总数
Throughput:吞吐量,qps
11.2.6 Jmeter压测脚本JMX讲解
之前测试的压测脚本在如下位置
打开这个文件
Testplan为测试计划
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan">
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
</TestPlan>
十人线程组
<hashTree>
<SetupThreadGroup guiclass="SetupThreadGroupGui" testclass="SetupThreadGroup" testname="十人线程组">
<intProp name="ThreadGroup.num_threads">100</intProp>
<intProp name="ThreadGroup.ramp_time">5</intProp>
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller">
<intProp name="LoopController.loops">-1</intProp>
<boolProp name="LoopController.continue_forever">false</boolProp>
</elementProp>
</SetupThreadGroup>
<hashTree>
HTTP请求
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Get" enabled="true">
<stringProp name="HTTPSampler.domain">127.0.0.1</stringProp>
<stringProp name="HTTPSampler.port">8080</stringProp>
<stringProp name="HTTPSampler.protocol">http</stringProp>
<stringProp name="HTTPSampler.path">/users</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量">
<collectionProp name="Arguments.arguments"/>
</elementProp>
</HTTPSamplerProxy>
结果树
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<dataType>true</dataType>
<encoding>false</encoding>
<assertions>true</assertions>
<subresults>true</subresults>
<responseData>false</responseData>
<samplerData>false</samplerData>
<xml>false</xml>
<fieldNames>true</fieldNames>
<responseHeaders>false</responseHeaders>
<requestHeaders>false</requestHeaders>
<responseDataOnError>false</responseDataOnError>
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
<sentBytes>true</sentBytes>
<url>true</url>
<threadCounts>true</threadCounts>
<idleTime>true</idleTime>
<connectTime>true</connectTime>
</value>
</objProp>
<stringProp name="filename"></stringProp>
</ResultCollector>
响应断言
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="包括Jack">
<collectionProp name="Asserion.test_strings">
<stringProp name="3254239">jack</stringProp>
</collectionProp>
<stringProp name="Assertion.custom_message">匹配失败</stringProp>
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
<boolProp name="Assertion.assume_success">false</boolProp>
<intProp name="Assertion.test_type">2</intProp>
</ResponseAssertion>
聚合报告
<ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="users聚合报告">
<boolProp name="ResultCollector.error_logging">false</boolProp>
<objProp>
<name>saveConfig</name>
<value class="SampleSaveConfiguration">
<time>true</time>
<latency>true</latency>
<timestamp>true</timestamp>
<success>true</success>
<label>true</label>
<code>true</code>
<message>true</message>
<threadName>true</threadName>
<dataType>true</dataType>
<encoding>false</encoding>
<assertions>true</assertions>
<subresults>true</subresults>
<responseData>false</responseData>
<samplerData>false</samplerData>
<xml>false</xml>
<fieldNames>true</fieldNames>
<responseHeaders>false</responseHeaders>
<requestHeaders>false</requestHeaders>
<responseDataOnError>false</responseDataOnError>
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
<assertionsResultsToSave>0</assertionsResultsToSave>
<bytes>true</bytes>
<sentBytes>true</sentBytes>
<url>true</url>
<threadCounts>true</threadCounts>
<idleTime>true</idleTime>
<connectTime>true</connectTime>
</value>
</objProp>
<stringProp name="filename"></stringProp>
</ResultCollector>
用户自定义变量
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
<stringProp name="HTTPSampler.domain">127.0.0.1</stringProp>
<stringProp name="HTTPSampler.port">8080</stringProp>
<stringProp name="HTTPSampler.protocol">http</stringProp>
<stringProp name="HTTPSampler.contentEncoding">utf-8</stringProp>
<stringProp name="HTTPSampler.path">/users</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量">
<collectionProp name="Arguments.arguments"/>
</elementProp>
</HTTPSamplerProxy>
11.2.7 用户自定义变量
为什么要使用用户自定义变量:很多变量在全剧中都有使用,或者测试数据更改,可以在一处定义,四处使用。
添加一个新的测试接口
package com.example.springboot_01;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class HelloController {
@RequestMapping(value = "users",method = RequestMethod.GET)
public @ResponseBody Object users(){
List<String> userlist=new ArrayList<>();
userlist.add("tom");
userlist.add("marry");
userlist.add("jack");
System.out.println("get request,user api");
return userlist;
}
@RequestMapping(value = "login",method = RequestMethod.POST)
public @ResponseBody Object login(String name,String pwd){
Map<String,Object> map=new HashMap<>();
if("123".equals(pwd)&& "jack".equals(name)){
map.put("status",0);
}else{
map.put("status",-1);
}
System.out.println("get request,login api");
return map;
}
@RequestMapping(value = "info",method = RequestMethod.GET)
public @ResponseBody Object info(String name){
List<String> userList=new ArrayList<>();
userList.add(name);
userList.add(name.length()+"");
System.out.println("get request,info api");
return userList;
}
}
新建线程组和HTTP请求
配置HTTP请求
添加结果树
运行后结果
添加用户自定义变量
添加两个自定义变量,更改名称
更改Http_request
启动线程组
更改IP为错误IP地址
更改后请求的IP为错误的IP地址
更改参数为自定义变量
结果树如下
12、Jmeter CSV可变参数压测
新建一个csv文件test.csv测试文件
在线程组里面新加入csv数据
数据文件设置
将压测的用户信息名改为csv_name,与csv数据文件设置变量名称相同
启动压测,查看结果树
在JMX文件中会生成CSV文件的配置,如下
<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="CSV 数据文件设置">
<stringProp name="delimiter">,</stringProp>
<stringProp name="fileEncoding">UTF-8</stringProp>
<stringProp name="filename">D:/BaiduNetdiskDownload/【No1369】基于阿里云的超级性能测试jmeter4.x实战/test.csv</stringProp>
<boolProp name="ignoreFirstLine">false</boolProp>
<boolProp name="quotedData">false</boolProp>
<boolProp name="recycle">true</boolProp>
<stringProp name="shareMode">shareMode.all</stringProp>
<boolProp name="stopThread">false</boolProp>
<stringProp name="variableNames">csv_name</stringProp>
</CSVDataSet>
csv多参数使用
更改测试接口代码
HelloController.java
package com.example.springboot_01;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class HelloController {
@RequestMapping(value = "users",method = RequestMethod.GET)
public @ResponseBody Object users(){
List<String> userlist=new ArrayList<>();
userlist.add("tom");
userlist.add("marry");
userlist.add("jack");
System.out.println("get request,user api");
return userlist;
}
@RequestMapping(value = "login",method = RequestMethod.POST)
public @ResponseBody Object login(String name,String pwd){
Map<String,Object> map=new HashMap<>();
if("123".equals(pwd)&& "jack".equals(name)){
map.put("status",0);
}else{
map.put("status",-1);
}
System.out.println("get request,login api");
return map;
}
@RequestMapping(value = "info",method = RequestMethod.GET)
public @ResponseBody Object info(String name,String pwd){
List<String> userList=new ArrayList<>();
userList.add(name);
userList.add(pwd);
userList.add(name.length()+"");
System.out.println("get request,info api");
return userList;
}
}
更改CSV数据文件设置
更改用户信息info
开启压测,运行结果如下
13、Jmeter JDBC request压测Mysql
首先添加一个测试计划,然后添加线程组
添加一个JDBC的采样器
然后添加一个JDBC连接配置
JDBC Request和JDBC Connection Configuration中的连接池变量值相同,否则可能报错
在数据库中创建school数据库,并创建一张Student表,并插入数据
mysql> create database if not exists School default charset utf8 collate utf8_bin;
mysql> create table Student(
-> id integer comment '用户编号',
-> name varchar(10) comment '用户名',
-> age integer comment '年龄'
-> )comment'学生表'
-> ;
插入一行数据
mysql> Insert into student values('1','zk','29');
JDBC连接地址:jdbc:mysql://127.0.0.1:3306/school
下载JDBC connector jar包
https://dev.mysql.com/downloads/connector/j/
在测试计划中加入JDBC的jar包
然后在jmeter中配置Database Connection Configuration
在JDBC Request中添加一个结果树
然后在JDBC Request中配置一条查询语句
先保存一下JMX
执行后可以看到执行结果和执行语句
可以添加聚合报告,执行后返回结果如下
压测sql语句
使用预编译sql语句
参数为id为integer类型
运行结果树如下
插入一行数据
更改jmeter查询
返回结果树如下
多参数预编译更新数据库中记录
查看结果树
查看数据库中数据
添加变量和结果集,处理结果集为记录计数
添加debug sample采样器
执行后返回结果树如下
name_#对应的是Handle ResultSet结果的个数。result对应的是返回结果,会把整个查询结果作为对象进行存储。
参数讲解:(sql结尾不要加";")
1、variable name of pool declared in JDBC connection configuration(和配置文件同名)
2、Query Type 查询类型
3、 parameter value 参数值
4、parameter type 参数类型
5、variable names sql执行结果变量名
6、result varibale names 所有结果当作一个对象存储
7、query timeouts 查询超时时间
8、handle results 处理结果集
14、分布式压测
什么是分布式压测
普通压测:单台机可以对目标机器产生的压力比较小,受限因素包括CPU、网络、IO等。
分布式压测:利用多台机器向目标机器产生压力,模拟几万台用户并发访问。通过RMI机制交互。
以服务器节点进行启动的jmeter.properties文件配置如下
如果做分布式压测的时候就在remote_hosts指定对应的肉机,server_port指定对应的端口号
使用maven打包springboot01项目
打包完成后在targets下面生成jar包文件
15、Jmeter获取城市天气数据
目的:获取城市的天气数据
第一步:发送request获取城市的城市代号
http://toy1.weather.com.cn/search?cityname=上海
从这个请求的response 中获取到上海的城市代码. 比如:
上海的地区代码是101020100
上海动物园的地区代码是: 10102010016A
第二步: 发送request 到: http://www.weather.com.cn/weather2d/101020100.shtml 可以得到该城市的天气数据
第一步:新建一个Thread Group
必须新建一个Thread Group, jmeter的所有任务都必须由线程处理,所有任务都必须在线程组下面创建。
第二步:新建一个HTTP Request
比如我要发送一个Get 方法的http 请求: http://toy1.weather.com.cn/search?cityname=上海
可以按照下图这么填
第三步 添加HTTP Head Manager
选中上一步新建的HTTP request. 右键,新建一个Http Header manager. 添加一个header
第四步: 添加View Results Tree
View Results Tree 是用来看运行的结果的
第五步:运行测试,查看结果
参考文档:
https://www.cnblogs.com/TankXiao/p/4045439.html
https://blog.csdn.net/Zachyy/article/details/139717444
https://blog.csdn.net/2401_84562251/article/details/138934620