JMeter中有个元件叫做断言(Assertion),它的作用和LoadRunner中的检查点类似。用于检查测试中得到的响应数据是否符合预期,用以保证性能测试过程中的数据交互与预期一致。

jmeter常用几种断言

Response Assertion(响应断言)

Size Assertion(数据包字节大小断言)

Duration Assertion(持续时间断言)

beanshell 断言(自由断言)

JSON断言

Response Assertion(响应断言)

添加响应断言

对Web请求的响应结果进行验证

输入需要匹配的字符串

此处对于访问Baidu首页,需要设置匹配的字符串为“百度一下,你就知道”,表示返回的文本内容若包含有“百度一下,你就知道”,则就算Pass

Response Assertion配置参数

模块类型选项名称配置说明
NameResponse Assertion名称
Comments注释
Apply to断言应用的范围
Main sample and sub-samples作用于父节点取样器及其子节点取样器
Main sample only仅作用于父节点取样器
Sub-samples only仅作用于子节点取样器
Jmeter Variable Name to use作用于Jmeter变量(输入框中可输入Jmeter的变量名称)
Field to Test测试的字段
Text Response匹配从服务器返回的响应文本(不包括Response Headers)
Response Code匹配响应状态码
Response Message匹配响应信息。如:OK
Response Headers匹配响应头
Request Headers匹配请求头
URL Sampled匹配URL链接
Document(text)匹配文档内容
Ignore Status一个请求多项响应断言时,忽略某一项断言的响应结果,而继续下一项断言
Request Data匹配请求数据
Pattern Mactching Rules匹配的规则
Contains返回的结果包括所指定的内容,支持正则匹配
Matches根据指定内容进行匹配
Equals返回结果与所指定的内容一致
Substring返回结果包括所指定结果的字符串,不支持正则匹配
Not不进行匹配就算是Pass
Or几个条件处于或者关系
Patterns to Test
Patterns to Test需要匹配的正则表达式、字符串。可以添加多项,每一项会分开进行验证,若某一项验证失败,则其后的不会再进行验证。

添加:断言结果(Assertion Results)、查看结果树(View Results Tree)

运行Test Plan中的线程组,进行断言检查

以下可观察到响应数据中是包含所指定的验证字符串,Pass

Size Assertion(数据包字节大小断言)

判断响应结果是否包含正确数量的byte。可定义(=, !=, >, <, >=, <=)

Duration Assertion(持续时间断言)

判断是否在给定的时间内返回响应结果

beanshell 断言

Bean Shell常用内置变量

   JMeter在它的BeanShell中内置了变量,用户可以通过这些变量与JMeter进行交互,其中主要的变量及其使用方法如下:

log:写入信息到jmeber.log文件,使用方法:log.info(“This is log info!”);

ctx:该变量引用了当前线程的上下文,使用方法可参考:org.apache.jmeter.threads.JMeterContext。

vars - (JMeterVariables):操作jmeter变量,这个变量实际引用了JMeter线程中的局部变量容器(本质上是Map),它是测试用例与BeanShell交互的桥梁,常用方法:

    a) vars.get(String key):从jmeter中获得变量值

    b) vars.put(String key,String value):数据存到jmeter变量中

    更多方法可参考:org.apache.jmeter.threads.JMeterVariables

props - (JMeterProperties - class java.util.Properties):操作jmeter属性,该变量引用了JMeter的配置信息,可以获取Jmeter的属性,它的使用方法与vars类似,但是只能put进去String类型的值,而不能是一个对象。对应于java.util.Properties。

    a) props.get("START.HMS");  注:START.HMS为属性名,在文件jmeter.properties中定义

    b) props.put("PROP1","1234");

prev - (SampleResult):获取前面的sample返回的信息,常用方法:

    a) getResponseDataAsString():获取响应信息

    b) getResponseCode() :获取响应code

    更多方法可参考:org.apache.jmeter.samplers.SampleResult

sampler - (Sampler):gives access to the current sampler

在这里除了可以使用beanshell的内置变量外,主要通过 Failure 和 FailureMessage来设置断言结果。

其中脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
if ("200".equals(""+ResponseCode) == false )
{
// 响应码不等于200时,设置断言失败,并输出失败信息
Failure=true ;
FailureMessage ="Response code was not a 200 response code it was " + ResponseCode + "." ;
print ( "the return code is " + ResponseCode); // this goes to stdout
log.warn( "the return code is " + ResponseCode); // this goes to the JMeter log file
} else {
// 响应码等于200时,设置断言成功,并输出成功信息
Failure=false;
FailureMessage = "Return true, and the response code was " + ResponseCode;
}
}

JSON断言

JSON断言也是测试工作中经常用到的一种断言方法,它一般用于断言某个字段值是否等于我们指定的值。所以JSON断言只能针对响应结果为applicaton/json格式的进行断言操作。如果是其他类型(如:Test、html),则无法使用这种方式。

案例

发送请求:http://47.115.15.198:7001/smarthome/user/login --登录接口

断言检查:检查响应的数据中,user_name节点对应的内容是否为"lemonn"

操作步骤

  • 第1步:添加线程组

  • 第2步:添加HTTP请求

  • 第3步:在HTTP请求下添加响应断言

  • 第4步:添加断言结果和添加察看结果树

  • 第5步:运行接口后,察看断言结果和察看结果树

JSON与JSON Path的简单说明

(1)JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。

JSON数据容易理解,便于阅读和编写,同时计算机也易于解析和生成,所以JSON有广泛的应用。

JSON常用数据结构:

  • 对象(object)格式

    1
    2
    3
    4
    5
    {
    "name": "zhangsan",
    "sex": 1,
    "age": 25
    }
  • 数组(Array)格式

    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
    {
    "man": [
    {
    "name": "zhangsan",
    "sex": 1,
    "age": 21
    },
    {
    "name": "lisi",
    "sex": 1,
    "age": 18
    }
    ],
    "weman": [
    {
    "name": "wangwu",
    "sex": 0,
    "age": 25
    },
    {
    "name": "zhaoliu",
    "sex": 0,
    "age": 28
    }
    ]
    }

(2)JSONPath

我们经常使用XPath来分析、转换以及有选择地从XML文档中提取数据。

与XPath类似,JOSNPath可以方便的从JSON结构中发现和提取数据。

JSONPath中的“根成员对象”总是被称为$,无论它是对象还是数组。

JSONPath表达式有dot–notation.号)和bracket–notation[]号)两种不同的表示风格。

例如:

  • $.store.book[0].title
  • $['store']['book'][0]['title']

(3)JSONPath语法

JSONPath语法如下表:

JSON数据如下:

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
30
31
{ "store": {
"book": [
{ "category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{ "category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}

具体示例如下表: