英文:
Gatling :Create a POST Request Dynamically using Session API programatically
问题
以下是翻译好的部分:
我正在对一个API进行负载测试,并希望在不同的POST请求中注入不同的数据。我查看了Gatling的Session API,并尝试以下代码。但我一直在收到错误消息:11:49:30.717
[gatling-1-16] ERROR io.gatling.http.action.HttpRequestAction - 'create-profiles' 执行失败:未定义名为 'createProfile' 的属性
会话代码:
if (WRITES_PER_SECOND > 0) {
   scenarios.add(CoreDsl.scenario(CREATE_PROFILE)
            .feed(listFeeder(getFeed(noOfEntityIdsNeeded)).circular())
            .feed(listFeeder(TKN_FEED).circular())
            .exec(session -> {
                session.set("createProfile", PayloadFeeder.getPayload());
                return session;
            })
            .exec(http("create-profiles").post(PROFILE_API_URL)
                    .header(CONTENT_TYPE_HEADER, MIME_TYPE_APPLICATION_JSON)
                    .header(AUTHORIZATION_HEADER, TOKENIZED_ACCESS_TOKEN)
                    .header(X_APP_KEY_HEADER, X_APP_KEY_123_REG)
                    .header(IDEMPOTENCY_KEY_HEADER, ENTITY_ID_PLACEHOLDER)
                    .body(StringBody("${createProfile.jsonStringify()}")))
                    //.body(StringBody(session -> session.getString("postData"))))
            .injectClosed(
                    constantConcurrentUsers(WRITES_PER_SECOND).during(Duration.ofSeconds(duration)))
            .throttle(jumpToRps(WRITES_PER_SECOND), holdFor(Duration.ofSeconds(duration))));
}
session.set("createProfile", PayloadFeeder.getPayload());
是我调用一个函数并获得动态载荷的地方。
然后我尝试在下面的部分中使用它,使用session.get()
我还尝试过session.set("postData","jsonstringdynamic")和session.getString("postData"),但是Gatling找不到该值并在HTTP正文中注入NULL。
寻找一些关于这个问题的指导
希望这能帮助你理解代码问题并寻找解决方案。
英文:
I am load testing a API and I want to inject different data in different post Requests. I went through Session API of gatling and I am trying following code.But i keep on getting error 11:49:30.717
[gatling-1-16] ERROR io.gatling.http.action.HttpRequestAction - 'create-profiles' failed to execute: No attribute named 'createProfile' is defined
Code for session:
  if (WRITES_PER_SECOND > 0) {
     scenarios.add( CoreDsl.scenario(CREATE_PROFILE)
              .feed(listFeeder(getFeed(noOfEntityIdsNeeded)).circular())
              .feed(listFeeder(TKN_FEED).circular())
              .exec(session -> {
                session.set("createProfile",*PayloadFeeder.getPayload()*);
                return session;
              })
              .exec(http("create-profiles").post(PROFILE_API_URL)
                      .header(CONTENT_TYPE_HEADER, MIME_TYPE_APPLICATION_JSON)
                      .header(AUTHORIZATION_HEADER, TOKENIZED_ACCESS_TOKEN)
                      .header(X_APP_KEY_HEADER, X_APP_KEY_123_REG)
                      .header(IDEMPOTENCY_KEY_HEADER, ENTITY_ID_PLACEHOLDER)
                      .body(StringBody("${createProfile.jsonStringify()}")))
                      //.body(StringBody(session -> session.getString("postData"))))
              .injectClosed(
                      constantConcurrentUsers(WRITES_PER_SECOND).during(Duration.ofSeconds(duration)))
              .throttle(jumpToRps(WRITES_PER_SECOND), holdFor(Duration.ofSeconds(duration))));
    }
            session.set("createProfile",*PayloadFeeder.getPayload()*);
is where I call a function and get dynamic payload.
then I try to use this in below section,using session.get()
I also tried with session.set("postData,"jsonstringdynamic")
and session.getString("postData") but gatling does not find the value and injects NULL in http body.
Looking for some guidance on this
答案1
得分: 1
.exec(session -> {
  session.set("createProfile",*PayloadFeeder.getPayload()*);
  return session;
})
这是错误的。请阅读会话 API 文档,会话实例是不可变的。
英文:
.exec(session -> {
  session.set("createProfile",*PayloadFeeder.getPayload()*);
  return session;
})
This is wrong. Please read the Session API documentation, Session instances are immutable.
答案2
得分: 0
我错过了阅读文档时的关键信息。由于会话 API 是不可变的,我们必须返回新的会话。
.exec(session -> {
               Session newSession= session.set("postData",PayloadFeeder.getDynamicDataString());
                return newSession;
              })
就是这样。
修改后的代码
scenarios.add(CoreDsl.scenario(CREATE_PROFILE)
                  .feed(listFeeder(getFeed(noOfEntityIdsNeeded)).circular())
                  .feed(listFeeder(TKN_FEED).circular())
                  .exec(session -> {
                   Session newSession= session.set("postData",PayloadFeeder.getDynamicDataString());
                    return newSession;
                  })
                  .exec(http("create-profiles").post(PROFILE_API_URL)
                          .header(CONTENT_TYPE_HEADER, MIME_TYPE_APPLICATION_JSON)
                          .header(AUTHORIZATION_HEADER, TOKENIZED_ACCESS_TOKEN)
                          .header(X_APP_KEY_HEADER, X_APP_KEY_123_REG)
                          .header(IDEMPOTENCY_KEY_HEADER, ENTITY_ID_PLACEHOLDER)
                          .body(StringBody(session -> {
                                  boolean contains=  session.contains("postData");
                                  System.out.println("is property contains"+"["+contains+"]");
                                  String data=session.getString("postData");
                                  System.out.println("data is"+data);
                                   return data ;
                                  })))
                  .injectClosed(
                          constantConcurrentUsers(WRITES_PER_SECOND).during(Duration.ofSeconds(duration)))
                  .throttle(jumpToRps(WRITES_PER_SECOND), holdFor(Duration.ofSeconds(duration))));
英文:
I missed crucial info while reading docs. We have to return newSession since session API is immutable.
.exec(session -> {
Session newSession= session.set("postData",PayloadFeeder.getDynamicDataString());
return newSession;
})
that was it.
ModifiedCode
scenarios.add(CoreDsl.scenario(CREATE_PROFILE)
                  .feed(listFeeder(getFeed(noOfEntityIdsNeeded)).circular())
                  .feed(listFeeder(TKN_FEED).circular())
                  .exec(session -> {
                   Session newSession= session.set("postData",PayloadFeeder.getDynamicDataString());
                    return newSession;
                  })
                  .exec(http("create-profiles").post(PROFILE_API_URL)
                          .header(CONTENT_TYPE_HEADER, MIME_TYPE_APPLICATION_JSON)
                          .header(AUTHORIZATION_HEADER, TOKENIZED_ACCESS_TOKEN)
                          .header(X_APP_KEY_HEADER, X_APP_KEY_123_REG)
                          .header(IDEMPOTENCY_KEY_HEADER, ENTITY_ID_PLACEHOLDER)
                          .body(StringBody(session -> {
                                  boolean contains=  session.contains("postData");
                                  System.out.println("is property contains"+"["+contains+"]");
                                  String data=session.getString("postData");
                                  System.out.println("data is"+data);
                                   return data ;
                                  })))
                  .injectClosed(
                          constantConcurrentUsers(WRITES_PER_SECOND).during(Duration.ofSeconds(duration)))
                  .throttle(jumpToRps(WRITES_PER_SECOND), holdFor(Duration.ofSeconds(duration))));
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论