之前我们使用CSV数据集配置和我们的Jmeter脚本读取此种子数据并准备HTTP请求,它运行良好。但是根据当前的需求,我们需要从mongodb获取数据,并将这些动态值传递给HTTP请求采样器,我的意思是,我们需要根据数据库中的动态值构建HTTP请求采样器?你能请谁帮我一下吗?
hi3rlvi21#
在JSR 223采样器中有vars的缩写,它代表JMeterVariables类示例,它提供对线程范围中所有JMeter变量的读/写访问。因此,如果您在JSR 223采样器中执行以下操作:
vars
vars.put('foo', 'bar')
它将创建值为bar的foo JMeter变量,您可以在HTTP请求采样器中将其称为{foo}
bar
foo
{foo}
关于MongoDB连接设置,您可以参考How to Load Test MongoDB with JMeter文章,为了获得提到的测试元素(MongoBD源配置和MongoDB脚本),将下一行添加到 user.properties 文件:
not_in_menu=org.apache.jmeter.protocol.mongodb.sampler.MongoScriptSampler,org.apache.jmeter.protocol.mongodb.config.MongoSourceElement
需要重新启动JMeter才能提取属性。
2lpgd9682#
不确定使用JSR223 Sampler进行计算,然后将值传递到HTTP Request Sampler中有多大好处。使用JSR223 Preprocessor和JSR223 Sampler肯定有更好的主意。从我的Angular 来看,有两种选择:1.直接使用JSR223 Sampler进行所有计算,从数据库中提取数据,并进行HTTP调用1.在JSR223 Sampler中使用JSR223 Preprocessor,并访问JSR223 Preprocessor中的值。当为不同请求计算一些公共值时,此方法非常有用,例如,S3的验证签名,其中为下载、上载、更新文件/标记等不同操作计算签名。对于第二种方法,可以创建一个JSR223 Preprocessor并编写代码来计算数据,将这些数据设置为vars并访问JSR223 Sampler。可以参考用于S3签名计算的预处理器示例:JMeter throws error 'Signature doesn't match' while uploading file to s3这很简单,下面是将JSR223 Preprocessor中计算的值访问到HTTP Request Sampler中的步骤:1.计算值并添加到vars中,vars是JSR223可用的键值Map,例如:'vars.put(“key”,“value”)1.通过使用字符串变量模板(例如${key})访问HTTP Request Sampler或HTTP Header Manager中的值或任何位置。它从varsMap中获取给定键的值。虽然从JSR223 Preprocessor获取baked数据很容易,但我的建议是使用JSR223 Sampler代替您的用例。使用JSR223 Sampler,您可以编写代码从数据库中提取数据,并直接发出HTTP请求。提供代码片段以供参考:
JSR223 Sampler
HTTP Request Sampler
JSR223 Preprocessor
HTTP
JSR223
${key}
HTTP Header Manager
import org.apache.http.HttpHeaders; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.methods.RequestBuilder; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import org.apache.http.entity.StringEntity; import java.util.Map; import java.util.HashMap; import java.io.ByteArrayInputStream; import org.apache.http.entity.InputStreamEntity; def x_amz_date = vars.get("x_amz_date"); def authorization = vars.get("aws_authorization"); def content_type = "plain/text"; def x_amz_security_token = <session token for s3>; def x_amz_content_sha256 = vars.get("aws_sha256"); def host = <host name for s3 service>; def content_length = vars.get("aws_content_length"); def url = "https://" + host + "/" + <bucket> + "/" + <path or directory> + "/" + <file name in s3> log.info("x_amz_date : " + x_amz_date); log.info("authorization : " + authorization); log.info("content_type : " + content_type); log.info("x_amz_security_token : " + x_amz_security_token); log.info("x_amz_content_sha256 : " + x_amz_content_sha256); log.info("host : " + host); log.info("content_length : " + content_length); log.info("url : " + url); Map<String, String> result = new HashMap<>(); RequestConfig requestConfig = RequestConfig .custom() .setConnectTimeout(10000) .setSocketTimeout(10000) .build(); //byte array for the file which need to be uploaded in s3 byte[] data = ("X5O!P%@AP<insert>[4\\PZX54(P^)7CC)7}\044EICAR-STANDARD-ANTIVIRUS-TEST-FILE!\044H+H*".replace("<insert>", "")).getBytes(); ByteArrayInputStream inputStream = new ByteArrayInputStream(data); InputStreamEntity entity = new InputStreamEntity(inputStream); RequestBuilder requestBuilder = RequestBuilder .put() .setConfig(requestConfig) .setUri(url) .setHeader("X-Amz-Date", x_amz_date) .setHeader("Authorization", authorization) .setHeader("Content-Type", content_type) .setHeader("X-Amz-Security-Token", x_amz_security_token) .setHeader("X-Amz-Content-Sha256", x_amz_content_sha256) .setHeader("Host", host) //.setHeader("Content-Length", content_length) .setEntity(entity); HttpUriRequest request = requestBuilder.build(); HttpClientBuilder .create() .build() .withCloseable { httpClient -> httpClient.execute(request) .withCloseable{ response -> String res = "RESPONSE:" + "\n"+response.getStatusLine()+"\n"+"Headers: "+response.getAllHeaders(); log.info("--------Result: " + res) result.put("result", res) } } result
2条答案
按热度按时间hi3rlvi21#
在JSR 223采样器中有
vars
的缩写,它代表JMeterVariables类示例,它提供对线程范围中所有JMeter变量的读/写访问。因此,如果您在JSR 223采样器中执行以下操作:
它将创建值为
bar
的foo
JMeter变量,您可以在HTTP请求采样器中将其称为{foo}
关于MongoDB连接设置,您可以参考How to Load Test MongoDB with JMeter文章,为了获得提到的测试元素(MongoBD源配置和MongoDB脚本),将下一行添加到 user.properties 文件:
需要重新启动JMeter才能提取属性。
2lpgd9682#
不确定使用
JSR223 Sampler
进行计算,然后将值传递到HTTP Request Sampler
中有多大好处。使用
JSR223 Preprocessor
和JSR223 Sampler
肯定有更好的主意。从我的Angular 来看,有两种选择:1.直接使用
JSR223 Sampler
进行所有计算,从数据库中提取数据,并进行HTTP
调用1.在
JSR223 Sampler
中使用JSR223 Preprocessor
,并访问JSR223 Preprocessor
中的值。当为不同请求计算一些公共值时,此方法非常有用,例如,S3的验证签名,其中为下载、上载、更新文件/标记等不同操作计算签名。对于第二种方法,可以创建一个
JSR223 Preprocessor
并编写代码来计算数据,将这些数据设置为vars
并访问JSR223 Sampler
。可以参考用于S3签名计算的预处理器示例:JMeter throws error 'Signature doesn't match' while uploading file to s3这很简单,下面是将
JSR223 Preprocessor
中计算的值访问到HTTP Request Sampler
中的步骤:1.计算值并添加到
vars
中,vars
是JSR223
可用的键值Map,例如:'vars.put(“key”,“value”)1.通过使用字符串变量模板(例如
${key}
)访问HTTP Request Sampler
或HTTP Header Manager
中的值或任何位置。它从vars
Map中获取给定键的值。虽然从
JSR223 Preprocessor
获取baked数据很容易,但我的建议是使用JSR223 Sampler
代替您的用例。使用
JSR223 Sampler
,您可以编写代码从数据库中提取数据,并直接发出HTTP
请求。提供代码片段以供参考: