经常收到微信好友的各种问题咨询,今天分享一个比较有代表性的,希望对大家有所帮助。

一位微信好友的提问


问题如下:

问题分析


先简单介绍下服务端的处理逻辑,关于登录,服务端的逻辑一般是:校验用户名、密码(可能还有验证码,但是压测环境都会特殊处理),成功后,会根据规则(比如拼接时间戳等字符串、加盐、加密),生成一个tokenId,然后存入redis;关于依赖登录的请求,服务端的逻辑一般是:会校验传入的tokenId在redis中是否存在,存在,表示用户已经登录ok了,否则会返回登录超时之类的信息;

我们在压测的时候,有些接口是依赖登录的,常规操作是:使用仅一次控制器,每个账号只登录一次,登录成功后,正则提取到tokenId,此时就存入了当前线程的变量中,然后把此tokenId作为被压测接口的入参;

如果是分布式,我们需要手动把登录用户名参数化文件拷贝到负载机上(注意:loadrunner是自动把脚本和参数化文件分发到负载机上),此时,多个负载机使用的参数化文件内容是相同的,分布式压测的时候,如果A负载机的某个线程先使用qzcsbj这个账号登录成功,tokenId也存入redis了,压测过程中,这个线程就会一直使用这个tokenId值,然后B负载机的某个线程也用qzcsbj这个账号登录成功,生成新的tokenId,此时会把redis里面A负载机生成的值更新,最后,A负载机上那个线程的请求都会失败,这就是这位微信好友的问题。

解决方案



方案一:各个负载机上参数化文件内容不一样,这样就需要更多的用户名;

方案二:避免登录接口的影响,我们可以先单独操作依赖的请求,把需要获取的关联值tokenId存到文件中,被压测的请求就从这个文件中获取tokenId,这样,我们压测的脚本中就不需要登录接口了,只有我们的被压测接口,有人可能会问,tokenId是有有效时间的,那是不是要频繁获取tokenId生成文件呢?当然不是,我们可以找开发帮忙把有效时间设置长点,比如24h,这样,获取一次,就可以用一天了;负载机参数化文件内容相同,如果被压测接口是修改操作,会有数据库锁等待,甚至锁等待超时的情况出现(参考这篇推文里的案例:性能测试:通过一个案例告诉你,性能到底要不要熟悉业务逻辑?);

方案三(推荐):基于方案二,各个负载机上参数化文件的内容都不同;

方案实现举例


下面简单介绍下如何将关联转换为参数化:

1、删除已存在的参数化文件tokenId.txt

注意:因为后面要生成tokenId.txt这个文件,如果这个文件存在,我们先删除。

2、生成参数化的文件tokenId.txt

这里只是演示,假设需要100个账号,线程数设置为100,循环次数设置为1,即每个线程运行一次

a.登录接口需要的csv参数化文件userInfo.dat

注意,此参数化文件中有两列,第一列是卡号,第二列是登录账号,下图抹掉了敏感数据

登录获取参数化文件中的登陆账号userAccount,而卡号cardNumber是被压测接口需要的参数

b.登录请求

正则提取tokenId

c.把关联获取到的值写入文件,因为被压测的接口需要用到tokenId和卡号cardNumber,所以需要把tokenId和卡号配对写在一行上,第一列是tokenId,第二列是卡号cardNumber

生成的tokenId.txt文件,逗号分隔同一行的tokenId和卡号cardNumber两列数据,抹掉了敏感数据

最后,如果有N个负载机,就写个脚本把tokenId.txt的内容拆分为N个文件,比如:tokenId_1.txt,tokenId_2.txt ... tokenId_N.txt,但是,复制到负载机上,文件名都要改为tokenId.txt

name、password为参数化csv文件中的值,加token写新的csv

FileWriter fstream = new FileWriter("C:\\data.csv",true); //写入数据到文件
BufferedWriter out = new BufferedWriter(fstream);
// ","在csv文档中就是向右移一个单元格
out.write(vars.get("name")+","+ vars.get("password") +"," + vars.get("token"));
//换行
out.write(System.getProperty("line.separator"));
out.close();
fstream.close();

  

csv行数

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException; String putNum;
int rowNum=0;
try
{
BufferedReader br=new BufferedReader(new FileReader("D:\\apache-jmeter-5.1.1\\bin\\data.csv"));
String tmpStr=""; while((tmpStr=br.readLine())!=null)
{
rowNum++;
}
rowNum=rowNum-1;
}
catch (IOException e)
{
e.printStackTrace();
}
vars.put("putNum",String.valueOf(rowNum));
log.info("==========CSV行数:" + rowNum);

  

3、被压测接口脚本

被压测接口脚本略,这里只演示参数化文件这样,

这样,被压测接口就可以用上面生成的关联参数文件tokenId.txt了,下面变量名称和生成的tokenId.txt文件中变量顺序要一致

好了,就这样,是不是很简单?

如有不准之处,或者补充,请文末留言,谢谢。

更多案例:https://www.cnblogs.com/uncleyong/p/14098538.html

猜你喜欢

点击阅读☞一篇文章告诉你怎么做性能测试

点击阅读☞如何面试性能测试

点击阅读☞面试题(造火箭必备技能):请举例一个最有成就感的性能bug

