代码之家  ›  专栏  ›  技术社区  ›  Jacob Mattison

负载测试多部分窗体

  •  1
  • Jacob Mattison  · 技术社区  · 15 年前

    我正在尝试使用JMeter加载一个Rails应用程序。应用程序的一个关键部分涉及一个既包括文本输入又包括文件上载的表单。它在浏览器中可以正常工作,但是当我尝试在jmeter中发布该页面时,Rails将多部分表单的所有部分保存为临时文件,当它查找字符串并获取临时文件时,这会导致事情中断。

    不同之处在于,从浏览器来看,包含文本输入的多部分请求的片段如下所示:

    -----------------------------7d93b4186074c
    Content-Disposition: form-data; name="field_name"
    
    test
    -----------------------------7d93b4186074c
    

    而从jmeter看来:

    -----------------------------7d159c1302d0y0
    Content-Disposition: form-data; name="field_name"
    Content-Type: text/plain; charset=utf-8
    Content-Transfer-Encoding: 8bit
    
    test
    -----------------------------7d159c1302d0y0
    

    显然,Rails看到前者并将其解释为纯文本值,并将其视为字符串,但看到后者并将其保存到临时文件中。

    我找不到一个设置来说服JMeter不要在非文件字段的多部分表单中发送额外的头。

    有没有一种方法可以说服Rails忽略这些头并将文本/纯文本视为字符串而不是文本文件?或者在我的控制器前面放置一个过滤器的快速方法,它将除去额外的头段?

    或者,是否有更好的工具来加载测试包含文件上传的Rails应用程序?

    6 回复  |  直到 9 年前
        1
  •  2
  •   bfabry    13 年前

    现在,您可以在jmeter中勾选“使用浏览器兼容的头文件”。在那里我可以节省很多时间。

        2
  •  1
  •   Koji    14 年前

    所以,我在源代码中定制了JMeter的多部分请求发布部分,以发出Rails理解的请求。如下面所示,更改是容易的,但是创建编译Java/JMeTM环境需要时间。:。(

    不管怎样,现在我可以通过jmeter通过multipart post成功上传一个文件。


    在src/protocol/http/org/apache/jmeter/protocol/http/sampler/postwriter.java中

    writeStartFileMultipart()
    //writeln(out, "Content-Transfer-Encoding: binary"); // $NON-NLS-1$
    
    writeFormMultipart()
    /*****
    writeln(out, "Content-Type: text/plain; charset=" + charSet); // $NON-NLS-1$
    writeln(out, "Content-Transfer-Encoding: 8bit"); // $NON-NLS-1$
    *****/
    

    附笔。

    为2.4创建构建环境的提示提示是

    1. 若要注释第三方库,请签入build.xml文件。

    2. 将lib/xstream-1.3.1.jar从二进制存档复制到lib/目录中

        3
  •  0
  •   Jacob Mattison    15 年前

    可能有更好的方法,但我最终添加了一个快速过滤器,将文本/纯文本临时文件转换为参数哈希中的字符串:

      def change_text_files_to_strings
        params.each_pair do |key, value|
          params[key] = value.read if (value.class.to_s=='Tempfile' && value.content_type.start_with?('text/plain') )
        end
      end
    

    顺便说一下,jmeter在这里是正确的,rails也不正确:根据RFC2388,多部分请求中的每个项都应该有一个内容类型(不仅仅是文件),所以rails确实不应该使用内容类型头来确定它是否是一个文件。啊,好吧。

        4
  •  0
  •   Groovetrain    14 年前

    我还使用了上面的解决方案,因为coldfusion正在用每个表单数据发送类似的头(减去内容传输编码)。我想知道有没有更好的方法。

    编辑:有人知道这是否已经在Rails 3中修复了?

        5
  •  0
  •   ugo    14 年前

    你犯了什么错误?类似的东西

    NoMethodError (undefined method `rewind' for "1":String):
    

    机架有问题,可以解释您的问题。见 https://github.com/rack/rack/issuesearch?state=open&q=rewind#issue/116

        6
  •  0
  •   Rory McCrossan Hsm Sharique Hasan    9 年前

    我们也有类似的问题,除了上述答案,我们还将 X-CSRF-Token 在该请求中的HTTP头管理器 成功地将所需的媒体上载到我们想要的次数。