jmeter--beanshell(六)

一、beanshell是什么?

BeanShell是一个小型嵌入式Java源代码解释器,能够动态地执行java代码,不需要提前编译。

为什么要用beanshell?
主要用来编写测试脚本、处理测试数据。
比如:使用beanshell调用自己的工具类完成jmeter无法实现的功能。

官网:https://beanshell.github.io/download.html

如果要使用beanshell,就需要使用beanshell的jar包。

jmeter中,已经自带了beanshell的jar包(lib目录下bsh-2.0b6.jar)

在这里插入图片描述

二、常用内置变量

JMeter在它的BeanShell中内置了对象变量,用户可以通过这些对象变量与JMeter进行交互。
对象是封装了方法,可以直接通过变量去调用方法实现一些功能。

1.log:打印日志

①日志级别

把日志写到bin目录下的jmeter下的log文件
日志级别:trace < debug < info < warn < error
最常用日志级别是debug 、 info 、warn 、error

debug是开发人员调试进行使用的。
info是用来打印一些正常操作
warn 是用来打印警告信息
error是用来打印错误信息

在这里插入图片描述
日志级别修改:选项–日志级别

log是调试用。
JMeter日志默认是info级别,info只能传字符串String,不能传数字
JMeter日志若是info级别,可以打印info 、warn 、error级别的日志。

②用法

log.info("=============info");

③演示

此处需要添加一个beanshell取样器
在这里插入图片描述
运行,显示结果

在这里插入图片描述
没有输出debug
在这里插入图片描述
去jmeter.log验证一下

在这里插入图片描述

此处也有内容
在这里插入图片描述
info只能传字符串String,不能传数字

假设传int:

log.info(1);

报错信息Error in invocation:Method info(int ) not found in class ‘org.apache.logging.slf4j.Log4jLogger’
解决办法:需加上空字符传变成String类型,如:log.info(“”+1);
假设传对象:要想传对象,解决办法:需转成String,log.info(u.toString());对象有toString方法,没有重写,调用的则是object类的toString的方法。
在这里插入图片描述
在这里插入图片描述

class User{}
User u =new User();
log.info(u);

2.控制台输出

指在GUI界面的黑框,把内容输出到GUI界面的黑框上。
在beanshell中写入如下代码,都会在控制台打印出。

System.out.print("hello");
print(1);

beanshell、jsr223(性能更好)
Out,仅在JSR223中支持
用控制台输出信息比较少,一般都是用log打印日志比较多。

3.prev(对象)

beanshell后置处理器的内置对象

api:https://jmeter.apache.org/api/org/apache/jmeter/samplers/SampleResult.html

提供了很多方法
在这里插入图片描述
脚本做一下
用之前登录脚本演示

添加beanshell后置处理程序
在这里插入图片描述

对象的属性和方法都可以打印出来。
主要是针对请求的内容(请求头、响应头、请求内容、响应内容、http的code、http的message)
可以把参数拼在路径后:/download?fname=test.txt

①获取线程组名称

直接打印
在这里插入图片描述

log.info("===Thread Name: " + prev.getThreadName());
②获取取样器时间

在这里插入图片描述

在这里插入图片描述
此处演示都是通过log.info打印出来,实际工作中获取这个值后要用的话,先要将他赋值给一个变量,再针对这些数据进行处理。


开始采样时间
log.info("" + prev.getStartTime());//获取13位的时间戳

结束采样时间
log.info("" + prev.getEndTime());//获取请求的结束时间

响应时间
long reqtime = prev.getEndTime() - prev.getStartTime();//获取请求的耗时
//相减后是long类型,拼接字符串“响应时间”就变成字符串
log.info("响应时间:" + reqtime);
③获取请求内容
log.info("Request: " + prev.getSamplerData());

展示请求方式、请求地址、请求的数据
在这里插入图片描述
和查看结果树里请求一样

在这里插入图片描述

④获取请求头信息
log.info(prev.getRequestHeaders());

在这里插入图片描述
和查看结果树里的header一样
在这里插入图片描述

⑤获取http响应code
log.info(prev.getResponseCode()); 

在这里插入图片描述
和查看结果树的取样器结果一样

在这里插入图片描述

⑥获取响应头信息
log.info(prev.getResponseHeaders());

