背景:
想要实现部分业务流程通过执行接口生成测试数据。
之前已经通过后置处理器-正则表达式结合后置处理器-debug postprocessor关联参数、通过断言-响应断言实现了单账号登录并创建需求的流程。
这篇文章会记录通过参数化、循环等实现多账号分别创建多个需求的流程。
业务流程
最终的目的:登录不同的账号并通过不同的账号去请求创建需求的接口,最后生成推荐不同商品的需求。
分析
- 共两个接口:登录接口、创建需求接口;
- 创建需求的接口需要登录接口中返回的authKey,这里需要做关联;
- 不同的账号、不同的商品需要做登录账号、商品的参数化;
- 不同的账号各自创建需求,需要做循环、提取不同账号的authKey。
实现方案1
同一线程组设置多个线程数并发
- 创建测试计划、添加需求、authKey关联与上一篇文章中记录的一样,这里就不赘述了。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z3S5SudV-1656032628120)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220622144642484.png)]](https://img-blog.csdnimg.cn/3f45edcafd5f4e80a51150370f0b403b.png)
- 多个账号的参数化 流程中既然说要多个用户,那登录接口肯定是要做用户账号密码的参数化的。我觉得适合做账号密码参数化的方式有两种:用户参数、csv data set config。- 前置处理器-用户参数在登录接口添加前置处理器-用户参数,填写变量名称及对应的值(变量名称自定义填写,可以添加多个变量,一个变量可以有多个值),在填写参数的地方讲变量以${变量名}进行引用即可。

![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-supwdty2-1656032628121)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220622153008936.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XbVMkyyN-1656032628121)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220622153547144.png)]](https://img-blog.csdnimg.cn/baa447c3966841b8b10e93c603ee04a6.png)
用户参数的引用变量后的取值顺序:一个线程始终对应一个取值。![(img-q4rg9gqx-1656032628121)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220622162159873.png)]](https://img-blog.csdnimg.cn/063665ab6cbc4f71a2c0133795a07047.png)举个栗子:这个登录的接口,我在用户参数中配置的四个账号,线程组上设置了三个线程组循环2次,即每个线程执行两次。最终发现,第一个线程在第一次取的账号是用户1,第二次循环也是取用户1,三个线程各自取值后,用户4是一直没有被取到的。![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cI88LzMY-1656032628123)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220622162833253.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xzWpNQNz-1656032628123)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220622163446945.png)]](https://img-blog.csdnimg.cn/4b203f0245944b38a20bcbe4e9ba9152.png)- 配置元件-csv data set config先把变量的值保存在一个文档中,第一列表示第一个变量的值,第二列表示第二个变量的值,两列数据用英文,隔开。
在登录接口添加一个配置元件-csv data set config。![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pRWcudvI-1656032628124)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220622164726316.png)]](https://img-blog.csdnimg.cn/8a353ccf6e2b4b7ba65e295b3530f3df.png)
因为之前配置用户参数时,已经引用过参数了,且参数名称是一样的,这里就可以用之前填写的参数引用,不做修改。把之前设置的用户参数右键禁用后,按照之前线程组的配置执行。发现三个线程每次循环都是取的文件中第一行数据。
emmmm…(你们根本不知道我这一行代表了多么复杂的内心…因为之前看了一篇讲参数化的文章,里面提到了用csv做参数化的时候线程的取值顺序是跟“线程共享模式”相关的。
文章里说的,所有现场模式,就是所有线程组中的所有线程按照排列顺序依次去取csv文件里的每行数据,每次取值是接上次的顺序唯一取值。
那我这里一个线程组下只有一个请求,线程数设置为3,就是三个线程,循环了两次,那应该是每个线程按顺序取文件中的一行数据吧,但是实际每个线程都是取的第一行数据。我…???我又依次试了一下其他的两种线程共享模式。当前线程组,“各个线程组之间隔离,线程组内的线程顺序唯一取值。”
当前线程,“每个线程独立,顺序唯一取值”。
但是,最终的执行结果都是每个线程都取第一行数据,压根没取到第二个…好了,我emo了,还是用我的用户参数吧…) - 设置好用户的参数化后,再执行。
发现他居然执行成功了,而且确实是我们想要的结果,每个用户登录后创建了一条数据。(谁说菜鸟每天没有惊喜呢~)
其实,我之前的方法不是这样的,那么就隆重推出我的planb。
实现方案2
不同线程组分别设置线程数
这个方案是把登录接口放一个线程组,创建需求的接口放在一个线程组,因为不是同一个线程组,所以可能会更灵活一点哦。比如,我只需要三个用户,但是又需要每个用户创建两条数据,在方案一好像就不太能实现了。
- 直接跳过创建测试计划、添加需求、authKey关联、用户账号参数化,快进到两个接口已经成功关联authKey并对账号参数化了。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qOnSuCk8-1656032628128)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220622184644140.png)]](https://img-blog.csdnimg.cn/40aa7c8b4f2d4ee0a22dbdb03bc1242c.png)
- 这个时候发现我需要让每个账号登录后创建两条数据,而不是一个账号创建一条数据。所以要再添加一个线程组,重命名为“创建需求”。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o6UUrqdx-1656032628128)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220623104223988.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K49Oy8h7-1656032628128)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220623104359324.png)]](https://img-blog.csdnimg.cn/f23c54cb742a448db62812f279e12d68.png)
执行接口后,发现创建需求的接口返回“登录过期”。因为之前关联的authKey在同一个线程组内,而现在两个接口在不同的线程组,authKey无法跨线程组传递。这就不得不说一下jmeter元件的作用域问题了。![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bLJS5DaW-1656032628129)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220623105500418.png)]](https://img-blog.csdnimg.cn/eea2138318c3441dbbac06fee30492c0.png)
- 那要让线程组a内的参数能在线程组b内使用,就要设置全局变量了。在login接口添加后置处理器-beanshell postprocessor,在参数中填写要设置为全局变量的变量名称,在script里填写${__setProperty(全局变量名称,被设置为全局变量的变量名,)},其他参数默认即可;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fZg3pn2m-1656032628129)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220623112830446.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ta1KmEBR-1656032628129)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220623113259152.png)]](https://img-blog.csdnimg.cn/3dd37156db05411e857c78d58c3f7141.png)

- 在创建需求的接口中引用全局变量,执行接口并查看执行结果。设置后authKey为全局变量后,需要在创建需求的接口中引用,引用的方法跟普通变量的引用方法差不多,${__property(全局变量名)}。
在查看执行结果后,发现接口的执行顺序并不是按照jmeter中线程组排列的顺序从上到下依次执行的。![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xYy92Wr2-1656032628129)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220623135826373.png)]](https://img-blog.csdnimg.cn/9c4ad9509ae34d7598fb48c8d1778ed3.png)
- 查了一下,发现是jmeter独特的并发机制导致的。可以通过测试计划中设置“独立运行每个线程组”来使接口按序执行。那就来 try 一 try ~在test plan中勾选“独立运行每个线程组”,再执行查看结果。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T2GluVJK-1656032628130)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220623141108489.png)]](https://img-blog.csdnimg.cn/e7317442a98142ecb1754aec1c27606b.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g09xks53-1656032628130)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220623141204339.png)]](https://img-blog.csdnimg.cn/86a1e3f6c8ba4739933fcf6839caea78.png)
- 但是在被测系统系统中查看创建的数据时,发现并没有达到一个账号登录后创建两个数据的目的。emmmm…我想了一下,因为上一个步骤不是设置了线程组独立运行吗,所以实际的运行顺序就是等login的线程组全部运行完后,再运行创建需求的线程组。相当于,我第一个用户登录又退出,第二个用户登录又退出,第三个用户登录,然后自己创建了六条数据…谁是大冤种,我不说…好吧,先把test plan中的“独立运行每个线程组”取消勾选。换一种方法吧。
- 可以把每一次登录后的authkey写入到一个文档里,在创建需求的接口再通过csv data set config一次读取一行数据,来关联两个接口的关系。这个方法再记录一种提取数据的方法,后置处理器-json提取器。先在login接口添加一个后置处理器-json提取器,填写取值表达式和引用变量名。
同样可以通过取样器-debug sampler 或 后置处理器-debug postprocessor验证是否成功提取到参数值。 - 把提取的值写入一个文档。在login接口添加后置处理器-JSR223 后置处理程序,选择脚本语言为java,参数填写要写入的参数名,脚本中填写如下代码:
//创建一个fileWriter对象,文件位置保存在E:\\workSpace\\apiTest\\authKey.csvFileWriter fileWriter = new FileWriter(new File("E:\\workSpace\\apiTest\\authKey.csv"),true);/* * bufferedwriter字符缓冲流 * 高效读写;支持输入换行符;可以一次写一行,一次读一行 */BufferedWriter writer = new BufferedWriter(fileWriter);// 在writer中写入authkey的值并换行writer.append(vars.get("authKey")+"\n");if (writer != null){ writer.close();}if (fileWriter != null){ fileWriter.close();}
执行一下,查看这个文件有没有存储提取的authkey。 - 在创建需求的接口中添加csv data set config,读取的文件选择写入authkey的那个文件。填写一个读取文件参数值的参数名称,再在创建需求接口添加一个信息头管理器,引用这个变量名称即可。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sz5o7z8k-1656032628131)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220623160937631.png)]](https://img-blog.csdnimg.cn/355a3afa3f55422cb5cbd93334feeebc.png)
执行接口,查看运行结果。#### 总结通过不同账号登录创建需求的流程,学习了两种参数化方式(用户参数、csv data set config)、jmeter的作用域、通过beanshell postprocessor设置全局变量、json提取器、JSR223 后置处理程序,还简单了解了jmeter中的线程执行顺序。路漫漫其修远兮~
版权归原作者 要努力的佩佩呀~ 所有, 如有侵权,请联系我们删除。