Jmeter

image.png

测试基础

介绍测试

线程和进程

性能测试:模拟很多用户去访问某个接口,聚合报告。

接口测试

定义

个人理解:对后端给出的访问地址进行测试,确保其能正常使用

接口:特殊URL地址,负责数据的操作。

四要素
  1. 请求URL
  2. 请求方式:GET、POST、Restful风格”PUT、DELETE
  3. 请求参数
  4. 返回内容

以上都ok,看请求头:content-Type:application/json

JMeter接口测试

添加取样器(HTTP)

image.png

填写对应4要素

image.png

添加监听器

image.png

运行并查看结果

image.png

测试片段

实现前置请求,例如商城登录后才能测的其它功能
模块化的封装,各测试独立

新建测试片段,并将写好的部分放入测试片段中

image.png

可将需要的测试片段进行保存,然后重复利用

image.png

线程组中添加include控制器,选择对应文件

image.png

环境变更

添加用户定义的变量

值 -> 变量

image.png

添加经常更改的值

如ip地址、端口号

image.png

修改请求中的对应位置的值

${变量名}

image.png

正例和反例

多组测试数据
DDT:数据驱动测试。 — 自动化测试有名

添加CSV Data Set Config

image.png

添加对应csv文件

image.png

修改测试接口请求参数

${变量名}

image.png

添加逻辑控制器 - 循环控制器

image.png

修改控制器位置和循环次数

image.png

断言

校验核心数据,数据 + Type

添加断言

常用json断言

image.png

添加JSONPATH和期望值

需要理解:JSONPATH

不同层数据获取

  1. $xxx
  2. $xxx.xxx
  3. $xxx.xxx.xxx

image.png

修改csv文件将断言改成变量

image.png

JSON提取器

Token问题

添加JSON提取器

image.png

填入对应数据

image.png

修改订单请求

image.png

连接数据库

添加JDBC Connection Configuration

image.png

配置填写

image.pngimage.png

添加需要的MySQL的jar包(注意版本)

添加JDBC Request

image.png

添加别名,输入sql语句

将请求数据库的数据以变量形式存储

image.png

熟悉JMeter数据库变量赋值规则

变量名_顺序递增的数字(从1开始)
xxx_1、xxx_2 …

随机抽查

修改sql语句

1
2
3
select id, book_name, book_desc from book where id = 114

select id, book_name, book_desc from book order by RAND() desc limit 1

检查多条

变量间的嵌套: __V函数
{__V(ids_{n})}

添加循环控制器和计数器并填写需要数据

image.png

填写JSON断言(利用V函数对其中进行拼接)

image.png

调试

可以添加调试取样器
image.png

加密接口测试

银行、金融类、自研类、互联网大公司

加密与普通接口的区别

image.png
加密接口:密文传输
通过算法对数据进行加密,形成密文

HTTPS

image.png

端对端加密

image.png

JMeter实现加密接口

获取当前用户名的加密数据

这里借助了第三方工具。

获取当前用户密码的加密数据

image.png

添加JSON提取器,提取数据并填入请求中

image.png

beanShell极度不推荐

java脚本的片段

  • 开发好用
  • 测试噩梦

创建OS进程取样器1

image.png

py脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import base64
import sys

from Crypto.Cipher import AES

class EncryptDate:
def __init__(self, key):
self.key = key.encode("utf-8") #初始化秘钥
self.length = AES.block_size #初始化数据块大小
self.aes = AES.new(self.key, AES.MODE_ECB) # 初始化AES,ECB模式的实例
self.unpad = lambda date: date[0:-ord(date[-1])]

def pad(self, text):
# block_size = self.length
# 填充函数,使被加密字节码长度是block_size的整数倍
count = len(text.encode("utf-8"))
add = self.length - (count % self.length)
entext = chr(add) * add + text
return text

def encrypt(self, encData): # 加密函数
res = self.aes.encrypt(self.pad(encData).encode("utf-8"))
msg = str(base64.b64encode(res), encoding="utf-8")
return msg

def decrypt(self, decData): # 解密函数
res = base64.decodebytes(decData.encode("utf-8"))
msg = self.aes.decrypt(res).decode("utf-8")
return self.unpad(msg)