Skip to content

Commit 1dfc33b

Browse files
noconnornoconnor
and
noconnor
authored
Updates to support assumption violations (#108)
* Addung support for skipping tests when assumption violations are thrown --------- Co-authored-by: noconnor <[email protected]>
1 parent 5548b26 commit 1dfc33b

File tree

25 files changed

+1383
-183
lines changed

25 files changed

+1383
-183
lines changed

junit4-examples/src/test/java/com/github/noconnor/junitperf/examples/ExampleSuccessTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.github.noconnor.junitperf.JUnitPerfTest;
1212

1313
import static com.github.noconnor.junitperf.examples.utils.ReportingUtils.newHtmlReporter;
14+
import static org.junit.Assume.assumeFalse;
1415

1516
public class ExampleSuccessTests {
1617

@@ -34,4 +35,15 @@ public void whenNoRequirementsArePresent_thenTestShouldAlwaysPass() throws IOExc
3435
socket.connect(new InetSocketAddress("www.google.com", 80), 1000);
3536
}
3637
}
38+
39+
@Test
40+
@JUnitPerfTest(threads = 10, durationMs = 10_000, warmUpMs = 1_000, rampUpPeriodMs = 2_000, totalExecutions = 100)
41+
public void whenAssumptionFails_thenTestShouldBeSkipped() throws IOException {
42+
//noinspection DataFlowIssue
43+
assumeFalse(true); // dummy test to illustrate skipped tests
44+
try (Socket socket = new Socket()) {
45+
socket.connect(new InetSocketAddress("www.google.com", 80), 1000);
46+
}
47+
}
48+
3749
}

junit5-examples/src/test/java/com/github/noconnor/junitperf/examples/ExampleSuccessTests.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.github.noconnor.junitperf.examples;
22

33
import com.github.noconnor.junitperf.JUnitPerfInterceptor;
4+
import com.github.noconnor.junitperf.JUnitPerfReportingConfig;
45
import com.github.noconnor.junitperf.JUnitPerfTest;
56
import com.github.noconnor.junitperf.JUnitPerfTestActiveConfig;
6-
import com.github.noconnor.junitperf.JUnitPerfReportingConfig;
77
import org.junit.jupiter.api.AfterEach;
88
import org.junit.jupiter.api.BeforeEach;
99
import org.junit.jupiter.api.Test;
@@ -14,6 +14,7 @@
1414
import java.net.Socket;
1515

1616
import static com.github.noconnor.junitperf.examples.utils.ReportingUtils.newHtmlReporter;
17+
import static org.junit.jupiter.api.Assumptions.assumeFalse;
1718

1819
@ExtendWith(JUnitPerfInterceptor.class)
1920
public class ExampleSuccessTests {
@@ -49,4 +50,15 @@ public void whenTotalNumberOfExecutionsIsSet_thenTotalExecutionsShouldOverrideDu
4950
socket.connect(new InetSocketAddress("www.google.com", 80), 1000);
5051
}
5152
}
53+
54+
@Test
55+
@JUnitPerfTest(threads = 10, durationMs = 10_000, warmUpMs = 1_000, rampUpPeriodMs = 2_000, maxExecutionsPerSecond = 100)
56+
public void whenAssumptionFails_thenTestWillBeSkipped() throws IOException {
57+
//noinspection DataFlowIssue
58+
assumeFalse(true); // dummy test to illustrate skipped tests
59+
60+
try (Socket socket = new Socket()) {
61+
socket.connect(new InetSocketAddress("www.google.com", 80), 1000);
62+
}
63+
}
5264
}

junit5-examples/src/test/java/com/github/noconnor/junitperf/examples/existing/TestClassOne.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import org.junit.jupiter.api.Test;
44