点击阅读☞jmeter5.1分布式压

点击阅读☞性能测试案例:redis获取不到连接池,Timeout waiting for idle object

点击阅读☞性能测试案例:tps波动频繁

点击阅读☞性能测试案例:一个频繁fgc问题

点击阅读☞性能测试案例:获取不到redis连接池

点击阅读☞性能测试案例:数据库cpu高导致响应时间长

jmeter分布式导致重复登录的问题、以及写txt、csv、统计行数的更多相关文章

  1. JMeter获取CSV文件行数

    import java.io.BufferedReader; import java.io.FileReader; BufferedReader br=new BufferedReader(new F ...

  2. Asp.Net Form验证不通过,重复登录

    问题产生根源: 当然,其实应该需要保持线上所有机器环境一致!可是,写了一个小程序.使用的是4.5,aysnc/await实在太好用了,真心不想把代码修改回去. so,动了念头,在这台服务器上装个4.5 ...

  3. Asp.Net Form验证不通过,重复登录(.net4,4.5form验证兼容性问题)

    问题产生根源: 当然,其实应该需要保持线上所有机器环境一致!可是,写了一个小程序.使用的是4.5,aysnc/await实在太好用了,真心不想把代码修改回去. so,动了念头,在这台服务器上装个4.5 ...

  4. Windows和Linux的Jmeter分布式集群压力测试

    Windows的Jmeter分布式集群压力测试 原文:https://blog.csdn.net/cyjs1988/article/details/80267475 在使用Jmeter进行性能测试时, ...

  5. Jmeter分布式测试需要注意事项

    Jmeter分布式测试需要注意事项: 1. 如果脚本中有用到CSV Data Set Config,则所有的模拟机都必须在相应的目录下存在该文件.如下图,则必须所有模拟机的F盘下都有user.txt文 ...

  6. linux上实现jmeter分布式压力测试(转)

    摘要:最近根据公司工作的需求,学习了一些压力测试的知识,目前,公司使用的是jmeter进行压力测试.下面就记录下近期的学习.我想将这次的博文分成三个部分:1.开始测试前的准备(测试环境的搭建)2.在一 ...

  7. 『动善时』JMeter基础 — 58、JMeter分布式测试

    目录 1.JMeter分布式测试概念 2.JMeter分布式测试前提条件 3.JMeter实现分布式测试 (1)在执行机中的配置 (2)在控制机中的配置 (3)启动执行机中的JMeter服务 (4)在 ...

  8. jmeter分布式操作-远程启动功能探索

    一.背景: 之前在Jmeter插件监控服务器性能一篇中说到,在非GUI环境中监控时为了保存监控数据需要修改jmeter脚本,并且每次通过施压机(远程服务器,非GUI环境)来压测时都要将jmeter脚本 ...

  9. jmeter分布式测试远程连接失败

    jmeter分布式部署其实很简单.但今天测试的时候发现了一个坑,远程连接一直失败. 原因:服务器上部署了slave,而这台服务器上有多个网卡.举个例子:ip分别为:192.168.100.6,10.1 ...

随机推荐

  1. CTF-sql-order by盲注

    本文章只讨论了order by盲注,关于order by的报错等注入不在本文章讨论范围,另有文章. 让我们先来看看本文章所使用的表的内容,如下图: 接下来先了解一下order by的基础知识: ord ...

  2. 《剑指offer》面试题05. 替换空格

    问题描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20". 示例 1: 输入:s = "We are happy." 输出:"We%20a ...

  3. 《设计模式面试小炒》策略和工厂模式替代业务场景中复杂的ifelse

    <设计模式面试小炒>策略和工厂模式替代业务场景中复杂的ifelse 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统, ...

  4. T-SQL的存储过程

    1.简介 存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时 ...

  5. gin中提供静态文件服务

    package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { // 静 ...

  6. 005 Linux 命令三剑客之-sed

    grep:数据查找定位 awk:数据切片,数据格式化,功能最复杂 sed:数据修改 01 Linux 命令三剑客? 三剑客各有所长,和锅锅一一搞起就是了! sed:擅长数据修改. grep:擅长数据查 ...

  7. 如何使用iconfont的CDN

    如何使用iconfont的CDN iconfont作为阿里的图标库,在开发过成功用的已经是非常广泛了,但iconfont并不需要将图标下载后使用,而是可以直接用cdn引入使用,至于使用流程,请看下文. ...

  8. db2日志模式、备份归档、恢复解析

    DB2的日志分为两种模式,日志循环与归档日志,也就是非归档和归档模式.下面就具体介绍一下这两种方式以及和备份归档设置的关系. 一.日志循环 这是默认方式,也就是非归档模式,这种模式只支持(backup ...

  9. python23day

    内容回顾 面向对象 类:是具有相同属性和相似功能的一类事物 对象/实例:具体的,一类可以有多个对象 实例化 练习 # 定义一个圆形类,半径是这个圆的属性,实例化一个半径为5的圆形,一个半径为10的圆形 ...

  10. Android安卓开发-记账本布局

    账单页面布局统计页面布局我的页面布局主页面加号记账页面布局.点击记账页面记账类别布局点击收入页面收入类别布局统计页面支出布局统计页面收入布局查询页面布局数据库设计字段一,支出id和收入id分配字段二, ...