java - JMeter 从路径参数开头删除正斜杠

标签 java jmeter

我有一个如下所示的端点:www.example.com/example/{resource}。资源参数通常是一个看起来像这样的 uri 字符串:/resource/123,编码如下:%2Fresource%2Fid%2F123。起始正斜杠很重要,端点与数据库中的某些内容直接匹配,因此很重要。

我面临的问题是,在 JMeter 和端点之间的某个位置,起始的正斜杠被删除了。我尝试在本地运行具有端点的应用程序,当我从 PostMan 发出请求时,如下所示:GET www.example.com/example/%2Fresource%2F123,端点会正确解码它。

在 JMeter 中,我从 CSV 文件加载资源,如下所示:

resource
/resource/123
/resource/456
/resource/789

在我的 HTTP 请求配置中,我使用如下资源:/example/${__urlencode(${resource})}。 urlencode 函数似乎没有任何不同。

无论我做什么,当从 JMeter 发出请求时,它都不会按预期工作,因为资源中的起始哈希被删除。我知道如果没有端点,我可以更改端点以添加散列,但我不想专门针对 JMeter 测试更改端点的功能。

有什么想法吗?

编辑 1

这是 csv 选项:

<CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Resource Ids" enabled="true">
   <stringProp name="delimiter">,</stringProp>
   <stringProp name="fileEncoding"></stringProp>
   <stringProp name="filename">data/resource.csv</stringProp>
   <boolProp name="ignoreFirstLine">true</boolProp>
   <boolProp name="quotedData">false</boolProp>
   <boolProp name="recycle">true</boolProp>
   <stringProp name="shareMode">shareMode.group</stringProp>
   <boolProp name="stopThread">false</boolProp>
   <stringProp name="variableNames">resource</stringProp>
</CSVDataSet>

这是 HTML 请求配置:

<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="API Request" enabled="true">
    <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
      <collectionProp name="Arguments.arguments"/>
    </elementProp>
    <stringProp name="HTTPSampler.domain">localhost</stringProp>
    <stringProp name="HTTPSampler.port">8303</stringProp>
    <stringProp name="HTTPSampler.protocol">http</stringProp>
    <stringProp name="HTTPSampler.contentEncoding"></stringProp>
    <stringProp name="HTTPSampler.path">/example/${__urlencode(${resource})}</stringProp>
    <stringProp name="HTTPSampler.method">GET</stringProp>
    <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
    <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
    <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
    <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
    <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
    <stringProp name="HTTPSampler.connect_timeout"></stringProp>
    <stringProp name="HTTPSampler.response_timeout"></stringProp>
</HTTPSamplerProxy>

编辑2

我添加了这个预处理器:

<JSR223PreProcessor guiclass="TestBeanGUI" testclass="JSR223PreProcessor" testname="JSR223 PreProcessor" enabled="true">
  <stringProp name="cacheKey">true</stringProp>
  <stringProp name="filename"></stringProp>
  <stringProp name="parameters"></stringProp>
  <stringProp name="script">vars.put(&quot;resource&quot;, URLEncoder.encode(vars.get(&quot;resource&quot;), &quot;UTF-8&quot;)); </stringProp>
  <stringProp name="scriptLanguage">groovy</stringProp>
</JSR223PreProcessor>

