【问题标题】:Load testing multipart form负载测试多部分表单
【发布时间】:2009-12-22 16:03:29
【问题描述】:

我正在尝试使用 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 应用程序进行负载测试?

【问题讨论】:

    标签: ruby-on-rails load-testing jmeter multipartform-data


    【解决方案1】:

    事实证明,这些天您只需在 JMeter 中勾选“使用与浏览器兼容的标头”即可。本来可以为自己节省很多时间:-)

    【讨论】:

      【解决方案2】:

      所以,我在源码中自定义了JMeter的multipart request post部分,把rails能理解的请求放出来。如下所示,更改很简单,但创建编译 Java/JMeter 环境需要时间。 :(

      无论如何,现在我可以通过 JMeter 成功上传文件。


      在 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. 注释掉 3rd 方库签入 build.xml 文件。

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

      【讨论】:

        【解决方案3】:

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

          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 是不正确的:根据 RFC 2388,多部分请求中的每个项目都应该有一个内容类型(不仅仅是文件),所以 Rails 真的不应该使用是否存在内容类型标头以确定它是否是文件。嗯嗯。

        【讨论】:

          【解决方案4】:

          我还使用了上面的解决方案,因为 ColdFusion 会在每条表单数据中发送类似的标头(减去 Content-Transfer-Encoding)。不知道有没有更好的办法。

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

          【讨论】:

            【解决方案5】:

            你得到什么样的错误?类似的东西

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

            Rack 存在一个问题,可以解释您的问题。见https://github.com/rack/rack/issuesearch?state=open&q=rewind#issue/116

            【讨论】:

            • 谢谢,但这实际上看起来是相反的问题:在 Rack 问题中,它应该有一个 Tempfile 时有一个字符串,但我的问题是我认为 应该 i> 是字符串(简单的表单字段值)显示为 Tempfiles。
            【解决方案6】:

            我们也遇到了类似的问题,除了上述答案之外,我们还在该请求中关联了 HTTP Header Manager 的 X-CSRF-Token 并且是 成功地上传所需媒体的次数。

            【讨论】:

              猜你喜欢
              • 2015-01-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-12-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多