diff --git a/backend/src/main/java/io/metersphere/report/JtlResolver.java b/backend/src/main/java/io/metersphere/report/JtlResolver.java index 888d860d54..30f631f045 100644 --- a/backend/src/main/java/io/metersphere/report/JtlResolver.java +++ b/backend/src/main/java/io/metersphere/report/JtlResolver.java @@ -6,14 +6,11 @@ import com.opencsv.bean.HeaderColumnNameMappingStrategy; import io.metersphere.report.base.*; import io.metersphere.report.dto.ErrorsTop5DTO; import io.metersphere.report.dto.RequestStatisticsDTO; -import org.apache.bcel.verifier.statics.LONG_Upper; import org.apache.commons.lang3.StringUtils; - import java.io.Reader; import java.io.StringReader; import java.text.DecimalFormat; import java.util.*; -import java.util.function.Function; import java.util.stream.Collectors; public class JtlResolver { @@ -22,7 +19,6 @@ public class JtlResolver { HeaderColumnNameMappingStrategy ms = new HeaderColumnNameMappingStrategy<>(); ms.setType(Metric.class); try (Reader reader = new StringReader(jtlString)) { - CsvToBean cb = new CsvToBeanBuilder(reader) .withType(Metric.class) .withSkipLines(0) @@ -41,36 +37,33 @@ public class JtlResolver { List requestStatisticsList = new ArrayList<>(); Iterator>> iterator = map.entrySet().iterator(); List allelapse = new ArrayList<>(); - Integer totalAverage = 0; + DecimalFormat df = new DecimalFormat("0.00"); + int totalAverage = 0; while (iterator.hasNext()) { Map.Entry> entry = iterator.next(); String label = entry.getKey(); List list = entry.getValue(); List timestampList = list.stream().map(Metric::getTimestamp).collect(Collectors.toList()); int index=0; - //总的响应时间 int sumElapsed=0; - Integer failSize = 0; - Float totalBytes = 0f; + int failSize = 0; + float totalBytes = 0f; List elapsedList = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { try { Metric row = list.get(i); - //响应时间 String elapsed = row.getElapsed(); - sumElapsed += Integer.valueOf(elapsed); - totalAverage += Integer.valueOf(elapsed); + sumElapsed += Integer.parseInt(elapsed); + totalAverage += Integer.parseInt(elapsed); elapsedList.add(Integer.valueOf(elapsed)); allelapse.add(Integer.valueOf(elapsed)); - //成功与否 String success = row.getSuccess(); if (!"true".equals(success)){ failSize++; } - //字节 String bytes = row.getBytes(); - totalBytes += Float.valueOf(bytes); + totalBytes += Float.parseFloat(bytes); index++; }catch (Exception e){ System.out.println("exception i:"+i); @@ -79,17 +72,19 @@ public class JtlResolver { Collections.sort(elapsedList); - Integer tp90 = elapsedList.size()*90/100; - Integer tp95 = elapsedList.size()*95/100; - Integer tp99 = elapsedList.size()*99/100; - Long l = Long.valueOf(timestampList.get(timestampList.size()-1)) - Long.valueOf(timestampList.get(0)); + int tp90 = elapsedList.size()*90/100; + int tp95 = elapsedList.size()*95/100; + int tp99 = elapsedList.size()*99/100; + long l = Long.valueOf(timestampList.get(timestampList.size()-1)) - Long.valueOf(timestampList.get(0)); RequestStatistics requestStatistics = new RequestStatistics(); requestStatistics.setRequestLabel(label); requestStatistics.setSamples(index); - DecimalFormat df = new DecimalFormat("0.00"); + + String s = df.format((float)sumElapsed/index); requestStatistics.setAverage(s+""); + /** * TP90的计算 * 1,把一段时间内全部的请求的响应时间,从小到大排序,获得序列A @@ -100,6 +95,7 @@ public class JtlResolver { requestStatistics.setTp90(elapsedList.get(tp90)+""); requestStatistics.setTp95(elapsedList.get(tp95)+""); requestStatistics.setTp99(elapsedList.get(tp99)+""); + requestStatistics.setMin(elapsedList.get(0)+""); requestStatistics.setMax(elapsedList.get(index-1)+""); requestStatistics.setErrors(String.format("%.2f",failSize*100.0/index)+"%"); @@ -113,16 +109,15 @@ public class JtlResolver { } Collections.sort(allelapse); - Integer totalTP90 = allelapse.size()*90/100; - Integer totalTP95 = allelapse.size()*95/100; - Integer totalTP99 = allelapse.size()*99/100; + int totalTP90 = allelapse.size()*90/100; + int totalTP95 = allelapse.size()*95/100; + int totalTP99 = allelapse.size()*99/100; Integer min = allelapse.get(0); Integer max = allelapse.get(allelapse.size() - 1); - Integer allSamples = requestStatisticsList.stream().mapToInt(RequestStatistics::getSamples).sum(); - Integer failSize = requestStatisticsList.stream().mapToInt(RequestStatistics::getKo).sum(); - DecimalFormat df = new DecimalFormat("0.00"); + int allSamples = requestStatisticsList.stream().mapToInt(RequestStatistics::getSamples).sum(); + int failSize = requestStatisticsList.stream().mapToInt(RequestStatistics::getKo).sum(); double errors = (double)failSize / allSamples * 100; String totalerrors = df.format(errors); double average = (double)totalAverage / allSamples; @@ -157,6 +152,7 @@ public class JtlResolver { List errorsList = new ArrayList<>(); Map> collect = falseList.stream().collect(Collectors.groupingBy(JtlResolver::getResponseCodeAndFailureMessage)); Iterator>> iterator = collect.entrySet().iterator(); + DecimalFormat df = new DecimalFormat("0.00"); while (iterator.hasNext()) { Map.Entry> next = iterator.next(); String key = next.getKey(); @@ -164,10 +160,9 @@ public class JtlResolver { Errors errors = new Errors(); errors.setErrorType(key); errors.setErrorNumber(String.valueOf(value.size())); - Integer errorSize = value.size(); - Integer errorAllSize = falseList.size(); - Integer allSamples = totalLines.size(); - DecimalFormat df = new DecimalFormat("0.00"); + int errorSize = value.size(); + int errorAllSize = falseList.size(); + int allSamples = totalLines.size(); errors.setPrecentOfErrors(df.format((double)errorSize / errorAllSize * 100) + "%"); errors.setPrecentOfAllSamples(df.format((double)errorSize / allSamples * 100) + "%"); errorsList.add(errors); @@ -202,7 +197,7 @@ public class JtlResolver { errorsTop5s.add(errorsTop5); } - Collections.sort(errorsTop5s, (t0, t1) -> t1.getErrorsAllSize().compareTo(t0.getErrorsAllSize())); + errorsTop5s.sort((t0, t1) -> t1.getErrorsAllSize().compareTo(t0.getErrorsAllSize())); if (errorsTop5s.size() >= 5) { errorsTop5s = errorsTop5s.subList(0, 5); @@ -212,7 +207,7 @@ public class JtlResolver { top5DTO.setErrorsTop5List(errorsTop5s); top5DTO.setTotalSamples(String.valueOf(totalLines.size())); top5DTO.setTotalErrors(String.valueOf(falseList.size())); - Integer size = errorsTop5s.size(); + int size = errorsTop5s.size(); // Total行 信息 top5DTO.setError1(size > 0 ? errorsTop5s.get(0).getError() : null); top5DTO.setError1Size(size > 0 ? errorsTop5s.get(0).getErrors() : null); @@ -234,8 +229,9 @@ public class JtlResolver { List total = JtlResolver.resolver(jtlString); Map> collect = total.stream().collect(Collectors.groupingBy(Metric::getTimestamp)); Iterator>> iterator = collect.entrySet().iterator(); - Integer max = 0; - Integer totalElapsed = 0; + int max = 0; + int totalElapsed = 0; + float totalBytes = 0f; while (iterator.hasNext()) { Map.Entry> entry = iterator.next(); List list = entry.getValue(); @@ -245,27 +241,38 @@ public class JtlResolver { for (int i = 0; i < list.size(); i++) { Metric metric = list.get(i); String elapsed = metric.getElapsed(); - totalElapsed += Integer.valueOf(elapsed); + totalElapsed += Integer.parseInt(elapsed); + String bytes = metric.getBytes(); + totalBytes += Float.parseFloat(bytes); } } - Collections.sort(total, Comparator.comparing(t0 -> Long.valueOf(t0.getTimestamp()))); - Long timestamp1 = Long.valueOf(total.get(0).getTimestamp()); - Long timestamp2 = Long.valueOf(total.get(total.size()-1).getTimestamp()); - Long seconds = (timestamp2 - timestamp1) / 1000; + total.sort(Comparator.comparing(t0 -> Long.valueOf(t0.getTimestamp()))); DecimalFormat df = new DecimalFormat("0.00"); - double avgThroughput = (double)total.size() / seconds; - - List falseList = total.stream().filter(metric -> StringUtils.equals("false", metric.getSuccess())).collect(Collectors.toList()); - double errors = (double)falseList.size() / total.size() * 100; testOverview.setMaxUsers(String.valueOf(max)); + + List list90 = total.subList(0, total.size() * 9 / 10); + long sum = list90.stream().mapToLong(metric -> Long.parseLong(metric.getElapsed())).sum(); + double avg90 = (double)sum / 1000 / list90.size(); + testOverview.setResponseTime90(df.format(avg90)); + + Long timestamp1 = Long.valueOf(total.get(0).getTimestamp()); + Long timestamp2 = Long.valueOf(total.get(total.size()-1).getTimestamp()); + long seconds = (timestamp2 - timestamp1) / 1000; + double avgThroughput = (double)total.size() / seconds; testOverview.setAvgThroughput(df.format(avgThroughput)); + + List falseList = total.stream().filter(metric -> StringUtils.equals("false", metric.getSuccess())).collect(Collectors.toList()); + double errors = falseList.size() * 1.0 / total.size() * 100; testOverview.setErrors(df.format(errors)); - double avg = (double)totalElapsed / total.size() / 1000; // s + + double avg = totalElapsed * 1.0 / total.size() / 1000; // s testOverview.setAvgResponseTime(df.format(avg)); -// testOverview.setResponseTime90(); -// testOverview.setAvgBandwidth(); + + double bandwidth = totalBytes * 1.0 / 1024 / seconds; + testOverview.setAvgBandwidth(df.format(bandwidth)); + return testOverview; } diff --git a/frontend/src/business/components/performance/report/components/TestOverview.vue b/frontend/src/business/components/performance/report/components/TestOverview.vue index fa034e5361..54414663b8 100644 --- a/frontend/src/business/components/performance/report/components/TestOverview.vue +++ b/frontend/src/business/components/performance/report/components/TestOverview.vue @@ -161,8 +161,8 @@ this.avgThroughput = data.avgThroughput; this.errors = data.errors; this.avgResponseTime = data.avgResponseTime; - // this.responseTime90 = data.responseTime90; - // this.avgBandwidth = data.avgBandwidth; + this.responseTime90 = data.responseTime90; + this.avgBandwidth = data.avgBandwidth; }) } }, @@ -181,8 +181,8 @@ this.avgThroughput = data.avgThroughput; this.errors = data.errors; this.avgResponseTime = data.avgResponseTime; - // this.responseTime90 = data.responseTime90; - // this.avgBandwidth = data.avgBandwidth; + this.responseTime90 = data.responseTime90; + this.avgBandwidth = data.avgBandwidth; }) } }