Frage

Ich versuche, eine Rails-Anwendung mit JMeter zu testen. Ein kritischer Teil der Anwendung umfasst ein Formular, das sowohl Texteingaben als auch Datei -Uploads enthält. In einem Browser funktioniert es gut, aber wenn ich versuche, diese Seite in JMeter zu veröffentlichen, speichert Rails alle Teile des mehrteiligen Formulars als TEMP -Dateien, wodurch die Dinge brechen, wenn es nach einer Zeichenfolge sucht und stattdessen eine Tempfile erhält.

Es scheint, dass der Unterschied darin besteht, dass aus einem Browser das Stück der mehrteiligen Anforderung, die eine Texteingabe enthält, wie folgt aussieht:

-----------------------------7d93b4186074c
Content-Disposition: form-data; name="field_name"

test
-----------------------------7d93b4186074c

von JMeter sieht es so aus:

-----------------------------7d159c1302d0y0
Content-Disposition: form-data; name="field_name"
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit

test
-----------------------------7d159c1302d0y0

Anscheinend sieht Rails das erstere und interpretiert es als einfacher Textwert und behandelt es als Zeichenfolge, aber letztere und speichert sie einer Temp -Datei.

Ich war nicht in der Lage, eine Kulisse zu finden, um JMeter zu überzeugen, die zusätzlichen Header nicht im mehrteiligen Formular für Nicht-Dateifelder zu senden.

Gibt es eine Möglichkeit, Schienen zu überzeugen, diese Header zu ignorieren und den Text/den Klartext anstelle von Textdateien zu behandeln? Oder eine schnelle Möglichkeit, einen Filter vor meinen Controller zu stellen, der die zusätzlichen Header auszieht?

Gibt es ein besseres Tool, um eine Rails-Anwendung zu testen, die das Datei-Upload enthält?

War es hilfreich?

Lösung 3

Es mag einen besseren Weg geben, aber am Ende habe ich einen schnellen Filter hinzugefügt, um den Text/die einfachen Temperatur in Zeichenfolgen innerhalb des Parameter -Hash zu verwandeln:

  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

Übrigens, es stellt sich heraus Ein Header vom Typ Inhalt, um festzustellen, ob es sich um eine Datei handelt. Ah, gut.

Andere Tipps

Es stellt sich heraus, dass Sie heutzutage einfach "Verwenden von Browser -kompatiblen Headern" in JMeter ankreuzen können. Hätte mir dort verdammt viel Zeit ersparen können :-)

Daher habe ich JMeters mehrteiler Anforderungs -Posting -Teil im Quellcode angepasst, um die Anfrage zu stellen, die Rails versteht. Die Änderung ist einfach wie unten gezeigt, aber die Erstellung des Zusammenstellens der Java/JMeter -Umgebung hat Zeit in Anspruch genommen. :(

Wie auch immer, jetzt kann ich eine Datei mit einem mehrteiligen Beitrag über JMeter erfolgreich hochladen.


in 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$
*****/

Ps

Ein Tipp -Tipp, um die Build -Umgebung für 2.4 zu erstellen, ist

  1. Um die Bibliotheken der Dritten Partei zu kommentieren, sehen Sie sich die Datei Build.xml ein.

  2. Kopieren Sie lib/ xstream-1.3.1.jar aus dem Binärarchiv in lib/ verzeichnet

Ich habe auch die obige Lösung verwendet, da Coldfusion mit jedem Formteilformel ähnliche Header (ohne das Inhaltsübertragungs-Kodieren) sandte. Ich frage mich, ob es einen besseren Weg gibt.

Bearbeiten: Weiß jemand, ob dies in Rails 3 festgelegt wurde?

Was für ein Fehler bekommen Sie? Etwas wie

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

Es gibt ein Problem mit Rack, das Ihr Problem erklären könnte. Sehen https://github.com/rack/rack/issuesearch?state=open&q=rewind#issue/116

Wir hatten auch ein ähnliches Problem, zusätzlich zu den oben genannten Antworten korrelieren wir auch die X-CSRF-Token von HTTP -Header -Manager in dieser Anfrage und konnten die erforderlichen Medien so oft wie gewünscht hochladen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top