beanshell打印日志,shell 打印日志

http://www.itjxue.com  2023-01-15 09:08  来源:未知  点击次数: 

jmeter 小脚本 BeanShell PreProcessor vars.get

可以用jmeter写一些小脚本。

背景:测试一个职位需要投递20个人投递,比较麻烦,不想手工投递,就来偷个懒

思路:用CSV参数化用户,获取用户的cookie,再去投递就OK。

历程:

1、HTTP Cookie 管理器,我所知道的用法就是直接加这个主件就行了,但是,重来没好用过,pass

2、信息头里,放cookie,信息头放在请求下。

这里写成cookie,就OK,但是请求头里,是看不到cookie的,

这里写成cookies,但是请求头看得到cookie,但是请求就不通。

方法1:

骚操作:

用正则表达式获取cookie,因为是2个cookie要拼接。就直接在信息头里写的,结果居然可以,但是已投递的,返回的结果是对的,没有投递的简历,返回结果是“该简历已删除,无法投递”,但是我的简历没有删除,后来问了开发,中间差了个选择简历的接口。

想把cookie打印出来看看,debug sample看不到,写到BeanShell PostProcessor ,直接打印cookie,打印出来的是null

把这个cookie再放在一个用户自定义变量,打印出来,就是【AAA_XSESSION_ID="${chy_token}";AAA_XSESSION_ID_EXP="${EXP}"】

方法2:写个小脚本,舍近求远

结果:纵使觉得天衣无缝,结果请求还是不成功,就当练手了。

脚本里来打印cookie,看看对不对,再把这个cookie返回给jmeter外部用,就是vars.get。vars.put

vars.get:jmeter中定义的变量,拿进来还需要再定义一次。

vars.put:beanshell里定义的变量,拿出去在jmeter中用,就要put出去。

log.info:打印

拼接字符串:用+,字符串中有引号的,单引号,双引号套用。

每句话结尾记得打分号;

具体格式如下:

import org.json.*;

import java.lang.Integer;

import java.lang.String;

import java.lang.Math;

EXP= vars.get("EXP");

chy_token= vars.get("chy_token");

//拼接字符串

String cookie="AAA_XSESSION_ID="+'"'+EXP+";"+"AAA_XSESSION_ID_EXP="+'"'+chy_token;

vars.put("cookie",cookie);

log.info(cookie);

Jmeter跨线程组传递token失败

在用Jmeter进行业务流程接口测试的时候,因为有多个线程组,但是所有的接口都依赖于登录接口。原先处理方式是每一个线程组里都添加一个登录接口,但是后面发现这样不是很友好,每次执行一个线程组都要调一次登录接口。所以想把登录接口提出来,单独放在一个线程组里。

实现流程大概这样:

一、建一个线程组,将登录接口添加进来

二、添加一个BeanShell Sample

里面写上提取cookie值的脚本,大致如下图

(因为测试的登录接口,响应头中返回的数据中有两个值所以分别提取两次)

三、完后,添加一个后置处理器,将提取到的值设置为全局变量

四、然后在其它线程组中添加cookie管理器,并添加引用上面设置的全部变量

问题开始出现:

所有配置完成后,开始执行,结果查看发现除登录外的其他线程组中的接口全部请求失败,原因“”用户未登录“”。

然后一通检查,添加日志,将过程都打印了出来,发现没什么问题。

然后又又又检查了一遍,发现在测试计划最外层添加了一个cookie管理器(如果最外层添加了cookie管理器,优先级要比线程组内的高,导致最终没有走线程组内设置的值)。将这个cookie管理器禁用后,成功调通。

beanshell断言比对数据库数据是否一致是否有日志

第一步:用sql分别查出商品数和收藏夹数,然后拼接成“12/17”的形式;

第二步:提取出响应数据的count值;(这一步其实有很多种实现方法,比如用jsonpath也可以提取,但本次用的是BeanShell取值哈)

第三步:将提取出的count与数据库查询说来的拼接值做对比,判断是否一致

我想请教万能的java8,beanshell脚本怎么用

我们讨论的所有标准命令都是在“path /bsh/commands”目录下的 BeanShell JAR 文件里。

给BeanShell 提供添加到“预制式”的命令同编写任何其他 BeanShell 方法一样简单。你只需要将你的脚本使用和命令同样的名称放到文件里并把文件放到 classpath 中。然后,你可以使用 importCommands() 方法来“import”命令。

命令文件可以被放在 BeanShell 的 classpath 中的任何地方。你甚至可以随时使用 addClassPath() 或者 setClassPath() 命令来添加新的命令目录或者包含命令的 JAR 到你的脚本里。

Hello World例如,让我们做一个 helloWorld() 命令:

// 文件: helloWorld.bsh

helloWorld() {

print("Hello World!");

}将helloWorld.bsh 命令文件放到一个目录或者 classpath 的 JAR 文件里并使用 importCommands() 命令来导入它。你可以为 Java 外部得设置 classpath 或者在 BeanShell 里使用 addClassPath() 来设置。例如,假设我们已经将文件放置到路径“/home/pat/mycommands/helloWorld.bsh”里。我们然后可以这么做:addClassPath("/home/pat"); // 如果它不再我们的 classpath 里

importCommands("/mycommands");

现在我们可以使用 helloWorld() 就像其他 BeanShell 命令。

helloWorld(); // 打印 "Hello World!"

importCommands() 将接受一个“资源路径”样式的路径名称或者一个 Java 包名。简单地根据需要转换为一个资源路径或者 Java 包名,两者任选其一来载入脚本或者编译的 BeanShell 命令类。一个相对路径(比如“mycommands”)通过在前面加上“/”变成绝对路径。

例如如果你已经将 BeanShell 命令和你的 classpath 里名叫 com.xyz.utils 的 Java 包里的其他类放在一起,你可以通过这些命令来导入:// 等价的importCommands("com.xyz.utils");

importCommands("/com/xyz/utils");导入命令的作用域就像导入的类。所以如果你在一个方法或者对象里导入命令或,那么它们就在那个作用域里本地化了。

运行效果因为当前的 classpath 中不存在 helloWorld() 命令,也没有对其进行导入,所以会出现如上错误(即找不到该命令)。

(责任编辑:IT教学网)

更多

推荐网页文字特效文章