1

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

4

6 回答 6

2

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

于 2011-09-02T04:40:29.143 回答
1

所以,我在源码中定制了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. 注释掉第 3 方库检查 build.xml 文件。

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

于 2010-10-18T12:09:27.623 回答
0

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

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

于 2010-09-08T20:45:11.107 回答
0

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

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

于 2009-12-23T14:54:57.037 回答
0

你得到什么样的错误?就像是

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

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

于 2011-02-14T05:28:15.957 回答
0

我们也遇到了类似的问题,除了上述答案之外,我们还在X-CSRF-Token该请求中关联了 HTTP 标头管理器,并且成功地能够根据需要多次上传所需的媒体。

于 2015-06-11T09:53:53.100 回答