加载测试多部分表单

时间:2009-12-22 16:03:30

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

我正在尝试使用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 个答案:

答案 0 :(得分:2)

这些天你可以在JMeter中勾选“使用浏览器兼容的标题”。可以在那里为自己节省很多时间: - )

答案 1 :(得分:1)

所以,我已经在源代码中定制了JMeter的多部分请求发布部分,以提出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$
*****/

P.S。

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

  1. 注释掉第三方库检入build.xml文件。

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

答案 2 :(得分:0)

可能有更好的方法,但我最后添加了一个快速过滤器,将text / plain tempfiles转换为参数hash中的字符串:

  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真的不应该使用是否存在内容类型标头以确定它是否是文件。好吧。

答案 3 :(得分:0)

我还使用了上面的解决方案,因为ColdFusion正在为每个表单数据发送类似的标题(减去Content-Transfer-Encoding)。我想知道是否有更好的方法。

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

答案 4 :(得分:0)

你得到什么样的错误?像

这样的东西
NoMethodError (undefined method `rewind' for "1":String):

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

答案 5 :(得分:0)

我们也有类似的问题,除了上面的答案,我们还关联了该请求中的HTTP标头管理器的X-CSRF-Token,并且 能够成功上传所需的媒体数量。