로드 테스트 멀티 파트 양식
-
20-09-2019 - |
문제
JMeter를 사용하여 Rails 응용 프로그램을로드 테스트하려고합니다. 응용 프로그램의 중요한 부분에는 텍스트 입력과 파일 업로드가 모두 포함 된 양식이 포함됩니다. 브라우저에서는 잘 작동하지만 JMeter에 해당 페이지를 게시하려고 할 때 Rails는 Multipart Form의 모든 부분을 온도 파일로 저장하여 문자열을 찾을 때 물건이 깨지고 대신 템 파일을 얻습니다.
차이점은 브라우저에서 텍스트 입력을 포함하는 멀티 파트 요청의 조각이 다음과 같습니다.
-----------------------------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 응용 프로그램을로드하는 더 나은 도구가 있습니까?
해결책 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가 여기에 올바른 것으로 밝혀졌고 레일이 잘못된 것으로 밝혀졌습니다. RFC 2388에 따르면, 멀티 파트 요청의 각 항목에는 콘텐츠 유형이 있어야하므로 Rails는 실제로 사용하지 않아야합니다. 컨텐츠 유형 헤더는 파일인지 여부를 결정합니다. 아, 음.
다른 팁
요즘에는 JMeter에서 "브라우저 호환 헤더 사용"을 선택할 수 있습니다. 그곳에서 많은 시간을 저축 할 수 있었을 것입니다 :-)
따라서 Rails가 이해하는 요청을 발표하기 위해 소스 코드에 PART를 게시 한 JMeter의 Multipart 요청 게시 부분을 사용자 정의했습니다. 아래에 표시된 것처럼 변경은 쉽지만 컴파일 Java/JMeter 환경을 만들려면 시간이 걸렸습니다. :(
어쨌든 이제는 JMeter를 통해 Multipart Post에 의해 파일을 성공적으로 업로드 할 수 있습니다.
SRC/프로토콜/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의 빌드 환경을 만드는 팁은
제 3 자 라이브러리를 댓글을 달려면 build.xml 파일에서 확인하십시오.
이진 아카이브에서 Lib/ Directory 로의 Lib/ Xstream-1.3.1.jar 복사
ColdFusion이 각 양식 데이터와 유사한 헤더 (컨텐츠 전송 인코딩 제외)를 보내면서 위의 솔루션을 사용했습니다. 더 나은 방법이 있는지 궁금합니다.
편집 : 레일 3에서 이것이 고정되어 있는지 아는 사람이 있습니까?
어떤 종류의 오류가 발생합니까? 같은 것
NoMethodError (undefined method `rewind' for "1":String):
랙에는 문제를 설명 할 수있는 문제가 있습니다. 보다 https://github.com/rack/rack/issuesearch?state=open&q=weind#issue/116
우리는 또한 비슷한 문제를 겪고 있었고, 위의 답변 외에도 우리는 또한 X-CSRF-Token
해당 요청에서 HTTP 헤더 관리자의 관리자이며 필요한 미디어를 우리가 원하는만큼 업로드 할 수있었습니다.