5+
import static org.junit.jupiter.api.Assumptions.assumeFalse;
6+
57
public class TestClassOne {
68
@Test
79
public void sample_test1_class1() throws InterruptedException {
@@ -14,4 +16,10 @@ public void sample_test2_class1() throws InterruptedException {
1416
Thread.sleep(1);
1517
}
1618

19+
@Test
20+
public void sample_test3_class1() throws InterruptedException {
21+
//noinspection DataFlowIssue
22+
assumeFalse(true); // dummy test to illustrate skipped tests
23+
}
24+
1725
}

junitperf-core/src/main/java/com/github/noconnor/junitperf/data/EvaluationContext.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ public class EvaluationContext {
5252
private long finishTimeNs;
5353
@Getter
5454
private final boolean isAsyncEvaluation;
55+
@Setter
56+
@Getter
57+
private Throwable abortedException;
5558

5659
@Getter
5760
private Map<Integer, Float> requiredPercentiles = emptyMap();
@@ -118,6 +121,10 @@ public EvaluationContext(String testName, long startTimeNs, boolean isAsyncEvalu
118121
this.isAsyncEvaluation = isAsyncEvaluation;
119122
}
120123

124+
public boolean isAborted() {
125+
return nonNull(abortedException);
126+
}
127+
121128
@SuppressWarnings("WeakerAccess")
122129
public long getThroughputQps() {
123130
return (long)((evaluationCount/ ((float)configuredDuration - configuredWarmUp)) * 1000);

junitperf-core/src/main/java/com/github/noconnor/junitperf/reporting/providers/ConsoleReportGenerator.java

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -28,44 +28,49 @@ public void generateReport(LinkedHashSet<EvaluationContext> testContexts) {
2828
}
2929

3030
public void updateReport(EvaluationContext context) {
31-
String throughputStatus = context.isThroughputAchieved() ? PASSED : FAILED;
32-
String errorRateStatus = context.isErrorThresholdAchieved() ? PASSED : FAILED;
31+
if (context.isAborted()) {
32+
log.info("Test {} was SKIPPED", context.getTestName());
33+
} else {
3334

34-
log.info("Test Name: {}", context.getTestName());
35-
log.info("Started at: {}", context.getStartTime());
36-
log.info("Invocations: {}", context.getEvaluationCount());
37-
log.info(" - Success: {}", context.getEvaluationCount() - context.getErrorCount());
38-
log.info(" - Errors: {}", context.getErrorCount());
39-
log.info(" - Errors: {}% - {}", context.getErrorPercentage(), errorRateStatus);
40-
log.info("");
41-
log.info("Thread Count: {}", context.getConfiguredThreads());
42-
log.info("Warm up: {} ms", context.getConfiguredWarmUp());
43-
log.info("Ramp up: {} ms", context.getConfiguredRampUpPeriodMs());
44-
log.info("");
45-
log.info("Execution time: {}", context.getTestDurationFormatted());
46-
log.info("Throughput: {}/s (Required: {}/s) - {}",
47-
context.getThroughputQps(),
48-
context.getRequiredThroughput(),
49-
throughputStatus);
50-
log.info("Min. latency: {} ms (Required: {}ms) - {}",
51-
context.getMinLatencyMs(),
52-
format(context.getRequiredMinLatency()));
53-
log.info("Max. latency: {} ms (Required: {}ms) - {}",
54-
context.getMaxLatencyMs(),
55-
format(context.getRequiredMaxLatency()));
56-
log.info("Ave. latency: {} ms (Required: {}ms) - {}",
57-
context.getMeanLatencyMs(),
58-
format(context.getRequiredMeanLatency()));
59-
context.getRequiredPercentiles().forEach((percentile, threshold) -> {
60-
String percentileStatus = context.getPercentileResults().get(percentile) ? PASSED : FAILED;
61-
log.info("{}: {}ms (Required: {} ms) - {}",
62-
percentile,
63-
context.getLatencyPercentileMs(percentile),
64-
format(threshold),
65-
percentileStatus);
66-
});
67-
log.info("");
68-
log.info("");
35+
String throughputStatus = context.isThroughputAchieved() ? PASSED : FAILED;
36+
String errorRateStatus = context.isErrorThresholdAchieved() ? PASSED : FAILED;
37+
38+
log.info("Test Name: {}", context.getTestName());
39+
log.info("Started at: {}", context.getStartTime());
40+
log.info("Invocations: {}", context.getEvaluationCount());
41+
log.info(" - Success: {}", context.getEvaluationCount() - context.getErrorCount());
42+
log.info(" - Errors: {}", context.getErrorCount());
43+
log.info(" - Errors: {}% - {}", context.getErrorPercentage(), errorRateStatus);
44+
log.info("");
45+
log.info("Thread Count: {}", context.getConfiguredThreads());
46+
log.info("Warm up: {} ms", context.getConfiguredWarmUp());
47+
log.info("Ramp up: {} ms", context.getConfiguredRampUpPeriodMs());
48+
log.info("");
49+
log.info("Execution time: {}", context.getTestDurationFormatted());
50+
log.info("Throughput: {}/s (Required: {}/s) - {}",
51+
context.getThroughputQps(),
52+
context.getRequiredThroughput(),
53+
throughputStatus);
54+
log.info("Min. latency: {} ms (Required: {}ms) - {}",
55+
context.getMinLatencyMs(),
56+
format(context.getRequiredMinLatency()));
57+
log.info("Max. latency: {} ms (Required: {}ms) - {}",
58+
context.getMaxLatencyMs(),
59+
format(context.getRequiredMaxLatency()));
60+
log.info("Ave. latency: {} ms (Required: {}ms) - {}",
61+
context.getMeanLatencyMs(),
62+
format(context.getRequiredMeanLatency()));
63+
context.getRequiredPercentiles().forEach((percentile, threshold) -> {
64+
String percentileStatus = context.getPercentileResults().get(percentile) ? PASSED : FAILED;
65+
log.info("{}: {}ms (Required: {} ms) - {}",
66+
percentile,
67+
context.getLatencyPercentileMs(percentile),
68+
format(threshold),
69+
percentileStatus);
70+
});
71+
log.info("");
72+
log.info("");
73+
}
6974
}
7075

7176
@Override

junitperf-core/src/main/java/com/github/noconnor/junitperf/reporting/providers/CsvReportGenerator.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@ public void generateReport(LinkedHashSet<EvaluationContext> testContexts) {
4646
writer.newLine();
4747
history.forEach(context -> {
4848

49-
String record = String.format("%s,%d,%d,%d,%.4f,%.4f,%.4f,%s",
50-
context.getTestName(),
51-
context.getConfiguredDuration(),
49+
String name = context.isAborted() ? context.getTestName() + " (skipped)" : context.getTestName();
50+
int duration = context.isAborted() ? 0 : context.getConfiguredDuration();
51+
String record = String.format("%s,%s,%d,%d,%.4f,%.4f,%.4f,%s",
52+
name,
53+
duration,
5254
context.getConfiguredThreads(),
5355
context.getThroughputQps(),
5456
context.getMinLatencyMs(),

junitperf-core/src/main/java/com/github/noconnor/junitperf/reporting/providers/HtmlReportGenerator.java

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import static java.lang.System.getProperty;
2626
import static java.util.Objects.isNull;
27+
import static java.util.Objects.nonNull;
2728

2829
@Slf4j
2930
public class HtmlReportGenerator implements ReportGenerator {
@@ -85,17 +86,21 @@ private void renderTemplate() {
8586
ViewData c = new ViewData(context);
8687

8788
String overview = ViewProcessor.populateTemplate(c, "context", blocks.get(OVERVIEW_MARKER));
88-
String detail = ViewProcessor.populateTemplate(c, "context", blocks.get(DETAILS_MARKER));
89-
String percentileData = ViewProcessor.populateTemplate(
90-
c.getRequiredPercentiles(),
91-
"context.percentiles",
92-
blocks.get(PERCENTILE_TARGETS_MARKER)
93-
);
94-
95-
detail = detail.replaceAll(asRegex(PERCENTILE_TARGETS_MARKER), percentileData);
96-
89+
90+
if (context.isAborted()) {
91+
overview = overview.replaceAll("href=", "nolink=");
92+
} else {
93+
String detail = ViewProcessor.populateTemplate(c, "context", blocks.get(DETAILS_MARKER));
94+
String percentileData = ViewProcessor.populateTemplate(
95+
c.getRequiredPercentiles(),
96+
"context.percentiles",
97+
blocks.get(PERCENTILE_TARGETS_MARKER)
98+
);
99+
100+
detail = detail.replaceAll(asRegex(PERCENTILE_TARGETS_MARKER), percentileData);
101+
details.append(detail).append("\n");
102+
}
97103
overviews.append(overview).append("\n");
98-
details.append(detail).append("\n");
99104
}
100105

101106
root = root.replaceAll(asRegex(OVERVIEW_MARKER), overviews.toString());

junitperf-core/src/main/java/com/github/noconnor/junitperf/reporting/providers/utils/ViewData.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,20 @@
66
import lombok.Setter;
77
import lombok.ToString;
88

9+
import java.util.Collections;
910
import java.util.List;
1011
import java.util.stream.Collectors;
1112
import java.util.stream.IntStream;
1213

14+
import static java.util.Objects.isNull;
1315
import static java.util.Objects.nonNull;
1416

1517
@Getter
1618
public class ViewData {
1719

1820
static final String SUCCESS_COLOUR = "#2b67a4";
1921
static final String FAILED_COLOUR = "#d9534f";
22+
static final String SKIPPED_COLOUR = "#dcdcdc";
2023

2124
@Getter
2225
@Setter
@@ -59,7 +62,7 @@ public static final class RequiredPercentilesData {
5962

6063
public ViewData(EvaluationContext context) {
6164
this.testName = buildTestName(context);
62-
this.testNameColour = context.isSuccessful() ? SUCCESS_COLOUR : FAILED_COLOUR;
65+
this.testNameColour = context.isAborted() ? SKIPPED_COLOUR : context.isSuccessful() ? SUCCESS_COLOUR : FAILED_COLOUR;
6366
this.chartData = buildChartData(context);
6467
this.csvData = buildCsvData(context);
6568
this.startTime = context.getStartTime();
@@ -88,10 +91,17 @@ public ViewData(EvaluationContext context) {
8891
}
8992

9093
private static String buildTestName(EvaluationContext context) {
91-
return nonNull(context.getGroupName()) ? context.getGroupName() + " : " + context.getTestName() : context.getTestName();
94+
String baseName = nonNull(context.getGroupName()) ? context.getGroupName() + " : " + context.getTestName() : context.getTestName();
95+
if (context.isAborted()){
96+
baseName = baseName + (" (skipped)");
97+
}
98+
return baseName;
9299
}
93100

94101
private List<RequiredPercentilesData> buildRequiredPercentileData(EvaluationContext context) {
102+
if (isNull(context.getPercentileResults())) {
103+
return Collections.emptyList();
104+
}
95105
return context.getRequiredPercentiles().entrySet()
96106
.stream()
97107
.map(entry -> {

0 commit comments

Comments
 (0)