diff --git a/src/core/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesOverTimeGraphConsumer.java b/src/core/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesOverTimeGraphConsumer.java index c9b2a031a2d..8b8c3a7a4ce 100644 --- a/src/core/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesOverTimeGraphConsumer.java +++ b/src/core/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesOverTimeGraphConsumer.java @@ -17,36 +17,28 @@ */ package org.apache.jmeter.report.processor.graph.impl; -import java.util.HashMap; -import java.util.Map; - +import org.apache.jmeter.report.processor.AggregatorFactory; import org.apache.jmeter.report.processor.MaxAggregatorFactory; import org.apache.jmeter.report.processor.MinAggregatorFactory; import org.apache.jmeter.report.processor.PercentileAggregatorFactory; -import org.apache.jmeter.report.processor.graph.AbstractOverTimeGraphConsumer; -import org.apache.jmeter.report.processor.graph.GroupInfo; -import org.apache.jmeter.report.processor.graph.StaticSeriesSelector; -import org.apache.jmeter.report.processor.graph.SuccessfulElapsedTimeValueSelector; -import org.apache.jmeter.report.processor.graph.TimeStampKeysSelector; +import org.apache.jmeter.report.processor.graph.*; import org.apache.jmeter.util.JMeterUtils; +import java.util.HashMap; +import java.util.Map; + /** - * The class ResponseTimePercentilesOverTimeGraphConsumer provides a graph to visualize percentiles - * over time period. - * Only successful responses are taken into account for computations + * The class ResponseTimePercentilesOverTimeGraphConsumer provides a graph to + * visualize percentiles over time period. + * Only successful responses are taken into account for computations. * * @since 3.1 */ -public class ResponseTimePercentilesOverTimeGraphConsumer extends - AbstractOverTimeGraphConsumer { +public class ResponseTimePercentilesOverTimeGraphConsumer + extends AbstractOverTimeGraphConsumer { + private static final String PERCENTILE_FORMAT = "%dth percentile"; - /* - * (non-Javadoc) - * - * @see - * org.apache.jmeter.report.csv.processor.impl.AbstractOverTimeGraphConsumer - * #createTimeStampKeysSelector() - */ + @Override protected TimeStampKeysSelector createTimeStampKeysSelector() { TimeStampKeysSelector keysSelector = new TimeStampKeysSelector(); @@ -54,79 +46,60 @@ protected TimeStampKeysSelector createTimeStampKeysSelector() { return keysSelector; } - /** - * Creates the group info for elapsed time percentile depending on jmeter - * properties. - * - * @param propertyKey - * the property key - * @param defaultValue - * the default value - * @param serieName Serie name - * @return the group info - */ - private GroupInfo createPercentileGroupInfo(String propertyKey, int defaultValue, String serieName) { - int property = JMeterUtils.getPropDefault(propertyKey, defaultValue); - PercentileAggregatorFactory factory = new PercentileAggregatorFactory(); - factory.setPercentileIndex(property); - StaticSeriesSelector seriesSelector = new StaticSeriesSelector(); - seriesSelector.setSeriesName(serieName); + @Override + protected Map createGroupInfos() { + HashMap groupInfos = new HashMap<>(8); + + groupInfos.put("aggregate_report_min", createMinGroupInfo()); + + groupInfos.put("aggregate_report_max", createMaxGroupInfo()); + + groupInfos.put("aggregate_rpt_pct1", + createPercentileGroupInfo("aggregate_rpt_pct1", 90)); - return new GroupInfo(factory, seriesSelector, - new SuccessfulElapsedTimeValueSelector(), false, false); + groupInfos.put("aggregate_rpt_pct2", + createPercentileGroupInfo("aggregate_rpt_pct2", 95)); + + groupInfos.put("aggregate_rpt_pct3", + createPercentileGroupInfo("aggregate_rpt_pct3", 99)); + + return groupInfos; + } + + private String formatPercentile(int percentile) { + return String.format(PERCENTILE_FORMAT, Integer.valueOf(percentile)); } - /** - * Creates the group info for min elapsed time - * @return the group info - */ private GroupInfo createMinGroupInfo() { StaticSeriesSelector seriesSelector = new StaticSeriesSelector(); seriesSelector.setSeriesName("Min"); - return new GroupInfo(new MinAggregatorFactory(), seriesSelector, - new SuccessfulElapsedTimeValueSelector(), false, false); + return createGroupInfo(new MinAggregatorFactory(), seriesSelector); } - /** - * Creates the group info for max elapsed time - * @return the group info - */ private GroupInfo createMaxGroupInfo() { StaticSeriesSelector seriesSelector = new StaticSeriesSelector(); seriesSelector.setSeriesName("Max"); - return new GroupInfo(new MaxAggregatorFactory(), seriesSelector, - new SuccessfulElapsedTimeValueSelector(), false, false); + return createGroupInfo(new MaxAggregatorFactory(), seriesSelector); } - /** - * - * @see org.apache.jmeter.report.processor.graph.AbstractGraphConsumer#createGroupInfos() - */ - @Override - protected Map createGroupInfos() { - HashMap groupInfos = new HashMap<>(2); - - groupInfos.put("aggregate_report_min", //$NON-NLS-1$ - createMinGroupInfo()); + private GroupInfo createPercentileGroupInfo(String propKey, int defaultValue) { + String seriesName = formatPercentile(defaultValue); - groupInfos.put("aggregate_report_max", //$NON-NLS-1$ - createMaxGroupInfo()); - - groupInfos.put("aggregate_rpt_pct1", //$NON-NLS-1$ - createPercentileGroupInfo("aggregate_rpt_pct1", 90, //$NON-NLS-1$ - String.format( - PERCENTILE_FORMAT, Integer.valueOf(90)))); - - groupInfos.put("aggregate_rpt_pct2", //$NON-NLS-1$ - createPercentileGroupInfo("aggregate_rpt_pct2", 95, //$NON-NLS-1$ - String.format( - PERCENTILE_FORMAT, Integer.valueOf(95)))); + int property = JMeterUtils.getPropDefault(propKey, defaultValue); + PercentileAggregatorFactory factory = new PercentileAggregatorFactory(); + factory.setPercentileIndex(property); + StaticSeriesSelector seriesSelector = new StaticSeriesSelector(); + seriesSelector.setSeriesName(seriesName); - groupInfos.put("aggregate_rpt_pct3", //$NON-NLS-1$ - createPercentileGroupInfo("aggregate_rpt_pct3", 99,//$NON-NLS-1$ - String.format( - PERCENTILE_FORMAT, Integer.valueOf(99)))); + return createGroupInfo(factory, seriesSelector); + } - return groupInfos; + private GroupInfo createGroupInfo(AggregatorFactory aggregationFactory, StaticSeriesSelector seriesSelector) { + return new GroupInfo( + aggregationFactory, + seriesSelector, + new SuccessfulElapsedTimeValueSelector(), + false, + false); } } diff --git a/test/src/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesOverTimeGraphConsumerSpec.groovy b/test/src/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesOverTimeGraphConsumerSpec.groovy new file mode 100644 index 00000000000..f0b0d38bd0a --- /dev/null +++ b/test/src/org/apache/jmeter/report/processor/graph/impl/ResponseTimePercentilesOverTimeGraphConsumerSpec.groovy @@ -0,0 +1,37 @@ +package org.apache.jmeter.report.processor.graph.impl + +import org.apache.jmeter.junit.spock.JMeterSpec + +import java.util.stream.Collectors + +class ResponseTimePercentilesOverTimeGraphConsumerSpec extends JMeterSpec { + + static def EXPECTED_KEYS = + ['aggregate_report_min', + 'aggregate_report_max', + 'aggregate_rpt_pct1', + 'aggregate_rpt_pct2', + 'aggregate_rpt_pct3'] as Set + + def sut = new ResponseTimePercentilesOverTimeGraphConsumer() + + def "GroupInfos have only the required keys"() { + when: + def groupInfosMap = sut.createGroupInfos() + then: + groupInfosMap.keySet() == EXPECTED_KEYS + } + + def "GroupInfos have the expected settings"() { + when: + def groupInfos = sut.createGroupInfos() + def groupInfoValues = groupInfos + .entrySet().stream() + .map { it.value } + .collect(Collectors.toList()) + then: + groupInfoValues.every { !it.enablesAggregatedKeysSeries() } + groupInfoValues.every { !it.enablesOverallSeries() } + } + +}