在这里插入图片描述

设置响应头信息,prev.setResponseHeaders(“302”);

⑦获取响应内容(重要)

有的时候需要对响应内容进行处理,如提取数据。

log.info(prev.getResponseData());
log.info(""+prev.getResponseData()); 
log.info(prev.getResponseDataAsString());
log.info(prev.getResponseData()):报错信息Error in method invocation: Method info( [B ) not found in class'org.apache.logging.slf4j.Log4jLogger'

prev.getResponseData()该方法返回的是字节数组,没有找到,把返回的数据写到文件里,定义相关的变量接,定义一个字节数组,解决办法:加空字符串,log.info(“”+prev.getResponseData());

在这里插入图片描述

若转成易读的字符串,解决方案是log.info(prev.getResponseDataAsString());
返回的就是json
在这里插入图片描述

⑧设置响应结果的编码
prev.setDataEncoding("utf-8");

场景:出现乱码,解决办法:a.改配置文件 b.用后置处理器设置编码,prev.setDataEncoding(“utf-8”)或prev.setDataEncoding(“GBK”)

⑨获取请求URL
log.info(prev.getUrlAsString());

通过此方法将url转成string
在这里插入图片描述

4.vars:定义变量与调用变量(重要)

用来操作jmeter中的变量,可以用来定义变量,也可以用来获取变量。
api文档
[https://jmeter.apache.org/api/org/apache/jmeter/threads/JMeterVariables.html]
看一下它的用法

①value为String(key都是String)

重要的方法:vars.get(String key)、 vars.put(String key,String value)
对对象get、put: putObject()、 getObject()

添加变量

在这里插入图片描述
获取变量,前面跟上key,即name

在这里插入图片描述
他是String类型,可以赋值给一个变量,并将name的值打印出来
在这里插入图片描述

之前说过,获取变量的值可以通过 方式获取 b e a n s h e l l 此处可以用 {}方式获取 beanshell此处可以用 方式获取beanshell此处可以用{}方式吗?

变量放进去了,再添加一个调试取样器,再添加一个监听器

在这里插入图片描述

在这里插入图片描述
运行,在调试取样器的响应数据处看到设置的变量

在这里插入图片描述

在beanshell此处用${}方式获取演示一下,看是否能获取到?
不能获取到,会报错
在这里插入图片描述
在beanshell中获取变量是用vas.get()方式获取

注意: log.info(vas.get("name"));
在beanshell中不能用${name},
log.info(${name})),会出现报错,报错信息为log.info() Attempt to access property undefined varible or class name,而只能用vars.get(String key)的方式

再添加一个mock取样器
此处注释
在这里插入图片描述
此处添加${}
在这里插入图片描述

非beanshell中可以用 n a m e 获取到变量 n a m e 中的值 j a c k 之前将后置处理器正则时,提取到变量后,就可以用 {name}获取到变量name中的值jack 之前将后置处理器正则时,提取到变量后,就可以用 name获取到变量name中的值jack之前将后置处理器正则时,提取到变量后,就可以用{}方式进行获取

beanshell设置的变量(通过vas.put()设置的变量就不能用${}方式进行获取)
在这里插入图片描述

②value为Object(key都是String)

Object是所有类的父类,此处就可以传任意类型,可以传List、Map等,这种就是父类的引用执行子类对象,即就是多态。
putObject(String key, Object value)

在这里插入图片描述

此处直接就定义一个list,将对象传进去
在这里插入图片描述
获取
getObject()后跟上参数key,返回的是Objetc类型

在这里插入图片描述
再定义一个obj接收他的值
在这里插入图片描述
输出,只能输出String类型,还需要调toString方法

在这里插入图片描述

将list内容打印出来
在这里插入图片描述

跨线程组在压测中,其实用不到的。压测中涉及到关联,放在一个线程组里,会针对业务比例设计压测比例。
跨线程组自动化过程中用到。
例2:Object类型:List类型

List list=new ArrayList();
 list.add("jack");
 list.add("zhangsan");
 vas.putObject("list",list);
log.info( vars.getObject("list").tosString());

③变量不能跨线程组

演示:需要两个线程组
第一个线程组是登录
第二个线程组是一个mock取样器
将第一个线程组的token传到第二个线程组。相当于是串行
登录后拿去到tocken后。第二个线程组才去执行。不是串行,就会导致若第二个线程组更快的话,就会获取不到上一个请求的token。
在这里插入图片描述
先在测试计划处设置一下

在这里插入图片描述
验证一下是串行

再添加一个定时器设置为5000
在这里插入图片描述
验证完后,再删掉定时器
在第一个线程组的mock取样器里获取一下正则获取到的token
在这里插入图片描述

在第一个线程组的mock取样器里也获取一下token,看是否能获取到
在这里插入图片描述
运行查看
第一个线程组里获取到token,第二个线程组未获取到token

在这里插入图片描述

再验证添加一个beansehll后置处理处理程序看是否能传

在这里插入图片描述

baneshell获取变量vars.get(“token”);
他是一个字符串,再定义一个字符串token2
再进行打印

运行后,获取到token的值

在这里插入图片描述
将变量token的值put到一个变量,重新定义一个key是token3,token2传进去
在这里插入图片描述
此处改成token3

在这里插入图片描述

在这里插入图片描述

现在是验证vars.put()这个变量是否能跨线程组?
运行,查看结果树

token3是put进去的
在这里插入图片描述
第一个线程组获取到token3
第二个线程组未获取到token’3
在这里插入图片描述
证明变量是不能跨线程组

至于要怎么传递,下面有方式介绍

例1:非Object类型:String类型,key、value
作用域: 定义的变量只限制当前线程组,变量是线程是独享的,不是共享的。
设置的变量不能跨线程组,如果要传,把变量设置为属性(props),只能传字符串、不能传对象,通过调用属性的方式调用值。
vas.put(“name”,“zhangsan”);

5.props:设置属性与调用属性

jmeter属性
用来操作jmeter属性(设置属性、获取属性)
这个属性有一个特点:是所有线程共享的。

两个线程组之间的变量不能传递,要想传递,把共享的变量用props设置为属性,此处就可以解决。

演示一下

还是传token
此处需要先做一个设置,看是否设置属性成功
将jemeter属性改成true

在这里插入图片描述

改一下脚本

此处通过vars.get()获取到变量
可以通过props.put()将变量设置为属性,前面也是key,后面为value

在这里插入图片描述

将第二个线程组禁止,查看调试取样器中属性是否设置成功
设置成功
在这里插入图片描述

第二个线程组打开
获取属性和获取变量有差异

获取属性需要通过一个函数:_ _property

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
运行

在这里插入图片描述

若跨线程组传变量,就先设置成属性(在所有线程组里是共享的)

再添加一个调试取样器

在这里插入图片描述
调试取样器1、2中都有token3
在这里插入图片描述

在这里插入图片描述

以上就是变量不能跨线程组的解决方案

若想获取属性,就用props.get()

在这里插入图片描述

props - (JMeterProperties):属性是所有线程公有的,通过props.put()来修改属性,props.get()来获取属性,两个线程组之间的变量不能传递,要想传递,用props,只能传字符串。
设置属性props.put(“age”,"18”);属性还可在调试取样器中看,Jmeter属性设置true
移除属性 props.remove(“age”);
获取属性需借助函数:_ _property

6.Failure

查看接口调用能否成功,假如返回false是成功的,true是失败的
主要用在beanshell断言中

7.FailureMessage

失败时可以设置失败的信息

失败信息,没有设置的时候失败信息是空的,能set这个信息

三、自定义函数

beanshell某些代码若需要多次使用,可以自定义为函数。要使用的时候就直接调用就可以。

1.方法返回类型为void

public static void fun(){

int a=1;
int b=2;
vars.put("sum",""+(a+b));
}
fun();

2.方法返回类型为String

public static String fun(){

int a=1;
int b=2;
int sunm=a+b;
return ""+sum;

}

String sum_=fun();
vars.put("sunm","sum_");

3.方法不写返回类型

 fun(){

int a=1;
int b=2;
int sunm=a+b;
return sum;

}

String sum_=""+fun();
vars.put("sum","sum_");

4.定义的变量也没类型

 fun(){

int a=1;
int b=2;
int sunm=a+b;
return sum;

}

 sum_=fun();
vars.put("sum",""+sum_);

建议按照java的方式写,严格定义

四、BeanShell 在 JMeter 的实际应用

常用:beanshell预处理程序、beanshell后置处理程序、beanshell断言

4.1.beanshell预处理程序

4.1.1模拟前端对请求中密码进行MD5加密

①方法1:beanshell前置处理器

第一步:打包
第二步:调工具类的 DigestUtils.md5Hex()方法进行加密
第三步:获取到加密的字符串后将其放到变量中
第四步:取样器获取数据就会读取到
以上就是beanshell预处理程序

入参提前做一些处理,如:加密请求参数等
前端是先给密码做了一些加密再进行传输,直接去调后端接口,就需要模拟一下前端的操作。

加密的话需要用到一个jar包
jmeter的lib下有commons-code-1.11.jar,可以直接用

演示:
此处只是为了演示

添加一个线程组
mock取样器

在这里插入图片描述

mock取样器传的参数,密码需要加密
添加一个前置处理器:beanshell预处理程序

在这里插入图片描述

建议先在idea中编写代码,因为jmeter中没有错误提示信息
添加jar包
在这里插入图片描述
在这里插入图片描述

创建一个test类

在这里插入图片描述
传123456进行加密

在这里插入图片描述

在这里插入图片描述

加密后就是这个字符串
在这里插入图片描述
注册账号时也是使用的MD5加密,验证是否一样?
一样的

在这里插入图片描述
idea写好后,就复制粘贴到beanshell中

直接导包
通过类调静态方法,获取到一个加密的字符串

在这里插入图片描述

此时就可以放到变量中,vars.put()

在这里插入图片描述

在mock取样器直接就可以获取这个变量了
在这里插入图片描述

在这里插入图片描述
运行,查看结果,获取到变量

在这里插入图片描述
调试取样器中查看就是刚才put进去的变量

在这里插入图片描述

②方法2:引入外部java文件

开发写了一个相关功能的java文件,是其他加密方式,可以让开发直接将开发文件引入就行。

演示:
写一个java文件,可以进行加密,需要去定义方法。
定义一个类,定义一个静态方法
返回加密的字符串,方法类型就是String

后面加密字符串,就需要传进去,即就是定义形参进行接收

package com.qzcsbj;
 
import org.apache.commons.codec.digest.DigestUtils;
 
 
public class MD5Util {
    // 借助apache工具类DigestUtils实现
    public static String encryptToMD5(String str){
        return DigestUtils.md5Hex(str);
    }
    public static void main(String[] args) {
        String res = encryptToMD5("123456");
        System.out.println(res);
    }
}

在这里插入图片描述
调试好后,文件在beanshell可以进行使用
引用上面的java文件

source("D:\\MD5Util.java");

在这里插入图片描述

beanshell中就可以调用刚才定义刚才的方法encryptToMD5()
调用时传一个实参123456,返回String,就定义一个String类型的变量进行接收
获取到加密后的字符串后,就put到变量中

source("D:\\MD5Util.java");
String res = MD5Util.encryptToMD5("123456");
vars.put("password_md5",res);

在这里插入图片描述

取样器
在这里插入图片描述

运行查看结果

调试取样器中有了
mock取样器中也有了

在这里插入图片描述

在这里插入图片描述
说明引入外部java文件也可以实现模拟前端对请求的密码进行加密。

③方法3:jar包方式

此处就需要创建maven项目
maven就是项目管理和项目构建的工具。

maven作用:管理项目(项目比较大的时候,会进行拆分,将一个项目分成多个模块,每个模块就对应一个工程,工程和工程间又存在依赖关系,此时就可以用maven的依赖机制帮我们给项目与项目之间进行依赖关系)、管理jar包(如解决jar包的冲突、可以自动下载jar包)、自动化构建

使用maven的好处
若实现某些功能的话,可以不去造轮子,直接去使用别人写好的类就行。

先创建一个maven项目
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
pom.xml文件就是项目对象模型
pom文件是maven的核心配置文件
一个maven项目就只有一个核心配置文件且文件必须在项目的根目录下
在这里插入图片描述
关于pom又涉及到一些概念,坐标
这就是坐标
坐标的目的就是其他项目可以使用此项目生成的jar包
坐标必须唯一
在这里插入图片描述

坐标的几个元素
主要是
groupid就是组织id,即就是当前模块所属的项目
artifaceid模块id,即就是模块名
version当前的版本号

直接在pom文件中加上坐标
加依赖

在这里插入图片描述

加密需要一个jar包,jar包的坐标可以在maven’仓库搜索
在这里插入图片描述

在这里插入图片描述

写代码

在这里插入图片描述
在这里插入图片描述

运行后没问题,进行打包

先清除

在这里插入图片描述
再进行packeage,把当前的项目进行打包成jar包

在这里插入图片描述
看到这个表示打包成功
在这里插入图片描述

在target处就可以看到jar包

在这里插入图片描述
现在把jar包复制粘贴到jmeter的lib/ext目录下

在这里插入图片描述

jmeter重启一下,其实就相当于定义了一个工具类
再进行导包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行,调试取样器、mock取样器都获取到结果
在这里插入图片描述

在这里插入图片描述
md5加密是有函数。
重点需要掌握方法二方法三。

     自定义beanshell:加密密码
    jmeter的lib下有commons-code-1.11.jar
    对一个账号的密码改为只是对123456进行MD5加密的密码
    对请求中密码加密

方法一:非beanshell

${__digest(MD5,123456,,,)}

使用自带函数
方法二:beanshell前置处理器(beanshell预处理程序)

import org.apache.commons.codec.digest.DigestUtils;  // jmeter的lib下:commons-codec-1.11.jar
String password_md5 = DigestUtils.md5Hex("123456");
log.info("========"+password_md5);
vars.put("password_md5", password_md5);

如果是大写,调用字符串方法toUpperCase
方法三:引入外部java文件
引入一个java文件;如果有依赖包,要把依赖jar包放jmeter的ext目录,也可以下面jar包方式
方法四:jar包方式【任务】
方法五:引用外部class文件

4.2beanshell后置处理程序

如果在请求后对返回的结果进行处理就需要用到beanshell后置处理程序

4.2.1关联演示

演示:提取args的值中,最后一个逗号后面的字符串
方案就是jsonpath+beanshell

{"code":20000,"msg":"成功","data":{"total_page":1,"count":13,"current_page":1,"size":15,"results":[{"uuid":"MPgxSoq4wpqaTvePaQpEUU","title":"公共课协议","image":"https://oss.test.cn/vip/file/20220107113645iJ3u.png","icon":"","order":8,"redirect":{"args":"a5cLH6Xmk5vvPpCWsKLiSD,JS8Tr7SHH78FKwD6CTbMRD,woLgrKts5s9Q4huajoCGHS","tp":3}}]}}


新建一个线程组,再添加一个mock取样器
希望数据返回

在这里插入图片描述

运行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这就是他的数据的格式
是要提取args的值中,最后一个逗号后面的字符串
在这里插入图片描述

其实就是提取它

在这里插入图片描述

之前讲过,如果是返回json,可以用jsonpath,jsonpath可以获取args
但是此处是讲获取其中一部分字符串,所以此处单纯通过jsonpath不能一步到位
此处需要配合beanshell对结果进行处理,最终获取目标字符串。
此处先用jsonpath可以先把args获取

在这里插入图片描述

看一下它的结构

$.data后面又是一个map,后面再.results,results后面是一个数组,数组里又是这个元素(map)
在这里插入图片描述
取第一个元素就为0
在这里插入图片描述
此处就获取到了

在这里插入图片描述
-----的意思就是获取不到value就给他一个默认的值-----
在这里插入图片描述
运行,查看调试取样器,获取到args
在这里插入图片描述
通过beanshell进行做处理
添加beanshell后置处理程序
在这里插入图片描述
将变量获取到,他是一个String类型
再进行打印,看是否能获取到
此处可以获取到变量
在这里插入图片描述
可以通过逗号进行分割
就需要用到字符串里String的方法split
通过逗号分割,返回的是字符串数组

在这里插入图片描述

在这里插入图片描述
就获取到字符串数组
在这里插入图片描述

获取到字符串数组过后,需要获取到它最后一个元素
最后一个元素,可以用数组.length-1
再定义一个变量res,他的索引从0开始,最后一个元素就是length-1
在这里插入图片描述
trim去掉左右两边的空格
在这里插入图片描述
运行,调试取样器就获取到args最后一个元素的值

在这里插入图片描述

4.2.2关联转参数化演示

关联转参数化主要在单场景下使用。
在单场景中不建议包含其他非被测试接口
如:要测试添加商品,添加商品依赖登录的token,此处就不建议将登录接口添加到添加商品的线程组下。
所以需要先去把登录的token提取出来写到一个文件里,后面依赖token的地方,直接参数化就可以。
此处来获取token

我们需要写文件,需要用到bufferwriter
在这里插入图片描述
导包
在这里插入图片描述
bufferwriter缓冲字符输出流,为字符输出流添加缓冲

bufferwriter有两个构造方法,可以传writer,还可以传writer,int
在这里插入图片描述
先看writer是什么

writer是一个抽象类

在这里插入图片描述
若要传writer对象的话,肯定不能来new writer
需要看它的实现类,继承了outputStreamWriter
在这里插入图片描述
需要new FileWriter对象

在这里插入图片描述
创建一个测试类,先在idea中将主要的代码先写一下

在这里插入图片描述

new BufferWriter里需要传Writer
writer是一个抽象类,不能new writer,就需要去new writer的子类

在这里插入图片描述
FileWriter的构造方法
在这里插入图片描述

可以直接将文件的路径传进来,用最后一个构造器

boolean,如果是true就表示追加
如果文件存在,不会被覆盖

在这里插入图片描述在这里插入图片描述
下面直接去写
在这里插入图片描述

看一下D盘是否生成txt文件
此处已生成
在这里插入图片描述
将txt文件复制到beanshell中
导包
将刚才的java代码复制粘贴到beanshell中

此处用bufferwriter就是为了减少与磁盘io进行交互,提高效率

在这里插入图片描述

此处的write是写token

在这里插入图片描述
此处肯定不止写一个token,肯定需要换行
在这里插入图片描述
此处是一个线程
在这里插入图片描述
查看是否写进去

在这里插入图片描述
在这里插入图片描述

写进来
在这里插入图片描述

多来几个线程,获取token时,每个用户只登录一次就行
若循环去登录的话,前面的token就会失效,到时候这个token.txt文件中有一些数据就不能用,循环次数只能写1

在这里插入图片描述

运行
在这里插入图片描述
在这里插入图片描述

获取到5个登录的token
后面要用这些token就可以直接做参数化了
添加商品时就不需要再去添加登录请求获取token再做关联了
这里就是直接就关联转参数化了
这里在做单场景时非常有必要,混合场景时已经把关联转化成了不同的压测场景。

4.3.BeanShell断言

验证返回结果的正确性

①返回json:{“code”:“0”,“msg”:“success”}

演示
添加一个线程组,添加一个mock取样器

在这里插入图片描述

运行

在这里插入图片描述

用beanshell来做断言
返回的结果是一个json字符串,用beanshell需要去解析json字符串
可以先在idea中写代码
这里要用到fastjson,需要将fastjson的依赖添加进去

在这里插入图片描述

验证一下,下载好了

在这里插入图片描述

假设字符串获取到了
先定义一个字符串

在这里插入图片描述

下面就进行解析这个字符串,验证code看是否与我们期望的一样
此处的code为0
此处就需要用到Json
在这里插入图片描述
现在就是jsonobject对象
同时也是一个静态方法,直接类名.方法名
再获取他的code的值

在这里插入图片描述

在这里插入图片描述
将code传进去,此处就获取到String在这里插入图片描述
下面就进行判断
字符串比较用equals
期望是1
如果不相等,不相等就可以去设置file结果和file的message的内容

在这里插入图片描述

后面可以到beanshell中写
添加beanshell断言

在这里插入图片描述
导包

在这里插入图片描述

在这里插入图片描述
获取返回的结果

在这里插入图片描述
后面就通过fastjson来进行解析
此处获取到code值
在这里插入图片描述

可以一个期望值,期望的code为1
在这里插入图片描述

判断,将fastjson解析后的code传进去

在这里插入图片描述
期望是1,实际返回是0
就不会执行if代码块内的代码,想要他执行的话,加一个非,变成true,执行里面的代码,就可以给Failure 和FailureMessage 赋值
在这里插入图片描述

此处Failure不相等
FailureMessage可以给他赋一个字符串断言失败

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
改一下,改成0

在这里插入图片描述

在这里插入图片描述

②返回非json:访问百度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值