Jmeter接口测试

Jmeter安装:

安装JDK

1. 下载JDK

访问Oracle官方网站的Java SE下载页面:[https://www.oracle.com/java/technologies/javase-jdk17-downloads.html](https://www.oracle.com/java/technologies/javase-jdk17-downloads.html) 
 2. 安装JDK

1. 双击下载好的安装包,启动JDK安装程序。
2. 在安装向导中,可以选择自定义安装路径,但建议使用默认路径以避免配置环境变量时出错。默认路径通常是 `C:\Program Files\Java\jdk-版本号`。
3. 继续按照提示完成安装过程,确保同时安装JDK和JRE(Java Runtime Environment),尽管现代JDK安装包通常会一起安装两者。

3. 配置环境变量

安装完成后,需要配置系统环境变量以便在任何位置运行Java命令。

1. **右键**计算机或此电脑图标,选择**属性**。
2. 点击**高级系统设置**。
3. 在系统属性窗口中点击**环境变量**按钮。
4. 在**系统变量**区域,点击新建:
   - 变量名:`JAVA_HOME`
   - 变量值:指向JDK的安装目录,例如 `C:\Program Files\Java\jdk-版本号`。

(C:\Program Files\Java)
5. 找到**Path**变量,点击编辑:
   - 点击新建,添加两个路径:
     - `%JAVA_HOME%\bin`
     - `%JAVA_HOME%\jre\bin` (如果独立安装了JRE,则不需要这一步)


6. 确认所有更改,依次点击确定关闭所有窗口。

4. 验证安装

打开命令提示符(CMD)或PowerShell,输入以下命令并回车:

- `java -version`
- `javac -version`

如果安装成功,这两个命令将分别显示Java运行时环境和编译器的版本信息。

安装jmeter

Jmeter环境变量配置:

1,变量名:JMETER_HOME

变量值:E:\apache-jmeter-3.2(根据自己的解压目录而定,笔者使用的是Jmeter3.2的版本)

2,变量名:CLASSPATH

变量值:%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib/logkit-2.0.jar;

环境变量配置结束,可以至安装目录下bin目录下寻找jmeter.bat文件,双击打开。

搭建本地的测试接口

搭建一个本地的接口

http://127.0.0.1:5000/api/weather?city=Beijing

创建一个用于练习接口测试的接口实例,我们可以设计一个简单的RESTful API,比如一个天气查询服务。下面是一个模拟的示例,假设你有后端技术基础(如Python Flask或Node.js Express)来搭建这个API。

### 使用Python Flask创建示例接口

首先,确保你安装了Python和Flask。然后,创建一个名为`app.py`的文件,输入以下代码:

```python
from flask import Flask, jsonify, request

app = Flask(__name__)

# 假设我们有一个简单的数据结构存储天气信息
weather_data = {
    "Beijing": {"temperature": "25°C", "humidity": "40%", "weather": "Sunny"},
    "Shanghai": {"temperature": "22°C", "humidity": "50%", "weather": "Cloudy"}
}

@app.route('/api/weather', methods=['GET'])
def get_weather():
    city = request.args.get('city')
    if city in weather_data:
        return jsonify(weather_data[city])
    else:
        return jsonify({"error": "City not found"}), 404

if __name__ == '__main__':
    app.run(debug=True)
```

这段代码创建了一个简单的Web服务,提供一个GET接口,用于查询指定城市的天气信息。你可以通过访问`http://localhost:5000/api/weather?city=Beijing`来测试这个接口。()

### 使用Postman或curl进行测试

- **Postman**: 安装并打开Postman,创建一个新的GET请求,URL设置为`http://localhost:5000/api/weather?city=Beijing`,然后发送请求查看响应。
- **curl**: 在命令行中,你可以使用如下命令测试接口:
  ```bash
  curl http://localhost:5000/api/weather?city=Beijing
  ```

### 练习内容

- 测试不同城市的查询,包括存在的城市和不存在的城市,观察响应。
- 使用Postman的预设功能测试不同的HTTP状态码。
- 尝试添加更多的查询参数或改变请求方法(如POST、PUT等),并修改后端代码以支持这些变化,进一步练习更复杂的接口测试场景。

请注意,上述API仅为教学目的设计,实际应用中的天气API会从气象服务提供商处获取实时数据。

遗留问题:

脚本录制

接口测试概念:

平台:内部接口/外部接口(API)

类型:http/soap(webservice)

请求方式:get/post 区别

数据的传递方式:xml/json

关注点:和接口需求文档一致(status,code,msg),确认数据库

 Jmeter工具使用

http请求

添加查看结果树

soup请求

qqOnlineWebService Web 服务

修改消息体数据中的qqCode为实际qq号进行查询

soup请求需要添加http信息头管理器

利用jmeter处理session&cookie

http请求

请求信息----请求头

响应信息----响应头

cookie

session

http请求是无状态

Jmeter进行接口测试

延伸学习:请求头的/响应头的作用,作用内容

正则表达式

获取access_token数据,用于之后的验证

添加正则表达式提取器

请求时调用

抓包查看登录时的请求信息

返回信息中心查看cookie

调用时添加 http Cookie管理器

在返回结果中查看域和路径

此处为全局cookie不需要再设置

参数化

1.用户自定义变量

2.生成随机函数

函数助手中的_Random函数进行参数化设置

选择一个功能_Random

设定最小值为1

设定最大值为100

函数名称设为func1

点击生成将生成一个引用字符串${_Random(1,100,func1},在需要的请求参数中拷贝该字符串即可。

其中函数名称用来在引用中作区别,即我们可以设定不同的名称在不同的地方引用同一个函数的功能。

v 例如:我们生成了两个串 ${_Random(1,100,func1)} ${_Random(1,100,func2)} ,在添加图书的请求中,我们在 bookName 的参数值中引用 ${_Random(1,100,func1)} ,在 bookConcern 的参数值中应用 ${_Random(1,100,func2)} ,见截图,这样测试运行时不同的线程将产生不同的 bookName bookConcern

3.配置文档

配置元件中的CSV Data Set Config进行参数化设置

 csv文档

创建csv文档

在线程组上点击右键选择添加-配置元件-CSV Data Set Config,打开CSV Data Set Config。Filename文件名:即参数化要引用的文件名。这里是d:\number.txt

File encoding文件编码:可以不填。

Variable Names(comma-delimited)变量名(用逗号分割):多个变量可以引用同一个文件,用逗号分割。这里是num1num2

Delimiter(use ‘\t’ for tab):参数文件中多个变量值的分隔符,\t表示用tab键分割,默认是逗号。

Recycle on EOF?:结束后是否循环?默认是True.

Number.txt文件内容见截图。

参数配置

在添加图书的请求中,我们在bookName的参数值中引用${num1},在bookConcern的参数值中应用${num2},见截图,这样测试运行时不同的线程将产生不同的bookNamebookConcern

录制脚本

录制脚本

原理:把jmeter作为代理服务器

代理:中转站

客户端设置代理到本地的jmeter地址:127.0.0.1 (localhost) 端口8888

过滤:包含或排除

排除模式:正则表达式

一定要过滤?

接口测试:需要过滤 过滤掉css jss 图片

性能测试、UI:不需要过滤

  1. 在测试计划中添加线程组,在线程组中添加逻辑控制器-录制控制器

2.在工作台中添加非测试元件-HTTP代理服务器

3.端口:即代理服务器的监听端口,我们设为8080​​​​​​​

4.目标控制器选择:测试计划>线程组

5.分组选择:每个组放入一个新的控制器

在HTTP代理服务器中添加定时器-高斯随机定时器(用于告知Jmeter来在其生成的HTTP请求中自动的增加一个定时器)。定时器将会使相应的的取样器被延迟。 延时的规则是,在上一个访问请求被响应并延时了指定的时间后,下一个被定时器影响的取样访问请求才会被发送出去。

如果在代理服务器元件里使用了高斯随机定时器,就应该在其中的固定延迟偏移(Constant Delay Offset)设置项里添上${T}(用于自动引用纪录的延迟时间)

代理服务器配置好以后,点击启动,代理服务器就会开始记录所接受的HTTP 访问请求。

打开浏览器,打开Internet选项,将局域网(LAN)设置中的代理服务器设为:localhost,端口为在代理服务器中设的端口:8080

​​​​​​​

在浏览器地址栏中输入地址并进行相关的操作进行录制,录制完成后, 停止HTTP 代理服务器; 在录制控制器元件上单击右键将记录的元件保存为一个文件用于以后重用,另外,不要忘了恢复浏览器的代理服务器设置。

执行录制脚本

打开JMeter会有一个默认的测试计划,点击文件-打开,选中录制的脚本文件如:WebXSample_addUser.jmx,打开脚本进行测试。

在线程组上添加监听器-聚合报告(用于分析测试结果)后,点击运行-启动,开始测试,测试完毕后在聚合报告中就可以看到测试结果。一个简单的测试计划就完成了。

优化脚本

聚合报告显示测试结果

聚合报告详解

  1. Label:每个 JMeter 的 element (例如 HTTP Request )都有一个 Name 属性,这里显示的就是 Name 属性的值
  2. #Samples:表示你这次测试中一共发出了多少个请求,如果测试计划模拟10个用户,每个用户迭代10次,这里就会显示100
  3. Average:平均响应时间 — 默认情况下是单个
  4. Request 的平均响应时间,当使用了事务控制器时,也可以以事务为单位显示平均响应时间
  5. Median:中位数,也就是 50 %用户的响应时间
  6. 90% Line: 90 %用户的响应时间
  7. Min:最小响应时间
  8. Max:最大响应时间
  9. Error%:错误率,本次测试中出现错误的请求的数量 / 请求的总数
  10. Throughput:吞吐量 —— 默认情况下表示每秒完成的请求数( Request per Second )
  11. KB/Sec:每秒从服务器端接收到的数据量

主要组件

测试计划(Test Plan)

使用 JMeter 进行测试的起点,它是其它 JMeter 测试元件的容器


用户定义的变量:用户可以自己定义变量,在用到此变量的时候直接用${变量名}引用即可。例:变量名=url,值=http://www.baidu.com,在需要http://www.baidu.com时直接用${url}即可。
Add directory or jar to classpath:向类路径即%JMETER- HOME%\lib中添加目录及jar包

线程组(Thread Group)

代表一定数量的并发用户,它可以用来模拟并发用户发送请求。

线程属性-线程数:设置发送请求的用户数目 ,即并发数。
线程属性-Ramp-Up Period(insecond):线程间的时间间隔,单位是秒。即所有线程在多少时间内启动。
线程属性-循环次数:请求的重复次数,如果选择后面的forever(默认),那么请求将一直继续,如果不选择forever,而在输入框中输入数字,那么请求将重复指定的次数,如果输入1,那么请求将执行一次,如果是0,会出现问题。
调度器配置-启动时间:测试计划什么时候启动,启动延迟会覆盖它。
调度器配置-结束时间:测试计划什么时候结束,持续时间会覆盖它。
调度器配置-持续时间:测试计划持续多长时间,会覆盖结束时间。
调度器配置-启动延迟:测试计划延迟多长时间启动,会覆盖启动时间

取样器(sampler) (HTTP)

定义实际的请求内容,被线程组包含,我们主要用HTTP请求。

Web服务器-服务器名称或IP、端口号,脚本录制时自动添加,也可以使用“用户自定义变量”。
HTTP请求:用默认值即可。
同请求一起发送参数:请求中的参数、值可以在此设置,需要用到参数化及动态数据关联,我们在后面专门介绍。
同请求一起发送文件:我可以制定同请求一起发送哪个文件。
其他任务包括:从HTML文件中获取所有内含的资源、用作监视器、Embedded URLs must match。

https协议

测试 HTTPS 网站与测试 HTTP 网站的步骤大致相同,只是在配置 HTTP 请求采样器时需要确保选择正确的协议,并处理SSL证书相关的设置。下面是进行 HTTPS 测试时需要注意的几点:

### 1. 添加HTTPS请求

在创建HTTP请求时,确保在“协议”下拉菜单中选择“https”。这是进行HTTPS请求的关键区别。

### 2. 处理SSL证书

首次进行HTTPS测试时,JMeter可能会报告SSL证书不受信任的问题,尤其是当站点使用自签名证书或内部CA颁发的证书时。为了解决这个问题,你可以采取以下几种方式之一:

#### 2.1 忽略SSL证书检查

- 对于测试目的,你可以在JMeter的配置中选择忽略SSL证书验证。这可以通过在“选项”(Options)菜单中选择“SSL Manager”来实现,然后在“SSL Manager”对话框中勾选“忽视证书”(Ignore Certificates)的选项。但这不适用于生产环境或涉及敏感数据的测试,因为它会降低安全性。

#### 2.2 导入证书到JMeter的信任库

- 如果你的HTTPS网站使用的是自签名证书,更安全的做法是将该网站的证书导入到JMeter的信任库中。这通常涉及到导出目标网站的证书,然后将其导入到JMeter的JVM信任库中。具体步骤可能因操作系统和JMeter版本而异,但一般包括:
  - 访问网站,导出其SSL证书。
  - 找到JMeter安装目录下的`jre/bin/keytool.exe`(Windows)或`jre/bin/keytool`(Linux/macOS),使用该工具将证书导入到JMeter的Java密钥库中。

监听器(Listener)

负责收集测试结果,同时也被告知了结果显示的方式。我们常用的包括:聚合报告、查看结果树、用表格查看结果,都支持将结果数据写入文件。其他的添加上去看看就行。聚合报告前面我们介绍过,后面是查看结果树用表格查看结果的截图。

用表格查看结果

查看结果树

逻辑控制器(Logic Controller)

可以自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列

循环控制器

循环控制器可以设置请求的循环次数或永远循环(如果选中永远的话)。

事务控制器

事务控制器可以将多个请求放在同一个事务中。如果选中Gegerate parent sample,则聚合报告中只显示事务控制器的数据,而不会显示其中的各个请求的数据,反之则全部显示。

断言(Assertions)

可以用来判断请求响应的结果是否如用户所期望的。它可以用来隔离问题域,即在确保功能正确的前提下执行压力测试。这个限制对于有效的测试是非常有用的。

配置元件(Config Element)

维护Sampler需要的配置信息,并根据实际的需要会修改请求的内容。我们主要在参数化中用到CSV Data Set Config

前置处理器(Pre Processors)&后置处理器(Post Processors)

负责在生成请求之前和之后完成工作。前置处理器常常用来修改请求的设置,后置处理器则常常用来处理响应的数据。我们主要在动态关联中用到后置处理器的正则表达式提取器。

定时器(Timer)

负责定义请求之间的延迟间隔。

动态数据关联

在HTTP请求的参数中经常会遇到一些参数的值是从服务器相应的动态数据,这些数据需要进行关联才能使得每一次请求都能成功得被服务器接受,在JMeter中采用正则表达式提取器来获取这些动态的数据。
正则表达式允许用户从服务器响应中获取数据,作为一个后置处理器,正则表达式提取器会在每一个请求执行后再执行,正则表达式提取请求的参数值,产生模板字符串,并将结果保存到给出的变量中。

正则表达式提取器

比如我们想要获得从服务器相应的 TOKEN ,就可以使用下面的正则表达式提取器。

正则表达式:

正则表达式(Regular Expression,通常简写为regex、regexp或RE)是一种强大的文本处理工具,用于匹配、查找、替换等操作。它由一系列字符和特殊符号组成,能够构建出复杂的模式以描述文本字符串的特征。正则表达式广泛应用于程序开发、数据处理、网页爬虫、文本编辑器搜索、数据验证等领域。

### 基本概念

- **字符**: 直接匹配指定的字符,如`a`匹配字符"a"。
- **点`.`**: 匹配任意单个字符(不包括换行符)。
- **量词**:
  - `*`: 零次或多次重复前面的元素。
  - `+`: 一次或多次重复前面的元素。
  - `?`: 零次或一次重复前面的元素。
  - `{n}`: 重复前面的元素恰好n次。
  - `{n,}`: 重复前面的元素至少n次。
  - `{n,m}`: 重复前面的元素至少n次,但不超过m次。

- **选择符`|`**: 匹配符号前或后的表达式中的任意一个,相当于逻辑“或”。
- **括号`()`**: 分组,用于定义子表达式,也可以用来捕获匹配的内容。
- **转义符`\`**: 用于取消特殊字符的特殊含义,或者匹配特殊字符本身,如`\.`匹配点字符。

### 特殊序列**

- `^`: 表示字符串的开始。
- `$`: 表示字符串的结束。
- `\b`: 单词边界,即单词与空格、标点或字符串开始/结束的位置。
- `\B`: 非单词边界。
- `\d`: 代表任何数字,等价于[0-9]。
- `\D`: 代表任何非数字字符。
- `\s`: 匹配任何空白字符,包括空格、制表符、换页符等。
- `\S`: 匹配任何非空白字符。
- `\w`: 匹配字母、数字或下划线,等价于[a-zA-Z0-9_]。
- `\W`: 匹配任何非字母、数字、下划线的字符。

### 实例

- 匹配邮箱地址: `\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*`
- 匹配电话号码(简单示例): `\d{3}-\d{3}-\d{4}`
- 匹配URL: `https?://[\w./]+`

学习正则表达式需要实践和积累,熟练掌握后能极大提高处理文本数据的效率。许多编程语言和工具(如Python、JavaScript、grep、sed、vim等)都支持正则表达式的使用。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-10 14:36:02       8 阅读
  2. 【Python教程】压缩PDF文件大小

    2024-06-10 14:36:02       9 阅读
  3. 通过文章id递归查询所有评论(xml)

    2024-06-10 14:36:02       10 阅读

热门阅读

  1. Vue3学习

    2024-06-10 14:36:02       5 阅读
  2. 使用c语言实字符串倒置及逆波兰数(栈)

    2024-06-10 14:36:02       5 阅读
  3. web前端报名点:深入探索与报名流程指南

    2024-06-10 14:36:02       7 阅读
  4. 深拷贝&浅拷贝解析,从原理理解深拷贝

    2024-06-10 14:36:02       7 阅读
  5. 不要使用业务键作为数据库主键

    2024-06-10 14:36:02       10 阅读
  6. 爬山算法的详细介绍

    2024-06-10 14:36:02       6 阅读
  7. SSRF 漏洞实践:端口扫描与任意文件读取

    2024-06-10 14:36:02       5 阅读
  8. SpringBoot实现上传头像(查看头像)

    2024-06-10 14:36:02       6 阅读
  9. 模拟CAS算法案例

    2024-06-10 14:36:02       4 阅读
  10. DeepSpeed Autotuning

    2024-06-10 14:36:02       4 阅读
  11. 10-Eureka-服务注册

    2024-06-10 14:36:02       5 阅读