我正在尝试使用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应用程序?
答案 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创建构建环境的提示是
注释掉第三方库检入build.xml文件。
将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
,并且
能够成功上传所需的媒体数量。