You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by Benno Luthiger <be...@id.ethz.ch> on 2002/03/27 15:31:15 UTC

[PATCH] Write summary to reporter file

Hello

I'm using JMeter and I found it useful having the summary of a test run
written to the reporter file. Therefore I createt a new class
FilerSummary.java and included it in the class Filer.java. The information
written to the reporter file has the following form:
# Number of requests: 300
# Average value:      446
# Deviation:          1,203.807
# Minimal value:      155
# Maximal value:      7746
# Start time of test sequence: 27-Mar-02 12:12:37
# End time of test sequence:   27-Mar-02 12:18:55
# Duration of test sequence:   00:06:18 (+ 502 Milliseconds)

Hope you find it useful too.

Benno


Index: Filer.java
===================================================================
RCS file:
/home/cvspublic/jakarta-jmeter/src/org/apache/jmeter/reporters/Filer.java,v
retrieving revision 1.12
diff -u -r1.12 Filer.java
--- Filer.java	4 Mar 2002 23:08:54 -0000	1.12
+++ Filer.java	27 Mar 2002 12:26:33 -0000
@@ -84,6 +84,8 @@
   private boolean open = false;
   private String file;
   private PrintWriter stream;
+
+  private FilerSummary summary;

   // if set to true, the file will flush each time a sample is recorded.
   // required for non-gui testing. Will be added to GUI in a little bit.
@@ -177,6 +179,7 @@
 		long sample = sampleResult.getTime();
 		String data = (String)sampleResult.getValue(HttpSampleResult.DATA);
 		if (open) {
+			summary.addData(sample);
 		  if (verbose) {
 			 stream.print(sampleResult.getValue(SampleResult.SAMPLE_LABEL) + " " +
sample);
 			 if(data != null)
@@ -200,6 +203,7 @@
 		  else
 			 this.stream.println("\n#       URL                    Milliseconds\n");
 		}
+		summary = new FilerSummary();
 		this.open = true;
 	 }catch (Exception ex){
 		  ex.printStackTrace();
@@ -216,6 +220,7 @@
   public void close() {
 	 try{
 		if(this.open){
+			this.stream.println(summary.getSummary());
 		  this.stream.flush();
 		  this.stream.close();
 		}
@@ -250,4 +255,4 @@
 	 this.viewSubmitData = value;
   }

-}
+}
\ No newline at end of file


Index: Filer.java
===================================================================

/*
 * ====================================================================
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2001 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in
 * the documentation and/or other materials provided with the
 * distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 * if any, must include the following acknowledgment:
 * "This product includes software developed by the
 * Apache Software Foundation (http://www.apache.org/)."
 * Alternately, this acknowledgment may appear in the software itself,
 * if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Apache" and "Apache Software Foundation" and
 * "Apache JMeter" must not be used to endorse or promote products
 * derived from this software without prior written permission. For
 * written permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 * "Apache JMeter", nor may "Apache" appear in their name, without
 * prior written permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 */

package org.apache.jmeter.reporters;

import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Vector;

/**
 * This class calculates and holds summary information on a test-sequence.
 *
 * The summarized information has the following form:
 * # Number of requests: 300
 * # Average value:      446
 * # Deviation:          1,203.807
 * # Minimal value:      155
 * # Maximal value:      7746
 * # Start time of test sequence: 27-Mar-02 12:12:37
 * # End time of test sequence:   27-Mar-02 12:18:55
 * # Duration of test sequence:   00:06:18 (+ 502 Milliseconds)
 *
 * @author Benno Luthiger
 * @version 1.0
 */
public class FilerSummary {
	private Vector data;
	private long minValue = Integer.MAX_VALUE;
	private long maxValue = 0;
	private long sumValue = 0;
	private Date startTime;
	private Date endTime;

	/**
	 * Default constructor
	 */
	public FilerSummary() {
		super();
		data = new Vector();
	}
	/**
	 * Gets the summary information
	 *
	 * @return java.lang.String Summary of this test sequence
	 */
	public String getSummary() {
		StringBuffer lSummary = new StringBuffer("");
		int lCount = data.size();

		lSummary.append("\n# Number of requests: " + lCount);

		if (lCount > 0) {
			double lAverage = sumValue / lCount;
			DateFormat dateFormatter = DateFormat.getDateTimeInstance();
			NumberFormat numberFormatter = NumberFormat.getNumberInstance();

			lSummary.append("\n# Average value:      " +
numberFormatter.format(lAverage));
			lSummary.append("\n# Deviation:          " +
numberFormatter.format(getDeviation(lAverage, lCount)));
			lSummary.append("\n# Minimal value:      " + minValue);
			lSummary.append("\n# Maximal value:      " + maxValue);
			lSummary.append("\n# Start time of test sequence: " +
dateFormatter.format(startTime));
			lSummary.append("\n# End time of test sequence:   " +
dateFormatter.format(endTime));

			Date lElapsed = new Date(82800000 + endTime.getTime() -
startTime.getTime());
			SimpleDateFormat lTimeFormater = new SimpleDateFormat("HH:mm:ss (+ SSS
'Milliseconds')");
			lSummary.append("\n# Duration of test sequence:   " +
lTimeFormater.format(lElapsed));
		}
		return new String(lSummary);
	}

	/**
	 * Adds a new data point to the summary
	 *
	 * @param long inTime Time used to process the actual request
	 */
	public void addData(long inTime) {
		// remember start and end time of test sequence
		endTime = new Date(System.currentTimeMillis());
		if (startTime == null) startTime = endTime;

		// sets min and max value
		minValue = Math.min(inTime, minValue);
		maxValue = Math.max(inTime, maxValue);
		sumValue += inTime;

		// adds the data to the data vector
		data.add(new Long(inTime));
	}

	/**
	 * Calculates the deviation of the data points
	 *
	 * @param double inAverage The average of the data points.
	 * @param int inCount The number of data points.
	 * @return double The deviation of the data points.
	 */
	private double getDeviation(double inAverage, int inCount) {
		double outValue = 0;
		double lDifference;

		//pre
		if (inCount <= 1) return 0;

		Enumeration lTimeData = data.elements();
		while (lTimeData.hasMoreElements()) {
			lDifference = ((Long)lTimeData.nextElement()).floatValue() - inAverage;
			outValue += lDifference * lDifference;
		}
		outValue /= (inCount - 1);
		return Math.sqrt(outValue);
	}

}



--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>