每周读书与学习是由清华大学出版社出版的《JMeter核心技术、性能测试与性能分析》一书的作者推出,分享作者多年的IT从业经历,希望对很多计算机科学技术IT类专业毕业生以及IT从业者有所帮助。
在前面的学习中,介绍了很多Jmeter的理论知识,包括Jmeter中很多不同元件的详细介绍以及每个元件的作用,本次主要从实践的角度来介绍怎么用这些元件来完成常见性能测试脚本的编写,将会介绍一些常见的性能测试脚本编写案例。
在上一次分享中,分享了JMeter性能测试脚本编写实战之如何实现用户需先登录,然后再请求别的接口,本次将继续分享JMeter性能测试脚本编写实战。
1、前一个请求返回的结果作为后一个请求的入参
在性能测试中,除了会对单个接口请求进行性能压测外,也经常会遇到一些比较复杂的场景,比如需要同时对两个不同的接口请求进行性能压测,并且前一个接口请求返回的结果需要作为后一个接口请求的入参,如下图所示就是一个实际的示例演示,这个示例是以调用http://www.nmc.cn/rest/province/ 接口获取中国每一个省份或者直辖市下有哪些具体的城市信息来作为例子进行演示的。
从上图中可以看到,由于获取每个省份或者直辖市下的具体城市信息时,需要先获取到该省份或者直辖市的代码,然后在调用http://www.nmc.cn/rest/province/ 接口时,传入对应的代码,来获取该省份或者直辖市下有哪些具体的城市信息,由于一开始并不知道每个省份或者直辖市的对应代码是啥,所以第一步需要先通过省份或者直辖市的名称来调用接口获取该省份或者直辖市对应的代码,在获取到省份或者直辖市代码后,再通过代码作为入参调用接口获取其下对应的所有的城市信息。
在理清了调用接口的先后顺序后,就可以先将所有的省份和直辖市数据作为一个参数化数据,因为在中国所有的省份和直辖市的名称是已知的,在Jmeter中,通常建议使用配置元件下的CSV 数据文件设置来进行参数化设置,如下图所示,在文件名设置中选择省份和直辖市对应的参数化数据文件的绝对路径,并且设置文件编码为utf-8,即表示通过utf-8的编码格式来读取参数化数据,避免出现乱码的情况,因为省份和直辖市名称都是中文形式的数据,如果编码格式选择不合适的话,可能会出现读取名称出现乱码的情况,在实际性能测试中,出现乱码时,通常都建议去排查下数据文件的编码格式和在Jmeter中设置的编码格式是否一致,如果不一致的话,通常就会产生乱码。在设置完文件编码后,在变量名称中设置provinceName来作为变量来存储读取到的省份或者直辖市名称。
在参数化数据文件中,需要将所有的省份和直辖市的名称写入,如下图所示。
在做完参数化设置后,就可以添加一个取样器来调用第一个接口http://www.nmc.cn/rest/province,如下图所示,该接口不需要传入任何的参数,因为直接访问该接口时,会返回所有的省份或者直辖市名称对应的代码信息,由于该接口是一次返回了所有的省份或者直辖市名称对应的代码信息,所以如果需要通过某个省份或者直辖市名称来找到对应的代码,还需要添加一个后置处理器元件,由于该接口返回的数据是JSON格式的数据,所以可以选择后置处理器下的JSON JMESPath Extractor来对返回的JSON数据进行后置处理来获取某个省份或者直辖市名称对应的代码信息,并且由于需要确保该后置处理器和该取样器进行匹配处理,所以在这里选择了逻辑控制器下的简单控制器来进行了一个单独的分组,该分组的作用就是确保JSON JMESPath Extractor这个后置处理器直接处理该取样器返回的数据。
如下所示是http://www.nmc.cn/rest/province接口返回的所有的省份或者直辖市名称对应的代码信息。
[{"code":"ABJ","name":"北京市","url":"/publish/forecast/ABJ.html"},{"code":"ATJ","name":"天津市","url":"/publish/forecast/ATJ.html"},{"code":"AHE","name":"河北省","url":"/publish/forecast/AHE.html"},{"code":"ASX","name":"山西省","url":"/publish/forecast/ASX.html"},{"code":"ANM","name":"内蒙古自治区","url":"/publish/forecast/ANM.html"},{"code":"ALN","name":"辽宁省","url":"/publish/forecast/ALN.html"},{"code":"AJL","name":"吉林省","url":"/publish/forecast/AJL.html"},{"code":"AHL","name":"黑龙江省","url":"/publish/forecast/AHL.html"},{"code":"ASH","name":"上海市","url":"/publish/forecast/ASH.html"},{"code":"AJS","name":"江苏省","url":"/publish/forecast/AJS.html"},{"code":"AZJ","name":"浙江省","url":"/publish/forecast/AZJ.html"},{"code":"AAH","name":"安徽省","url":"/publish/forecast/AAH.html"},{"code":"AFJ","name":"福建省","url":"/publish/forecast/AFJ.html"},{"code":"AJX","name":"江西省","url":"/publish/forecast/AJX.html"},{"code":"ASD","name":"山东省","url":"/publish/forecast/ASD.html"},{"code":"AHA","name":"河南省","url":"/publish/forecast/AHA.html"},{"code":"AHB","name":"湖北省","url":"/publish/forecast/AHB.html"},{"code":"AHN","name":"湖南省","url":"/publish/forecast/AHN.html"},{"code":"AGD","name":"广东省","url":"/publish/forecast/AGD.html"},{"code":"AGX","name":"广西壮族自治区","url":"/publish/forecast/AGX.html"},{"code":"AHI","name":"海南省","url":"/publish/forecast/AHI.html"},{"code":"ACQ","name":"重庆市","url":"/publish/forecast/ACQ.html"},{"code":"ASC","name":"四川省","url":"/publish/forecast/ASC.html"},{"code":"AGZ","name":"贵州省","url":"/publish/forecast/AGZ.html"},{"code":"AYN","name":"云南省","url":"/publish/forecast/AYN.html"},{"code":"AXZ","name":"西藏自治区","url":"/publish/forecast/AXZ.html"},{"code":"ASN","name":"陕西省","url":"/publish/forecast/ASN.html"},{"code":"AGS","name":"甘肃省","url":"/publish/forecast/AGS.html"},{"code":"AQH","name":"青海省","url":"/publish/forecast/AQH.html"},{"code":"ANX","name":"宁夏回族自治区","url":"/publish/forecast/ANX.html"},{"code":"AXJ","name":"新疆维吾尔自治区","url":"/publish/forecast/AXJ.html"},{"code":"AXG","name":"香港特别行政区","url":"/publish/forecast/AXG.html"},{"code":"AAM","name":"澳门特别行政区","url":"/publish/forecast/AAM.html"},{"code":"ATW","name":"台湾省","url":"/publish/forecast/ATW.html"}]
由于返回的数据是一个JSON格式的数据,所以添加了后置处理器下的JSON JMESPath Extractor元件来对JSON数据进行处理,如下图所示,设置将从JSON数据中提取到的省份或者直辖市名称
对应的代码赋值给province这个变量来存储以供下一个取样器调用接口获取该代码下对应的所有城市信息数据,设置JMESPath提取的表达式为[?name=='${provinceName}'].code,
该表达式中的${provinceName} 就是引用了前面参数化数据中定义的provinceName这个变量,并且设置匹配的次数为1,如果对JSON JMESPath Extractor不是很熟悉,可以参考本书前面的章节,
在前面的章节中有详细介绍如何去使用JSON JMESPath Extractor从JSON数据中提取数据。
在通过JSON JMESPath Extractor获取到省份或者直辖市对应的代码后,就可以添加第二个取样器来发起请求调用http://www.nmc.cn/rest/province接口来获取省份或者直辖市下的所有城市信息数据了,如下图所示,从图中可以看到此时在接口URL中传入了${province}这个变量,这个变量代表的就是某个省份或者直辖市对应的代码。
在完成上述的Jmeter元件添加以及配置后,建议再添加查看结果树元件以方便通过查看结果树来查看每个取样器的运行的结果,如下图所示,而且从图中可以看到当运行整个Jmeter测试计划后,在查看结果树中可以看到第一个取样器已经正常发出了调用http://www.nmc.cn/rest/province接口的请求。
从查看结果树中看到,第二个取样器也正常发出了调用接口的请求,请求的URL地址为http://www.nmc.cn/rest/province/ABJ,如下图所示,可以看到在URL地址中,已经添加上了对应的省份或者直辖市的代码,由于在参数化数据中,第一个设置的参数化数据为北京市,并且从第一个取样器返回的响应数据可以知道,北京市的代码为ABJ,所以此时首次运行时,第二个取样器请求的URL地址应该为http://www.nmc.cn/rest/province/ABJ,查看结果树中显示的实际结果和预期结果是完全匹配的,这说明性能测试脚本的运行符合预期。如下图所示,通过查看获取城市信息这个取样器的响应数据,可以
看到已经返回了北京市这个直辖市下所有对应的全部城市数据信息。
在这个示例中,省份或者直辖市名称的参数化数据是通过Jmeter配置元件下的CSV数据文件设置来实现的,除了通过这种方式可以实现外,还可以通过Jmeter函数助手中的CSVRead 函数来实现,如下图所示。
2、本次学习总结
读者们需要能在Jmeter工具下完成常见的性能测试脚本的编写,能完成一些常见的HTTP请求以及数据库请求的性能压测,每天学习一个知识点,循序渐进,持续让自己提高和进步。
出处 :本次学习的内容参考自清华大学出版社出版的《JMeter核心技术、性能测试与性能分析》一书