编辑3

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.1.1 r1855137">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
      <stringProp name="TestPlan.comments"></stringProp>
      <boolProp name="TestPlan.functional_mode">false</boolProp>
      <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
      <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
        <collectionProp name="Arguments.arguments"/>
      </elementProp>
      <stringProp name="TestPlan.user_define_classpath"></stringProp>
    </TestPlan>
    <hashTree>
      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group - Test API" enabled="true">
        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
          <boolProp name="LoopController.continue_forever">false</boolProp>
          <stringProp name="LoopController.loops">2</stringProp>
        </elementProp>
        <stringProp name="ThreadGroup.num_threads">1</stringProp>
        <stringProp name="ThreadGroup.ramp_time">0</stringProp>
        <boolProp name="ThreadGroup.scheduler">false</boolProp>
        <stringProp name="ThreadGroup.duration">3600</stringProp>
        <stringProp name="ThreadGroup.delay">3600</stringProp>
      </ThreadGroup>
      <hashTree>
        <GenericController guiclass="LogicControllerGui" testclass="GenericController" testname="Get List Items" enabled="true"/>
        <hashTree>
          <CSVDataSet guiclass="TestBeanGUI" testclass="CSVDataSet" testname="Resource Ids" enabled="true">
            <stringProp name="delimiter">,</stringProp>
            <stringProp name="fileEncoding"></stringProp>
            <stringProp name="filename">data/resource.csv</stringProp>
            <boolProp name="ignoreFirstLine">true</boolProp>
            <boolProp name="quotedData">false</boolProp>
            <boolProp name="recycle">true</boolProp>
            <stringProp name="shareMode">shareMode.group</stringProp>
            <boolProp name="stopThread">false</boolProp>
            <stringProp name="variableNames">resource</stringProp>
          </CSVDataSet>
          <hashTree/>
          <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Example API Request" enabled="true">
            <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
              <collectionProp name="Arguments.arguments"/>
            </elementProp>
            <stringProp name="HTTPSampler.domain">localhost</stringProp>
            <stringProp name="HTTPSampler.port">8303</stringProp>
            <stringProp name="HTTPSampler.protocol">http</stringProp>
            <stringProp name="HTTPSampler.contentEncoding"></stringProp>
            <stringProp name="HTTPSampler.path">/example/${resourceId}</stringProp>
            <stringProp name="HTTPSampler.method">GET</stringProp>
            <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
            <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
            <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
            <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
            <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
            <stringProp name="HTTPSampler.connect_timeout"></stringProp>
            <stringProp name="HTTPSampler.response_timeout"></stringProp>
          </HTTPSamplerProxy>
          <hashTree>
            <JSR223PreProcessor guiclass="TestBeanGUI" testclass="JSR223PreProcessor" testname="JSR223 PreProcessor" enabled="true">
              <stringProp name="cacheKey">true</stringProp>
              <stringProp name="filename"></stringProp>
              <stringProp name="parameters"></stringProp>
              <stringProp name="script">vars.put(&quot;resource&quot;, URLEncoder.encode(vars.get(&quot;resource&quot;), &quot;UTF-8&quot;)); </stringProp>
              <stringProp name="scriptLanguage">groovy</stringProp>
            </JSR223PreProcessor>
            <hashTree/>
          </hashTree>
          <ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="Response Assertion" enabled="true">
            <collectionProp name="Asserion.test_strings">
              <stringProp name="49586">200</stringProp>
            </collectionProp>
            <stringProp name="Assertion.custom_message"></stringProp>
            <stringProp name="Assertion.test_field">Assertion.response_code</stringProp>
            <boolProp name="Assertion.assume_success">false</boolProp>
            <intProp name="Assertion.test_type">8</intProp>
          </ResponseAssertion>
          <hashTree/>
        </hashTree>
      </hashTree>
    </hashTree>
  </hashTree>
</jmeterTestPlan>

最佳答案

您只需使用一个斜杠作为路径分隔符,而不是双斜杠

文件中有斜杠,因此在路径中删除多余的斜杠:

/example${resource}

如果您想要/必须对值进行 URL 编码,您可以使用 JSR223 PreProcessor 来完成此操作

将其作为添加到HTTP请求中(因此它会在之前更新值),代码:

 vars.put("resource", URLEncoder.encode(vars.get("resource"), "UTF-8"));

关于java - JMeter 从路径参数开头删除正斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57506686/

相关文章:

java - 提示SONAR分析代码

java - 使用不带循环和乘法的递归调用来查找值

java - 在 Spring 和 HQL 中实现搜索功能

java - Java 中不存在语言环境

jmeter - 为什么只有我的第一个 HTTP 请求在运行?

linux - 如何使用 JMeter 在 Linux (Ubuntu) 上执行 IP 地址欺骗? (JMeter 未创建绑定(bind) IP)

javascript - 我们可以在jmeter中解析响应吗

Java 游戏无法在第二台显示器上呈现

JMeter 4 - 无法在 Windows 7 中执行 jmeter-server

testing - 解释和评估 Jmeter 输出