Author: [email protected]
Date: Wed Apr  6 09:22:57 2011
New Revision: 946

Log:
[AMDATU-340] Fixed proper working of perf test in case of small amount of 
samples

Modified:
   
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ReportSummary.java
   
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ZSamples.java
   trunk/etc/performancetest/src/main/resources/report_template.html

Modified: 
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ReportSummary.java
==============================================================================
--- 
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ReportSummary.java
     (original)
+++ 
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ReportSummary.java
     Wed Apr  6 09:22:57 2011
@@ -41,13 +41,11 @@
     private List<JMeterPlanReport> m_reports = new 
ArrayList<JMeterPlanReport>();
     private String m_versionX;
     private String m_versionY;
-    private String m_reportName;
     private String m_reportFileName;
     private String m_template = null;
-    
+
     public ReportSummary(ApplicationContext context, String reportName) {
         m_context = context;
-        m_reportName = reportName;
         m_reportFileName = context.resultsDir + File.separator + reportName + 
".html";
     }
 
@@ -96,7 +94,7 @@
             
System.out.println("--------------------------------------------------\n");
         }
     }
-    
+
     private String loadHtmlTemplate() throws IOException {
         if (m_template == null) {
             URL url = 
getClass().getClassLoader().getResources("report_template.html").nextElement();
@@ -114,7 +112,7 @@
     private String getResultTable() {
         StringBuffer table = new StringBuffer();
         for (JMeterPlanReport report : m_reports) {
-            
+
             table.append("<table border=\"1\">");
             table.append("<tr><td>#Processors</td><td>" + 
Runtime.getRuntime().availableProcessors() + "</td></tr>");
             table.append("<tr><td>Memory</td><td>" + 
toMegaBytes(Runtime.getRuntime().freeMemory()) + " free of available " + 
toMegaBytes(Runtime.getRuntime().maxMemory()) + "</td></tr>");
@@ -151,31 +149,35 @@
             // Mean of X
             table.append("<tr><td>M<sub>x</sub></td>");
             for (ZSamples sample : report.getSamples()) {
-                table.append("<td>" + round(sample.sampleMeanX) + "</td>");
+                if (sample.sampleMeanX.isNaN()) {
+                    table.append(reallyBad("-"));
+                } else {
+                    table.append("<td>" + round(sample.sampleMeanX) + "</td>");
+                }
             }
             table.append("</tr>");
-            
+
             // Minimum of X
             table.append("<tr><td>Min<sub>x</sub></td>");
             for (ZSamples sample : report.getSamples()) {
                 table.append("<td>" + round(sample.minX) + "</td>");
             }
             table.append("</tr>");
-            
+
             // Maximum of X
             table.append("<tr><td>Max<sub>x</sub></td>");
             for (ZSamples sample : report.getSamples()) {
                 table.append("<td>" + round(sample.maxX) + "</td>");
             }
             table.append("</tr>");   
-            
+
             // Median of X
             table.append("<tr><td>Median<sub>x</sub></td>");
             for (ZSamples sample : report.getSamples()) {
                 table.append("<td>" + round(sample.medianX) + "</td>");
             }
             table.append("</tr>");
-            
+
             // Wald-Wolfowitz probability of X
             table.append("<tr><td>Wald-Wolfowitz<sub>x</sub></td>");
             for (ZSamples sample : report.getSamples()) {
@@ -190,31 +192,35 @@
             // Mean of Y
             table.append("<tr><td>M<sub>y</sub></td>");
             for (ZSamples sample : report.getSamples()) {
-                table.append("<td>" + round(sample.sampleMeanY) + "</td>");
+                if (sample.sampleMeanY.isNaN()) {
+                    table.append(reallyBad("-"));
+                } else {
+                    table.append("<td>" + round(sample.sampleMeanY) + "</td>");
+                }
             }
             table.append("</tr>");
-            
+
             // Minimum of Y
             table.append("<tr><td>Min<sub>y</sub></td>");
             for (ZSamples sample : report.getSamples()) {
                 table.append("<td>" + round(sample.minY) + "</td>");
             }
             table.append("</tr>");
-            
+
             // Maximum of Y
             table.append("<tr><td>Max<sub>y</sub></td>");
             for (ZSamples sample : report.getSamples()) {
                 table.append("<td>" + round(sample.maxY) + "</td>");
             }
             table.append("</tr>");
-            
+
             // Median of Y
             table.append("<tr><td>Median<sub>y</sub></td>");
             for (ZSamples sample : report.getSamples()) {
                 table.append("<td>" + round(sample.medianY) + "</td>");
             }
             table.append("</tr>");
-            
+
             // Wald-Wolfowitz probability of X
             table.append("<tr><td>Wald-Wolfowitz<sub>y</sub></td>");
             for (ZSamples sample : report.getSamples()) {
@@ -239,18 +245,20 @@
                 table.append("<td>" + round(sample.sampleSD) + "</td>");
             }
             table.append("</tr>");
-            
+
             // Median of Z
             table.append("<tr><td>Median<sub>z</sub></td>");
             for (ZSamples sample : report.getSamples()) {
                 table.append("<td>" + round(sample.medianZ) + "</td>");
             }
             table.append("</tr>");
-            
+
             // Wald-Wolfowitz probability of Z
             table.append("<tr><td>Wald-Wolfowitz<sub>z</sub></td>");
             for (ZSamples sample : report.getSamples()) {
-                if (sample.waldWolfowitzZ < 0.01) {
+                if (sample.waldWolfowitzZ.isNaN()) {
+                    table.append(reallyBad("-"));
+                } else if (sample.waldWolfowitzZ < 0.01) {
                     table.append(bad(round(100*sample.waldWolfowitzZ) + "%"));
                 } else {
                     table.append("<td>"+ round(100*sample.waldWolfowitzZ) + 
"%</td>");
@@ -275,19 +283,22 @@
             // [power] difference between X and Y
             table.append("<tr><td>D<sub>z</sub></td>");
             for (ZSamples sample : report.getSamples()) {
-                if (sample.D < 0) {
+                if (sample.D.isNaN()) {
+                    table.append("<td>-</td>");
+                } else if (sample.D < 0) {
                     table.append(good(round(sample.D)));
                 } else {
                     table.append(bad(round(sample.D)));
                 }
-
             }
             table.append("</tr>");
 
             // Percentile [power] difference between X and Y
             table.append("<tr><td>&Delta;<sub>z</sub></td>");
             for (ZSamples sample : report.getSamples()) {
-                if (sample.delta < -0.05) {
+                if (sample.delta.isNaN()) {
+                    table.append("<td>-</td>");
+                } else if (sample.delta < -0.05) {
                     table.append(reallyGood(round(100*sample.delta) + "%"));
                 } else if (sample.delta <= 0) {
                     table.append(good(round(100*sample.delta) + "%"));
@@ -338,14 +349,14 @@
         }    
         return  table.toString();
     }
-    
+
     public void toHtmlFile() throws IOException {
         // Read the template
         String report = loadHtmlTemplate();
         report = report.replace("${x_versus_y}", "Amdatu " + m_versionX + " 
(X) versus Amdatu " + m_versionY + " (Y)");
         report = report.replace("${results_header}", "Results for JMeter plan 
'" + m_reports.get(0).getName() + "'");
         report = report.replace("${results}", getResultTable());
-        
+
         FileOutputStream fos = null;
         PrintWriter pw = null;
         try {
@@ -384,7 +395,7 @@
     private String bad(Object value) {
         return "<td class=\"bad\">" + value + "</td>";
     }
-    
+
     private String reallyGood(Object value) {
         return "<td class=\"reallygood\">" + value + "</td>";
     }

Modified: 
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ZSamples.java
==============================================================================
--- 
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ZSamples.java
  (original)
+++ 
trunk/etc/performancetest/src/main/java/org/amdatu/test/performance/analysis/ZSamples.java
  Wed Apr  6 09:22:57 2011
@@ -53,15 +53,15 @@
     double medianZ;
     double waldWolfowitzX = 0;
     double waldWolfowitzY = 0;
-    double waldWolfowitzZ = 0;
-    double sampleMeanX;
-    double sampleMeanY;
+    Double waldWolfowitzZ = Double.NaN;
+    Double sampleMeanX = Double.NaN;
+    Double sampleMeanY = Double.NaN;
     double sampleMean;
     double sampleSD;
     double t;
     double p;
-    double D;
-    double delta;
+    Double D = Double.NaN;
+    Double delta = Double.NaN;
     int sampleMeanSize = 0;
     int sampleSize = 0;
     private ApplicationContext m_context;
@@ -117,15 +117,16 @@
         // P[((mean(X)-D)/sd)*sqrt(n)] >= (1-power)
         // Effectively this tell us that 'with probability [power] we can 
ensure that the difference in means 
         // between X and Y is at least D'
-        if (t <= 0) {
-            double valueOfT = 
tDistribution.inverseCumulativeProbability(1-power);
-            D = sampleMean-(sampleSD*valueOfT)/Math.sqrt(sampleSize);
-        } else {
-            double valueOfT = 
tDistribution.inverseCumulativeProbability(power);
-            D = sampleMean-(sampleSD*valueOfT)/Math.sqrt(sampleSize);
-        }
-
-        delta = D/sampleMeanY;
+        if (!H0) {
+            if (t <= 0) {
+                double valueOfT = 
tDistribution.inverseCumulativeProbability(1-power);
+                D = sampleMean-(sampleSD*valueOfT)/Math.sqrt(sampleSize);
+            } else {
+                double valueOfT = 
tDistribution.inverseCumulativeProbability(power);
+                D = sampleMean-(sampleSD*valueOfT)/Math.sqrt(sampleSize);
+            }
+            delta = D/sampleMeanY;
+        }        
     }
 
     private List<Double> getZ() throws IOException, MathException {
@@ -139,8 +140,8 @@
         try {
             fos = new FileOutputStream(samplesZOutput);
             pw = new PrintWriter(fos);
-            sampleMeanX = 0;
-            sampleMeanY = 0;
+            sampleMeanX = new Double(0);
+            sampleMeanY = new Double(0);
             for (int i=0; i<m_samplesX.size(); i++) {
                 double zi = m_samplesX.get(i) - m_samplesY.get(i);
                 sampleMeanX += m_samplesX.get(i);
@@ -170,7 +171,7 @@
         if (z.length > 0) {
             medianZ = new Median().evaluate(z);
             waldWolfowitzZ = getWaldWolfowitzProbability(z);
-        }
+        } 
         return results;
     }
 

Modified: trunk/etc/performancetest/src/main/resources/report_template.html
==============================================================================
--- trunk/etc/performancetest/src/main/resources/report_template.html   
(original)
+++ trunk/etc/performancetest/src/main/resources/report_template.html   Wed Apr 
 6 09:22:57 2011
@@ -74,6 +74,183 @@
                </style>
        </head>
        <body>
+
+       <IMG align="right" 
SRC="data:image/gif;base64,/9j/4AAQSkZJRgABAQEBLAEsAAD/4QBoRXhpZgAATU0AKgAAAAgABAEaAAUAAAABAAAAPgEbAAUA
+AAABAAAARgEoAAMAAAABAAIAAAExAAIAAAARAAAATgAAAAAAAAEsAAAAAQAAASwAAAABUGFpbnQu
+TkVUIHYzLjUuNQAA/9sAQwABAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
+AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB/9sAQwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
+AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB/8AAEQgARQDpAwEiAAIRAQMRAf/E
+AB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAE
+EQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZH
+SElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1
+tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEB
+AQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXET
+IjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFla
+Y2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXG
+x8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A/wA/+iitrw54c13x
+fr2keF/DGk32ueINe1C10rR9I0y2lu7/AFHUL2ZILW1tbeFXklllldVVVU9cnABNAGLXe+D/AIWf
+Ev4hTrbeBPAHjHxhOxwsfhrw5q2ssT6f6BaTj9a/uZ/4JRf8GyXwh8H+EvDHx8/4KOGTxd4u1eyt
+9Y0X9nG2f7Fonh2KZo7m0PxA1BJ3m1S/eBR5+gwQwQQee0d3MzxtEf6kdA0P4C/BbQYPCnwT+Dvw
+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"/>
+
                <h1>Performance test results</h1>
                <h2>${x_versus_y}</h2>
                <hr/>
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits

Reply via email to