2016-08-03 13 views
2

Ist es möglich, die tatsächliche Antwortzeit von API-Anfragen mit dem JSR223/groovy Sampler in JMeter zu erhalten? Ich habe den folgenden Arbeitscode, aber bekomme keine richtige Antwortzeit, wenn ich meine Zuhörer beobachte (Antwortinhalt ist in Ordnung, einige JSON-Daten).Antwortzeiten mit JSR223 + JMeter erhalten

Die Ziel-URL wird im Sampler im Feld 'Parameter' angegeben (basierend auf Dmitris Beispiel). Außerdem habe ich ein Bearer-Token in den Header eingefügt, um das OAuth-Zugriffstoken zu verwenden, wenn Anfragen ausgeführt werden.

Ich habe versucht, einen Transaction-Controller zu verwenden und den JSR223-Sampler darin aufzunehmen, aber das hat nicht funktioniert, um die Antwortzeit zu erhalten (auch nicht beim Erstellen eines Eltern-Samples).

import org.apache.http.HttpEntity 
import org.apache.http.HttpResponse 
import org.apache.http.client.HttpClient 
import org.apache.http.client.methods.HttpGet 
import org.apache.http.impl.client.DefaultHttpClient 
import org.apache.http.util.EntityUtils 

import java.util.concurrent.ExecutorService 
import java.util.concurrent.Executors 

List<String> urls = new ArrayList<String>(); // initialize array of URLs 
Collections.addAll(urls, args); // read URLs from "Parameters" input and add them to array 
ExecutorService pool = Executors.newFixedThreadPool(urls.size()); 

// initialize pool of Future Tasks with number of threads equal to size of URLs provided 
for (String url : urls) { // for each URL from list 
    final String currentURL = url; 
    pool.submit(new Runnable() { // Sumbit a new thread which will execute GET request 

     @Override 
     public void run() { 
      try { 
       HttpClient client = new DefaultHttpClient();    // Use Apache Commons HTTPClient to perform GET request 
       HttpGet get = new HttpGet(currentURL);      

       get.addHeader("authorization","Bearer ${AccessToken}");  // Add the access token into the header 
       get.addHeader("connection","keep-alive");     // Add keep-alive in header 

       HttpResponse response = client.execute(get);    // HttpResponse response = client.execute(post); 
       HttpEntity entity = response.getEntity(); 
       log.info("Response Status Code: " + response.getStatusLine().getStatusCode() + " " + response.getStatusLine().getReasonPhrase());  
       SampleResult.setResponseData(EntityUtils.toByteArray(entity));   
      } catch (Exception ex) { 
       ex.printStackTrace(); 
       throw ex; 
      } 

     } 
    }); 
} 
pool.shutdown(); // shut down thread pool 
+1

Ihre Frage ist unklar. Meinst du, du möchtest die Antwortzeit von 'HttpResponse response = client.execute (get);' anstelle der Reaktionszeit des gesamten Samplers bekommen? oder etwas anderes? –

+0

ja die Antwortzeit der Probe. Ich bekomme einen gültigen Antwort Inhalt (JSON Nachricht) für diese API Anfrage. aber ich möchte wissen, wie lange die Anfrage dauerte, daher muss ich die Reaktionszeit wissen. für was ich jetzt sehe, ist die Antwortzeit des Jsr223 Sampler etwa 10-20ms oder so, was nicht korrekt ist (sollte für diese API Anfrage über 1> sec sein). – DMC

+0

Seltsamerweise: Ich würde denken, Sampler wäre länger als einzelne Operation in ihm. Es könnte etwas mit der Verwendung separater Threads zu tun haben, um den Code auszuführen. Die Hauptannahme von JMeter ist, dass jeder Sampler eine einzelne "Operation" ist, die von einem einzelnen Thread ausgeführt wird. Und Sie haben mehrere Threads, die mehrere Dinge parallel zu mehreren URLs ausführen. So kann es komisch werden. Ich würde vorschlagen, Sampler eine Sache zu verarbeiten, und steuern die Verarbeitung aller URLs auf Thread-Gruppenebene –

Antwort

3

Ihre Probe kehrt vor dem Thread Ihre Anfrage Ausführung ist abgeschlossen, die shutdown() -Methode von ThreadPoolExecutor das Herunterfahren initiiert, aber für sie nicht warten. Versuchen Sie mit awaistTermination: pool.awaitTermination(60, TimeUnit.SECONDS)

+0

Wie würde dann mein Code aussehen? wenn ich pool.shutdown() ersetze; mit 'pool.waitTermination (60, TimeUnit.SECONDS)' dann bekomme ich eine Antwort Nachricht: javax.script.ScriptException: groovy.lang.MissingPropertyException: Keine solche Eigenschaft: TimeUnit für Klasse: Script4 – DMC

+0

behoben, dass mit dem Import java.util. concurrent.TimeUnit, aber das Beispiel scheint jetzt immer zu laufen, bis das Timeout erreicht ist .. und zeigt dann die Antwort an. Antwort/Ladezeit ist auch 60 sec – DMC

+1

ha ja sorry, ich habe den Import vergessen. und Sie müssen dann herunterfahren und abwarten. Ich war nicht sehr klar, mein Schlechter. – ARA