diff --git a/src/main/java/org/bench4q/master/api/TestPlanController.java b/src/main/java/org/bench4q/master/api/TestPlanController.java index b2f920fc..6fa2e3d3 100644 --- a/src/main/java/org/bench4q/master/api/TestPlanController.java +++ b/src/main/java/org/bench4q/master/api/TestPlanController.java @@ -162,12 +162,17 @@ public class TestPlanController extends BaseController { if (!this.checkScope(UserService.NORAML_AUTHENTICATION)) { return null; } + ScriptBriefResultModel result = new ScriptBriefResultModel(); + TestPlanContext context = this.getTestPlanContainer() .getRunningTestPlans().get(testPlanId); + if (context == null) { + result.setFinished(true); + return result; + } RunningScriptModel scriptModel = context.getRunningScriptMap().get( new Integer(scriptId)); if (scriptModel == null || scriptModel.isFinish()) { - ScriptBriefResultModel result = new ScriptBriefResultModel(); result.setFinished(true); return result; } diff --git a/src/main/java/org/bench4q/master/communication/agent/RunScenarioModel.java b/src/main/java/org/bench4q/master/communication/agent/RunScenarioModel.java index 55655704..61ac7ddd 100644 --- a/src/main/java/org/bench4q/master/communication/agent/RunScenarioModel.java +++ b/src/main/java/org/bench4q/master/communication/agent/RunScenarioModel.java @@ -6,6 +6,9 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import org.bench4q.master.communication.agent.scriptrecord.UsePluginModel; +import org.bench4q.master.communication.agent.scriptrecord.UserBehaviorModel; + @XmlRootElement(name = "runScenario") public class RunScenarioModel { private int poolSize; diff --git a/src/main/java/org/bench4q/master/communication/agent/scriptrecord/BehaviorBaseModel.java b/src/main/java/org/bench4q/master/communication/agent/scriptrecord/BehaviorBaseModel.java new file mode 100644 index 00000000..0946a7fd --- /dev/null +++ b/src/main/java/org/bench4q/master/communication/agent/scriptrecord/BehaviorBaseModel.java @@ -0,0 +1,5 @@ +package org.bench4q.master.communication.agent.scriptrecord; + +public abstract class BehaviorBaseModel { + +} diff --git a/src/main/java/org/bench4q/master/communication/agent/scriptrecord/TimerBehaviorModel.java b/src/main/java/org/bench4q/master/communication/agent/scriptrecord/TimerBehaviorModel.java new file mode 100644 index 00000000..e76a9e6c --- /dev/null +++ b/src/main/java/org/bench4q/master/communication/agent/scriptrecord/TimerBehaviorModel.java @@ -0,0 +1,56 @@ +package org.bench4q.master.communication.agent.scriptrecord; + +import java.io.ByteArrayOutputStream; +import java.util.List; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; + +import org.bench4q.master.communication.agent.ParameterModel; + +@XmlRootElement(name = "timerBehavior") +public class TimerBehaviorModel { + private String use; + private String name; + private List parameters; + + @XmlElement + public String getUse() { + return use; + } + + public void setUse(String use) { + this.use = use; + } + + @XmlElement + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @XmlElementWrapper(name = "parameters") + @XmlElement(name = "parameter") + public List getParameters() { + return parameters; + } + + public void setParameters(List parameters) { + this.parameters = parameters; + } + + public String getModelString() throws JAXBException { + ByteArrayOutputStream os = new ByteArrayOutputStream(); + Marshaller marshaller = JAXBContext.newInstance(this.getClass()) + .createMarshaller(); + marshaller.marshal(this, os); + return os.toString(); + } +} diff --git a/src/main/java/org/bench4q/master/communication/agent/UsePluginModel.java b/src/main/java/org/bench4q/master/communication/agent/scriptrecord/UsePluginModel.java similarity index 82% rename from src/main/java/org/bench4q/master/communication/agent/UsePluginModel.java rename to src/main/java/org/bench4q/master/communication/agent/scriptrecord/UsePluginModel.java index c964c899..29ecdb69 100644 --- a/src/main/java/org/bench4q/master/communication/agent/UsePluginModel.java +++ b/src/main/java/org/bench4q/master/communication/agent/scriptrecord/UsePluginModel.java @@ -1,4 +1,4 @@ -package org.bench4q.master.communication.agent; +package org.bench4q.master.communication.agent.scriptrecord; import java.util.List; @@ -6,6 +6,8 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import org.bench4q.master.communication.agent.ParameterModel; + @XmlRootElement(name = "usePlugin") public class UsePluginModel { private String id; diff --git a/src/main/java/org/bench4q/master/communication/agent/UserBehaviorModel.java b/src/main/java/org/bench4q/master/communication/agent/scriptrecord/UserBehaviorModel.java similarity index 83% rename from src/main/java/org/bench4q/master/communication/agent/UserBehaviorModel.java rename to src/main/java/org/bench4q/master/communication/agent/scriptrecord/UserBehaviorModel.java index b4509a21..831b359f 100644 --- a/src/main/java/org/bench4q/master/communication/agent/UserBehaviorModel.java +++ b/src/main/java/org/bench4q/master/communication/agent/scriptrecord/UserBehaviorModel.java @@ -1,4 +1,4 @@ -package org.bench4q.master.communication.agent; +package org.bench4q.master.communication.agent.scriptrecord; import java.io.ByteArrayOutputStream; import java.util.List; @@ -10,8 +10,10 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import org.bench4q.master.communication.agent.ParameterModel; + @XmlRootElement(name = "userBehavior") -public class UserBehaviorModel { +public class UserBehaviorModel extends BehaviorBaseModel { private String use; private String name; private List parameters; diff --git a/src/main/java/org/bench4q/master/entity/db/ForTest.java b/src/main/java/org/bench4q/master/entity/db/ForTest.java new file mode 100644 index 00000000..f20aac14 --- /dev/null +++ b/src/main/java/org/bench4q/master/entity/db/ForTest.java @@ -0,0 +1,36 @@ +package org.bench4q.master.entity.db; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "fortest") +public class ForTest { + private int id; + private String content; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id", nullable = false) + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @Column(name = "content", columnDefinition = "LONGTEXT", nullable = false) + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + +} diff --git a/src/main/java/org/bench4q/master/entity/db/MonitorResult.java b/src/main/java/org/bench4q/master/entity/db/MonitorResult.java index 08dfe6d3..53ade9bf 100644 --- a/src/main/java/org/bench4q/master/entity/db/MonitorResult.java +++ b/src/main/java/org/bench4q/master/entity/db/MonitorResult.java @@ -51,7 +51,7 @@ public class MonitorResult { this.type = type; } - @Column(name = "content", columnDefinition = "TEXT", nullable = false) + @Column(name = "content", columnDefinition = "LONGTEXT", nullable = false) public String getContent() { return content; } diff --git a/src/main/java/org/bench4q/master/entity/db/Script.java b/src/main/java/org/bench4q/master/entity/db/Script.java index bc97f859..8e10cc78 100644 --- a/src/main/java/org/bench4q/master/entity/db/Script.java +++ b/src/main/java/org/bench4q/master/entity/db/Script.java @@ -68,7 +68,7 @@ public class Script { this.user = user; } - @Column(name = "scriptContent", columnDefinition = "TEXT", nullable = false) + @Column(name = "scriptContent", columnDefinition = "LONGTEXT", nullable = false) @XmlElement public String getScriptContent() { return scriptContent; diff --git a/src/main/java/org/bench4q/master/entity/db/TestPlan.java b/src/main/java/org/bench4q/master/entity/db/TestPlan.java index 5a89acef..bdd9bb5d 100644 --- a/src/main/java/org/bench4q/master/entity/db/TestPlan.java +++ b/src/main/java/org/bench4q/master/entity/db/TestPlan.java @@ -79,7 +79,7 @@ public class TestPlan { this.user = user; } - @Column(name = "testPlanModelContent", columnDefinition = "Text", nullable = false) + @Column(name = "testPlanModelContent", columnDefinition = "LONGText", nullable = false) public String getTestPlanModelContent() { return testPlanModelContent; } diff --git a/src/main/java/org/bench4q/master/entity/db/TestPlanScriptResult.java b/src/main/java/org/bench4q/master/entity/db/TestPlanScriptResult.java index 5c7e0e49..4fa8d65f 100644 --- a/src/main/java/org/bench4q/master/entity/db/TestPlanScriptResult.java +++ b/src/main/java/org/bench4q/master/entity/db/TestPlanScriptResult.java @@ -16,10 +16,17 @@ import javax.persistence.Table; public class TestPlanScriptResult { private int id; private TestPlanScript testPlanScript; - private long totalSuccessCount; - private long totalFailCount; - private long totalFinishedCount; + private long totalSuccessCountFromBegin; + private long totalFailCountFromBegin; + private long averageResponseTime; + private long maxResponseTime; + private long minResposneTime; + private long successThroughputThisTime; + private long failThroughputThisTime; + private long responseTimeDeviationThisTime; + private long failRateThisTime; + private long averageElapsedTime; private Date createDatetime; @@ -44,31 +51,22 @@ public class TestPlanScriptResult { this.testPlanScript = testPlanScript; } - @Column(name = "totalSuccessCount", nullable = false) - public long getTotalSuccessCount() { - return totalSuccessCount; + @Column(name = "totalSuccessCountFromBegin", nullable = false) + public long getTotalSuccessCountFromBegin() { + return totalSuccessCountFromBegin; } - public void setTotalSuccessCount(long totalSuccessCount) { - this.totalSuccessCount = totalSuccessCount; + public void setTotalSuccessCountFromBegin(long totalSuccessCountFromBegin) { + this.totalSuccessCountFromBegin = totalSuccessCountFromBegin; } - @Column(name = "totalFailCount", nullable = false) - public long getTotalFailCount() { - return totalFailCount; + @Column(name = "totalFailCountFromBegin", nullable = false) + public long getTotalFailCountFromBegin() { + return totalFailCountFromBegin; } - public void setTotalFailCount(long totalFailCount) { - this.totalFailCount = totalFailCount; - } - - @Column(name = "totalFinishedCount", nullable = false) - public long getTotalFinishedCount() { - return totalFinishedCount; - } - - public void setTotalFinishedCount(long totalFinishedCount) { - this.totalFinishedCount = totalFinishedCount; + public void setTotalFailCountFromBegin(long totalFailCountFromBegin) { + this.totalFailCountFromBegin = totalFailCountFromBegin; } @Column(name = "averageResponseTime", nullable = false) @@ -80,6 +78,61 @@ public class TestPlanScriptResult { this.averageResponseTime = averageResponseTime; } + @Column(name = "maxResponseTime", nullable = false) + public long getMaxResponseTime() { + return maxResponseTime; + } + + public void setMaxResponseTime(long maxResponseTime) { + this.maxResponseTime = maxResponseTime; + } + + @Column(name = "minResposneTime", nullable = false) + public long getMinResposneTime() { + return minResposneTime; + } + + public void setMinResposneTime(long minResposneTime) { + this.minResposneTime = minResposneTime; + } + + @Column(name = "successThroughputThisTime", nullable = false) + public long getSuccessThroughputThisTime() { + return successThroughputThisTime; + } + + public void setSuccessThroughputThisTime(long successThroughputThisTime) { + this.successThroughputThisTime = successThroughputThisTime; + } + + @Column(name = "failThroughputThisTime", nullable = false) + public long getFailThroughputThisTime() { + return failThroughputThisTime; + } + + public void setFailThroughputThisTime(long failThroughputThisTime) { + this.failThroughputThisTime = failThroughputThisTime; + } + + @Column(name = "responseTimeDeviationThisTime", nullable = false) + public long getResponseTimeDeviationThisTime() { + return responseTimeDeviationThisTime; + } + + public void setResponseTimeDeviationThisTime( + long responseTimeDeviationThisTime) { + this.responseTimeDeviationThisTime = responseTimeDeviationThisTime; + } + + @Column(name = "failRateThisTime", nullable = false) + public long getFailRateThisTime() { + return failRateThisTime; + } + + public void setFailRateThisTime(long failRateThisTime) { + this.failRateThisTime = failRateThisTime; + } + @Column(name = "averageElapsedTime", nullable = false) public long getAverageElapsedTime() { return averageElapsedTime; diff --git a/src/main/java/org/bench4q/master/report/MonitorReportService.java b/src/main/java/org/bench4q/master/report/MonitorReportService.java index 61f1e79c..c6443079 100644 --- a/src/main/java/org/bench4q/master/report/MonitorReportService.java +++ b/src/main/java/org/bench4q/master/report/MonitorReportService.java @@ -28,10 +28,10 @@ import com.lowagie.text.Document; @Component public class MonitorReportService { - public static String Processor = "ProcessorTimePercent"; - public static String Memory = "Memory"; - public static String logical_Disk = "logicalDisk"; - public static String network_Interface = "networkInterface"; + public static String Processor = "ProcessorTimePercent (unit: %)"; + public static String Memory = "Memory Available Memory(unit: KiloByte)"; + public static String logical_Disk = "logicalDisk IO (unit: Byte)"; + public static String network_Interface = "networkInterface IO (unit: Byte/second)"; private TestPlanScriptService testPlanScriptService; private TestPlanService testPlanService; private MonitorResultService monitorResultService; @@ -166,14 +166,14 @@ public class MonitorReportService { int seriesCount = list.get(0).getProcessorModel() .getProcessorModelList().size(); - TimeSeries[] timeSeriesArray = ReportService.buildSeries(seriesCount, - Processor); + List timeSeriesArray = ReportService.buildSeries( + seriesCount, Processor); for (MonitorProcessorResponseModel model : list) { - for (int i = 0; i < timeSeriesArray.length; i++) { - timeSeriesArray[i].addOrUpdate( - new Second(model.getCreateDatetime()), model - .getProcessorModel().getProcessorModelList() + for (int i = 0; i < timeSeriesArray.size(); i++) { + timeSeriesArray.get(i).addOrUpdate( + new Second(model.getCreateDatetime()), + model.getProcessorModel().getProcessorModelList() .get(i).getProcessorTimePercent()); } } @@ -190,13 +190,13 @@ public class MonitorReportService { return; } int seriesCount = 1; - TimeSeries[] timeSeriesArray = ReportService.buildSeries(seriesCount, - Memory); + List timeSeriesArray = ReportService.buildSeries( + seriesCount, Memory); for (MonitorMemoryResponseModel model : list) { - for (int i = 0; i < timeSeriesArray.length; i++) { - timeSeriesArray[i].addOrUpdate( - new Second(model.getCreateDatetime()), model - .getMemoryModel().getPagesPerSecond()); + for (int i = 0; i < timeSeriesArray.size(); i++) { + timeSeriesArray.get(i).addOrUpdate( + new Second(model.getCreateDatetime()), + model.getMemoryModel().getAvailableKiloBytes()); } } ReportService.writeImageIntoPdf( @@ -212,15 +212,15 @@ public class MonitorReportService { } int seriesCount = list.get(0).getLogicalDiskModel() .getLogicalDiskList().size(); - TimeSeries[] timeSeriesArray = ReportService.buildSeries(seriesCount, - logical_Disk); + List timeSeriesArray = ReportService.buildSeries( + seriesCount, logical_Disk); for (MonitorLogicalDiskResponseModel model : list) { - for (int i = 0; i < timeSeriesArray.length; i++) { - timeSeriesArray[i].addOrUpdate( - new Second(model.getCreateDatetime()), model - .getLogicalDiskModel().getLogicalDiskList() - .get(i).getDiskTimePercent()); + for (int i = 0; i < timeSeriesArray.size(); i++) { + timeSeriesArray.get(i).addOrUpdate( + new Second(model.getCreateDatetime()), + model.getLogicalDiskModel().getLogicalDiskList().get(i) + .getDiskBytesPerSecond()); } } @@ -229,19 +229,27 @@ public class MonitorReportService { timeSeriesArray, logical_Disk).toByteArray(), document); } + /** + * refactor this kind of use + * + * @param list + * @param document + * @throws Exception + */ + private void createNetworkImage(List list, Document document) throws Exception { if (list == null || list.size() == 0) { return; } int seriesCount = list.get(0).getModel().getNetworkList().size(); - TimeSeries[] timeSeriesArray = ReportService.buildSeries(seriesCount, - network_Interface); + List timeSeriesArray = ReportService.buildSeries( + seriesCount, network_Interface); for (MonitorNetWorkReponseModel model : list) { - for (int i = 0; i < timeSeriesArray.length; i++) { - timeSeriesArray[i].addOrUpdate( - new Second(model.getCreateDatetime()), model.getModel() - .getNetworkList().get(i) + for (int i = 0; i < timeSeriesArray.size(); i++) { + timeSeriesArray.get(i).addOrUpdate( + new Second(model.getCreateDatetime()), + model.getModel().getNetworkList().get(i) .getBytesTotalPerSecond()); } } diff --git a/src/main/java/org/bench4q/master/report/ReportService.java b/src/main/java/org/bench4q/master/report/ReportService.java index c7dbb857..7f0f7a16 100644 --- a/src/main/java/org/bench4q/master/report/ReportService.java +++ b/src/main/java/org/bench4q/master/report/ReportService.java @@ -1,15 +1,22 @@ package org.bench4q.master.report; +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Font; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import org.apache.commons.io.FileUtils; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; +import org.jfree.chart.plot.XYPlot; +import org.jfree.chart.title.TextTitle; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; import org.springframework.beans.factory.annotation.Autowired; @@ -25,10 +32,11 @@ import com.lowagie.text.pdf.PdfWriter; @Component public class ReportService { public static String Time = "time"; - // public static String Pdf_Path = "test.pdf"; public static String PDF_FOLDER = "report"; private ScriptReportService scriptReportService; private MonitorReportService monitorReportService; + private static int PICTURE_WIDTH = 500; + private static int PICTURE_HIGHT = 600; public ScriptReportService getScriptReportService() { return scriptReportService; @@ -91,39 +99,62 @@ public class ReportService { document.add(paragraph); } - static ByteArrayOutputStream buildChartStream(Document document, - int seriesCount, TimeSeries[] timeSeriesArray, String value) + public static ByteArrayOutputStream buildChartStream(Document document, + int seriesCount, List timeSeriesArray, String value) throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); JFreeChart chart = ChartFactory.createTimeSeriesChart(value, ReportService.Time, value, buildDataSet(timeSeriesArray), true, true, true); - chart.setBackgroundPaint(java.awt.Color.white); - ChartUtilities.writeChartAsPNG(outputStream, chart, 400, 300); + adjustChartFont(value, chart); + + ChartUtilities.writeChartAsPNG(outputStream, chart, PICTURE_WIDTH, + PICTURE_HIGHT); return outputStream; } - static TimeSeries[] buildSeries(int seriesCount, String mainTitle) { - TimeSeries[] timeSeriesArray = new TimeSeries[seriesCount]; + private static void adjustChartFont(String value, JFreeChart chart) { + Font xfont = new Font("ËÎÌå", Font.CENTER_BASELINE, 14);// X + Font yfont = new Font("ËÎÌå", Font.CENTER_BASELINE, 14);// Y + Font kfont = new Font("ËÎÌå", Font.CENTER_BASELINE, 12);// + Font titleFont = new Font("΢ÈíÑźÚ", Font.CENTER_BASELINE, 16); // title + + chart.setBorderStroke(new BasicStroke(1)); + chart.setBorderVisible(true); + chart.setBorderPaint(Color.cyan); + + chart.setTitle(new TextTitle(value, titleFont)); + XYPlot plot = chart.getXYPlot(); + plot.getRangeAxis().setLabelFont(yfont); + plot.getRangeAxis().setTickLabelFont(kfont); + plot.getDomainAxis().setLabelFont(xfont); + plot.getDomainAxis().setTickLabelFont(kfont); + chart.setBackgroundPaint(java.awt.Color.white); + } + + public static List buildSeries(int seriesCount, String mainTitle) { + List timeSeriesArray = new ArrayList( + seriesCount); for (int i = 0; i < seriesCount; i++) { - timeSeriesArray[i] = new TimeSeries(mainTitle + "-" + i); + timeSeriesArray.add(new TimeSeries(mainTitle + "-" + i)); } return timeSeriesArray; } - static TimeSeriesCollection buildDataSet(final TimeSeries[] timeSeriesArray) { + static TimeSeriesCollection buildDataSet( + final List timeSeriesArray) { TimeSeriesCollection lineDataset = new TimeSeriesCollection(); if (timeSeriesArray == null) { return null; } - for (int i = 0; i < timeSeriesArray.length; i++) { - lineDataset.addSeries(timeSeriesArray[i]); + for (TimeSeries timeSeries : timeSeriesArray) { + lineDataset.addSeries(timeSeries); } return lineDataset; } - static void writeImageIntoPdf(byte[] buffer, Document document) + public static void writeImageIntoPdf(byte[] buffer, Document document) throws Exception { Image image = Image.getInstance(buffer); image.setAlignment(Element.ALIGN_CENTER); diff --git a/src/main/java/org/bench4q/master/report/ScriptReportService.java b/src/main/java/org/bench4q/master/report/ScriptReportService.java index cf647352..04fce97a 100644 --- a/src/main/java/org/bench4q/master/report/ScriptReportService.java +++ b/src/main/java/org/bench4q/master/report/ScriptReportService.java @@ -1,34 +1,32 @@ package org.bench4q.master.report; -import java.io.ByteArrayOutputStream; +import java.lang.reflect.Field; +import java.util.ArrayList; import java.util.List; import java.util.UUID; +import org.apache.log4j.Logger; import org.bench4q.master.entity.db.TestPlanScript; import org.bench4q.master.entity.db.TestPlanScriptResult; import org.bench4q.master.service.MonitorResultService; import org.bench4q.master.service.TestPlanScriptService; import org.bench4q.master.service.TestPlanService; -import org.jfree.chart.ChartFactory; -import org.jfree.chart.ChartUtilities; -import org.jfree.chart.JFreeChart; -import org.jfree.chart.title.TextTitle; import org.jfree.data.time.Second; import org.jfree.data.time.TimeSeries; -import org.jfree.data.time.TimeSeriesCollection; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.lowagie.text.Document; -import com.lowagie.text.Element; -import com.lowagie.text.Paragraph; @Component public class ScriptReportService { - public static String Average_Response_Time = "averageResponseTime"; + public static String SCRIPT_TITLE = "Script result"; + public static String Average_Response_Time = "averageResponseTime(unit: ms)"; + public static String MAX_RESPONSE_TIME = "maxResponseTime(unit : time)"; private TestPlanScriptService testPlanScriptService; private TestPlanService testPlanService; private MonitorResultService monitorResultService; + private Logger logger = Logger.getLogger(ScriptReportService.class); public TestPlanScriptService getTestPlanScriptService() { return testPlanScriptService; @@ -84,41 +82,74 @@ public class ScriptReportService { private void createAverageReponseTimeImage( List results, Document document) { - TimeSeries timeSeries = new TimeSeries(Average_Response_Time); - TimeSeriesCollection lineSeriesCollection = new TimeSeriesCollection(); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - String scriptName = "null"; + // TimeSeriesCollection lineSeriesCollection = new + // TimeSeriesCollection(); + List timeSeriesList = new ArrayList(); + // ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + // String scriptName = "null"; if (results == null) { return; } - for (TestPlanScriptResult result : results) { - timeSeries.addOrUpdate(new Second(result.getCreateDatetime()), - result.getAverageResponseTime()); - } - lineSeriesCollection.addSeries(timeSeries); - JFreeChart chart = ChartFactory.createTimeSeriesChart( - Average_Response_Time, ReportService.Time, - Average_Response_Time, lineSeriesCollection, true, true, true); - chart.setBackgroundPaint(java.awt.Color.white); - - if (results.size() > 0) { - scriptName = results.get(0).getTestPlanScript().getScript() - .getName(); - chart.addSubtitle(new TextTitle(scriptName)); - } + addScriptSeries(results, timeSeriesList, "averageResponseTime"); + addScriptSeries(results, timeSeriesList, "maxResponseTime"); try { - ChartUtilities.writeChartAsPNG(outputStream, chart, 400, 300); - Paragraph paragraph = new Paragraph(Average_Response_Time + " of " - + scriptName); - paragraph.setAlignment(Element.ALIGN_CENTER); - document.add(paragraph); - ReportService.writeImageIntoPdf(outputStream.toByteArray(), - document); + ReportService.writeImageIntoPdf( + ReportService.buildChartStream(document, + timeSeriesList.size(), timeSeriesList, + Average_Response_Time + "&" + MAX_RESPONSE_TIME) + .toByteArray(), document); } catch (Exception e) { e.printStackTrace(); } + // JFreeChart chart = ChartFactory.createTimeSeriesChart(SCRIPT_TITLE, + // ReportService.Time, Average_Response_Time + "&" + // + MAX_RESPONSE_TIME, lineSeriesCollection, true, true, + // true); + // chart.setBackgroundPaint(java.awt.Color.white); + // + // if (results.size() > 0) { + // scriptName = results.get(0).getTestPlanScript().getScript() + // .getName(); + // chart.addSubtitle(new TextTitle(scriptName)); + // } + + // ReportService.buildChartStream(document, lineSeriesCollection + // .getSeriesCount(), lineSeriesCollection.getSeries().toArray(a), + // Average_Response_Time + "&" + MAX_RESPONSE_TIME); + // ReportService.writeImageIntoPdf(ReportService.buildChartStream(), + // document); + + // try { + // ChartUtilities.writeChartAsPNG(outputStream, chart, 400, 300); + // Paragraph paragraph = new Paragraph(Average_Response_Time + " of " + // + scriptName); + // paragraph.setAlignment(Element.ALIGN_CENTER); + // document.add(paragraph); + // ReportService.writeImageIntoPdf(outputStream.toByteArray(), + // document); + // } catch (Exception e) { + // e.printStackTrace(); + // } } + // TODO: refactor this to a kind of command mode + private void addScriptSeries(List results, + List timeSeriesList, String fieldName) { + try { + TimeSeries timeSeries = new TimeSeries(fieldName); + for (TestPlanScriptResult result : results) { + Field field = result.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + timeSeries.addOrUpdate(new Second(result.getCreateDatetime()), + field.getLong(result)); + } + timeSeriesList.add(timeSeries); + } catch (Exception e) { + logger.error(e.toString() + + " in addScriptSeries where fieldName is : " + fieldName); + } + + } } diff --git a/src/main/java/org/bench4q/master/scriptrecord/httpcapture/Bench4qTestScriptAdapter.java b/src/main/java/org/bench4q/master/scriptrecord/httpcapture/Bench4qTestScriptAdapter.java index 2ef3d199..71b95294 100644 --- a/src/main/java/org/bench4q/master/scriptrecord/httpcapture/Bench4qTestScriptAdapter.java +++ b/src/main/java/org/bench4q/master/scriptrecord/httpcapture/Bench4qTestScriptAdapter.java @@ -11,8 +11,8 @@ import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import org.bench4q.master.communication.agent.RunScenarioModel; -import org.bench4q.master.communication.agent.UsePluginModel; -import org.bench4q.master.communication.agent.UserBehaviorModel; +import org.bench4q.master.communication.agent.scriptrecord.UsePluginModel; +import org.bench4q.master.communication.agent.scriptrecord.UserBehaviorModel; public class Bench4qTestScriptAdapter implements IScriptAdapter { private RunScenarioModel runScenarioModel; diff --git a/src/main/java/org/bench4q/master/scriptrecord/httpcapture/IScriptAdapter.java b/src/main/java/org/bench4q/master/scriptrecord/httpcapture/IScriptAdapter.java index 4c4a9765..42c45bc5 100644 --- a/src/main/java/org/bench4q/master/scriptrecord/httpcapture/IScriptAdapter.java +++ b/src/main/java/org/bench4q/master/scriptrecord/httpcapture/IScriptAdapter.java @@ -3,8 +3,8 @@ package org.bench4q.master.scriptrecord.httpcapture; import java.util.List; import org.bench4q.master.communication.agent.RunScenarioModel; -import org.bench4q.master.communication.agent.UsePluginModel; -import org.bench4q.master.communication.agent.UserBehaviorModel; +import org.bench4q.master.communication.agent.scriptrecord.UsePluginModel; +import org.bench4q.master.communication.agent.scriptrecord.UserBehaviorModel; public interface IScriptAdapter { diff --git a/src/main/java/org/bench4q/master/scriptrecord/httpcapture/generator/AbstractCodeGenerator.java b/src/main/java/org/bench4q/master/scriptrecord/httpcapture/generator/AbstractCodeGenerator.java index abc5ddea..b1534653 100644 --- a/src/main/java/org/bench4q/master/scriptrecord/httpcapture/generator/AbstractCodeGenerator.java +++ b/src/main/java/org/bench4q/master/scriptrecord/httpcapture/generator/AbstractCodeGenerator.java @@ -20,7 +20,7 @@ import javax.xml.bind.Marshaller; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.bench4q.master.communication.agent.RunScenarioModel; -import org.bench4q.master.communication.agent.UserBehaviorModel; +import org.bench4q.master.communication.agent.scriptrecord.UserBehaviorModel; import org.bench4q.master.scriptrecord.httpcapture.Action; import org.bench4q.master.scriptrecord.httpcapture.Config; import org.bench4q.master.scriptrecord.httpcapture.HeaderValue; diff --git a/src/main/java/org/bench4q/master/scriptrecord/httpcapture/generator/Bench4qCodeGenerator.java b/src/main/java/org/bench4q/master/scriptrecord/httpcapture/generator/Bench4qCodeGenerator.java index 0e6570f6..5f435299 100644 --- a/src/main/java/org/bench4q/master/scriptrecord/httpcapture/generator/Bench4qCodeGenerator.java +++ b/src/main/java/org/bench4q/master/scriptrecord/httpcapture/generator/Bench4qCodeGenerator.java @@ -5,8 +5,8 @@ import java.util.List; import org.apache.log4j.Logger; import org.bench4q.master.communication.agent.ParameterModel; -import org.bench4q.master.communication.agent.UsePluginModel; -import org.bench4q.master.communication.agent.UserBehaviorModel; +import org.bench4q.master.communication.agent.scriptrecord.UsePluginModel; +import org.bench4q.master.communication.agent.scriptrecord.UserBehaviorModel; import org.bench4q.master.scriptrecord.httpcapture.Config; import org.bench4q.master.scriptrecord.httpcapture.HeaderValue; import org.bench4q.master.scriptrecord.httpcapture.IScriptAdapter; diff --git a/src/main/java/org/bench4q/master/service/MonitorResultService.java b/src/main/java/org/bench4q/master/service/MonitorResultService.java index b2d897b0..944efdca 100644 --- a/src/main/java/org/bench4q/master/service/MonitorResultService.java +++ b/src/main/java/org/bench4q/master/service/MonitorResultService.java @@ -62,6 +62,7 @@ public class MonitorResultService { return true; } catch (Exception e) { logger.error(e.toString() + " when saveMonitorResult"); + e.printStackTrace(); transaction.rollback(); return false; } finally { diff --git a/src/main/java/org/bench4q/master/service/MonitorService.java b/src/main/java/org/bench4q/master/service/MonitorService.java index 05d84540..d8bce328 100644 --- a/src/main/java/org/bench4q/master/service/MonitorService.java +++ b/src/main/java/org/bench4q/master/service/MonitorService.java @@ -2,6 +2,7 @@ package org.bench4q.master.service; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; import java.util.Date; import java.util.UUID; import java.util.concurrent.ExecutorService; @@ -162,8 +163,7 @@ public class MonitorService { } saveResultRunable(NetworkInterfaceModel.class.getName(), - changeCharsetToISO(httpResponse.getContent()), - testPlanRunId, hostName); + httpResponse.getContent(), testPlanRunId, hostName); return extractNetworkInterfaceModel(httpResponse.getContent()); } catch (Exception e) { logger.error(e.getMessage() + "where testPlanRunId = " @@ -181,8 +181,8 @@ public class MonitorService { Unmarshaller unmarshaller = JAXBContext.newInstance( NetworkInterfaceModel.class).createUnmarshaller(); return (NetworkInterfaceModel) unmarshaller - .unmarshal(new ByteArrayInputStream(changeCharsetToISO(content) - .getBytes())); + .unmarshal(new ByteArrayInputStream(content.getBytes(Charset + .forName("UTF-8")))); } public static String changeCharsetToISO(String content) diff --git a/src/main/java/org/bench4q/master/service/ScriptService.java b/src/main/java/org/bench4q/master/service/ScriptService.java index f753061d..1d89025c 100644 --- a/src/main/java/org/bench4q/master/service/ScriptService.java +++ b/src/main/java/org/bench4q/master/service/ScriptService.java @@ -10,7 +10,7 @@ import javax.xml.bind.Unmarshaller; import org.apache.log4j.Logger; import org.bench4q.master.communication.agent.RunScenarioModel; -import org.bench4q.master.communication.agent.UserBehaviorModel; +import org.bench4q.master.communication.agent.scriptrecord.UserBehaviorModel; import org.bench4q.master.entity.db.Script; import org.bench4q.master.entity.db.User; import org.bench4q.master.helper.SessionHelper; diff --git a/src/main/java/org/bench4q/master/service/TestPlanScriptService.java b/src/main/java/org/bench4q/master/service/TestPlanScriptService.java index 9f654a7c..18a7f7ab 100644 --- a/src/main/java/org/bench4q/master/service/TestPlanScriptService.java +++ b/src/main/java/org/bench4q/master/service/TestPlanScriptService.java @@ -163,16 +163,25 @@ public class TestPlanScriptService { } private TestPlanScriptResult buildScriptResultWithModel( - ScriptBriefResultModel resultModel, TestPlanScript testPlanScript, + ScriptBriefResultModel model, TestPlanScript testPlanScript, Date createDatetime) { TestPlanScriptResult result = new TestPlanScriptResult(); result.setTestPlanScript(testPlanScript); - result.setTotalFailCount(resultModel.getTotalFailCountFromBegin()); - result.setTotalFinishedCount(resultModel + result.setAverageElapsedTime(model.getAverageElapsedTime()); + + result.setAverageResponseTime(model.getAverageResponseTime()); + result.setFailRateThisTime(model.getFailRateThisTime()); + result.setFailThroughputThisTime(model.getFailThroughputThisTime()); + result.setMaxResponseTime(model.getMaxResponseTime()); + result.setMinResposneTime(model.getMinResponseTime()); + result.setResponseTimeDeviationThisTime(model + .getResponseTimeDeviationThisTime()); + result.setSuccessThroughputThisTime(model + .getSuccessThroughputThisTime()); + result.setTotalFailCountFromBegin(model.getTotalFailCountFromBegin()); + result.setTotalSuccessCountFromBegin(model .getTotalSuccessCountFromBegin()); - result.setTotalSuccessCount(resultModel.getTotalSuccessCountFromBegin()); - result.setAverageElapsedTime(resultModel.getAverageElapsedTime()); - result.setAverageResponseTime(resultModel.getAverageResponseTime()); + result.setCreateDatetime(createDatetime); return result; } diff --git a/src/main/java/org/bench4q/master/service/TestPlanService.java b/src/main/java/org/bench4q/master/service/TestPlanService.java index 4afc8d64..83684706 100644 --- a/src/main/java/org/bench4q/master/service/TestPlanService.java +++ b/src/main/java/org/bench4q/master/service/TestPlanService.java @@ -15,6 +15,7 @@ import org.bench4q.master.api.model.RunningScriptModel; import org.bench4q.master.api.model.TestPlanModel; import org.bench4q.master.api.model.TestScriptConfig; import org.bench4q.master.entity.db.PlanedConfig; +import org.bench4q.master.entity.db.Script; import org.bench4q.master.entity.db.TestPlan; import org.bench4q.master.entity.db.TestPlanScript; import org.bench4q.master.entity.db.User; @@ -99,6 +100,13 @@ public class TestPlanService { testPlanScript = new TestPlanScript(); testPlanScript.setTestPlan(testPlan); + Script script = this.scriptService.getScript(runningScriptModel + .getScriptId()); + if (script == null) { + logger.error("There is no this script with id " + + runningScriptModel.getScriptId()); + return false; + } testPlanScript.setScript(this.scriptService .getScript(runningScriptModel.getScriptId())); testPlanScript.setRequireLoad(runningScriptModel.getRequireLoad()); diff --git a/src/main/resources/org/bench4q/master/config/hibernate.cfg.xml b/src/main/resources/org/bench4q/master/config/hibernate.cfg.xml index da894b2a..fb2f11cc 100644 --- a/src/main/resources/org/bench4q/master/config/hibernate.cfg.xml +++ b/src/main/resources/org/bench4q/master/config/hibernate.cfg.xml @@ -24,5 +24,6 @@ + \ No newline at end of file diff --git a/src/test/java/org/bench4q/master/test/MysqlTest.java b/src/test/java/org/bench4q/master/test/MysqlTest.java new file mode 100644 index 00000000..e29dc679 --- /dev/null +++ b/src/test/java/org/bench4q/master/test/MysqlTest.java @@ -0,0 +1,40 @@ +package org.bench4q.master.test; + +import org.bench4q.master.entity.db.ForTest; +import org.bench4q.master.helper.SessionHelper; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.Test; + +public class MysqlTest { + + private SessionHelper sessionHelper; + + public SessionHelper getSessionHelper() { + return sessionHelper; + } + + public void setSessionHelper(SessionHelper sessionHelper) { + this.sessionHelper = sessionHelper; + } + + public MysqlTest() { + this.setSessionHelper(new SessionHelper()); + } + + @Test + public void testForChinese() { + Session session = this.getSessionHelper().openSession(); + Transaction transaction = session.beginTransaction(); + try { + ForTest test = new ForTest(); + test.setContent("³ÂÌú°´Å¥"); + session.merge(test); + transaction.commit(); + } catch (Exception e) { + // TODO: handle exception + e.printStackTrace(); + transaction.rollback(); + } + } +} diff --git a/src/test/java/org/bench4q/master/test/TestPlanTester.java b/src/test/java/org/bench4q/master/test/TestPlanTester.java index fcada0bb..c2e80cc5 100644 --- a/src/test/java/org/bench4q/master/test/TestPlanTester.java +++ b/src/test/java/org/bench4q/master/test/TestPlanTester.java @@ -27,12 +27,12 @@ public class TestPlanTester extends TestBase { private TestPlanModel testPlan = new TestPlanModel(); private String _url = TestBase.BASE_URL + "/testPlan"; private int scriptSumNum; - private static int SCRIPTID1 = 18; + private static int SCRIPTID1 = 1; private static int SCRIPTID2 = 2; // private static int EACH_SCRIPT_LOAD_LargeSCALE = 12000; private static int EACH_SCRIPT_LOAD_SMALLSCALE = 400; // private static int EACH_SCRIPT_LOAD_MIDDLESCALE = 800; - private static String Monitor_Host_Name = "133.133.12.3"; + private static String Monitor_Host_Name = "127.0.0.1"; private static String monitor_port = "5556"; public TestPlanModel getTestPlan() { @@ -70,7 +70,7 @@ public class TestPlanTester extends TestBase { while (this.getRunningInfo(testPlanID).getCurrentStatus() != TestPlanStatus.InRunning) { Thread.sleep(6000); } - for (int i = 0; i < 300; i++) { + for (int i = 0; i < 3; i++) { Thread.sleep(2000); this.getScriptBrief(testPlanID, SCRIPTID1); } @@ -205,7 +205,7 @@ public class TestPlanTester extends TestBase { public void getMonitorBrief(UUID testPlanID, String hostName, String port) throws IOException, InterruptedException { - for (int i = 0; i < 2; i++) { + for (int i = 0; i < 1; i++) { getMonitorMemoryResult(testPlanID, hostName, port); getProcessorResult(testPlanID, hostName, port); getLogicalDiskResult(testPlanID, hostName, port); diff --git a/src/test/java/org/bench4q/master/test/report/ReportFontTest.java b/src/test/java/org/bench4q/master/test/report/ReportFontTest.java new file mode 100644 index 00000000..35f991f1 --- /dev/null +++ b/src/test/java/org/bench4q/master/test/report/ReportFontTest.java @@ -0,0 +1,55 @@ +package org.bench4q.master.test.report; + +import static org.junit.Assert.*; + +import java.io.ByteArrayOutputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +import org.bench4q.master.report.ReportService; +import org.jfree.data.time.Second; +import org.jfree.data.time.TimeSeries; +import org.jfree.data.time.TimeSeriesCollection; +import org.junit.Test; + +import com.lowagie.text.Document; +import com.lowagie.text.DocumentException; +import com.lowagie.text.pdf.PdfWriter; + +public class ReportFontTest { + + @Test + public void test() { + fail("Not yet implemented"); + } + + public void createReportTest() throws FileNotFoundException, + DocumentException { + + Document document = new Document(); + PdfWriter.getInstance( + document, + new FileOutputStream(ReportService.buildFilePath(UUID + .randomUUID()))); + document.open(); + + } + + public void createTestImage(UUID id, Document document) throws IOException, Exception { + List timeSeriesList = new ArrayList(); + TimeSeries timeSeries = new TimeSeries("test"); + long now = System.currentTimeMillis(); + timeSeries.add(new Second(new Date(now)), 3000); + timeSeries.add(new Second(new Date(now + 100)), 4000); + timeSeriesList.add(timeSeries); + ReportService.buildSeries(1, "test"); + ReportService.writeImageIntoPdf( + ReportService.buildChartStream(document, 1, timeSeriesList, + "test").toByteArray(), document); + } +}