Skip to content

Commit bbb561b

Browse files
authored
@ExpectMaxQueryExecutionTime: change annotation elements and improve reporting
See #93 Co-authored-by: Fabrice Tarfasse <[email protected]>
1 parent ccaf9b0 commit bbb561b

File tree

4 files changed

+76
-79
lines changed

4 files changed

+76
-79
lines changed

sql/sql-annotations/src/main/java/org/quickperf/sql/annotation/ExpectMaxQueryExecutionTime.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
* <p>
2525
* <h4>Example:</h4>
2626
* <pre>
27-
* <b>&#064;ExpectMaxQueryExecutionTime(value = 20, unit = TimeUnit.MILLISECONDS)</b>
27+
* <b>&#064;ExpectMaxQueryExecutionTime(thresholdInMilliSeconds = 2)</b>
2828
* public void execute() {
2929
* <code>..</code>
3030
* }
@@ -35,16 +35,11 @@
3535
@Target({ElementType.METHOD, ElementType.TYPE})
3636
public @interface ExpectMaxQueryExecutionTime {
3737

38-
/**
39-
* Max query execution time.
40-
*/
38+
/**
39+
* Specifies a <code>value</code> (integer) to cause test method to fail if any query has a greater execution time.
40+
* Note that if left empty, the assumed value will be zero.
41+
*/
4142

42-
long value();
43-
44-
/**
45-
* Time unit. Possible values are listed in {@link java.util.concurrent.TimeUnit }.
46-
*/
47-
48-
TimeUnit unit();
43+
int thresholdInMilliSeconds() default 0;
4944

5045
}

sql/sql-annotations/src/main/java/org/quickperf/sql/annotation/SqlAnnotationBuilder.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
package org.quickperf.sql.annotation;
1313

1414
import java.lang.annotation.Annotation;
15-
import java.util.concurrent.TimeUnit;
1615

1716
public class SqlAnnotationBuilder {
1817

@@ -210,19 +209,16 @@ public int value() {
210209
};
211210
}
212211

213-
public static ExpectMaxQueryExecutionTime expectMaxQueryExecutionTime(final int value, final TimeUnit unit) {
212+
public static ExpectMaxQueryExecutionTime expectMaxQueryExecutionTime(final int thresholdInMilliSeconds) {
214213
return new ExpectMaxQueryExecutionTime() {
215214
@Override
216215
public Class<? extends Annotation> annotationType() {
217216
return ExpectMaxQueryExecutionTime.class;
218217
}
218+
219219
@Override
220-
public long value() {
221-
return value;
222-
}
223-
@Override
224-
public TimeUnit unit() {
225-
return unit;
220+
public int thresholdInMilliSeconds() {
221+
return thresholdInMilliSeconds;
226222
}
227223
};
228224
}

sql/sql-annotations/src/main/java/org/quickperf/sql/time/SqlQueryMaxExecutionTimeVerifier.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import org.quickperf.sql.annotation.ExpectMaxQueryExecutionTime;
1717
import org.quickperf.time.ExecutionTime;
1818

19+
import java.util.concurrent.TimeUnit;
20+
1921
public class SqlQueryMaxExecutionTimeVerifier implements VerifiablePerformanceIssue<ExpectMaxQueryExecutionTime, ExecutionTime> {
2022

2123
public static final SqlQueryMaxExecutionTimeVerifier INSTANCE = new SqlQueryMaxExecutionTimeVerifier();
@@ -25,17 +27,20 @@ private SqlQueryMaxExecutionTimeVerifier() {}
2527
@Override
2628
public PerfIssue verifyPerfIssue(ExpectMaxQueryExecutionTime annotation, ExecutionTime measure) {
2729

28-
ExecutionTime maxExpectedSqlExecutionTime = new ExecutionTime(annotation.value(), annotation.unit());
30+
ExecutionTime maxExpectedSqlExecutionTime = new ExecutionTime(annotation.thresholdInMilliSeconds(), TimeUnit.MILLISECONDS);
2931

3032
if(measure.isGreaterThan(maxExpectedSqlExecutionTime)) {
31-
32-
String message = "At least one request exceeds the max expected query execution time <" + maxExpectedSqlExecutionTime + ">.";
33-
34-
return new PerfIssue(message);
35-
33+
return buildPerfIssue(measure, maxExpectedSqlExecutionTime);
3634
}
3735

3836
return PerfIssue.NONE;
3937
}
4038

39+
private PerfIssue buildPerfIssue(ExecutionTime effectiveExecutionTime, ExecutionTime maxExecutionTime) {
40+
String description =
41+
"Query execution time expected to be less than <" +maxExecutionTime.toString() + ">"
42+
+ "\n At least one query has a greater execution time. The greater query execution time is <" + effectiveExecutionTime.toString() + ">";
43+
return new PerfIssue(description);
44+
}
45+
4146
}

sql/sql-annotations/src/test/java/org/quickperf/sql/time/SqlQueryMaxExecutionTimeVerifierTest.java

Lines changed: 55 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
package org.quickperf.sql.time;
1313

14+
import org.assertj.core.api.Assertions;
1415
import org.junit.Test;
1516
import org.quickperf.issue.PerfIssue;
1617
import org.quickperf.issue.VerifiablePerformanceIssue;
@@ -20,60 +21,60 @@
2021

2122
import java.util.concurrent.TimeUnit;
2223

23-
import static org.junit.Assert.assertEquals;
24-
import static org.junit.Assert.assertNotEquals;
25-
2624
public class SqlQueryMaxExecutionTimeVerifierTest {
27-
28-
@Test
29-
public void should_return_a_perf_issue_if_query_execution_time_is_greater_than_expected () {
30-
31-
VerifiablePerformanceIssue<ExpectMaxQueryExecutionTime, ExecutionTime> verifier = SqlQueryMaxExecutionTimeVerifier.INSTANCE;
32-
33-
ExpectMaxQueryExecutionTime expectedMaxExecutionTime = SqlAnnotationBuilder.expectMaxQueryExecutionTime(10, TimeUnit.MILLISECONDS);
34-
35-
ExecutionTime sqlExecTime = new ExecutionTime(50L, TimeUnit.MILLISECONDS);
36-
37-
PerfIssue perfIssue = verifier.verifyPerfIssue(expectedMaxExecutionTime, sqlExecTime);
38-
39-
assertNotEquals(PerfIssue.NONE.getDescription(), perfIssue.getDescription());
40-
41-
assertNotEquals(PerfIssue.NONE, perfIssue);
42-
43-
}
44-
45-
@Test
46-
public void should_return_no_perf_issue_if_query_execution_time_is_less_than_expected () {
47-
48-
VerifiablePerformanceIssue<ExpectMaxQueryExecutionTime, ExecutionTime> verifier = SqlQueryMaxExecutionTimeVerifier.INSTANCE;
49-
50-
ExpectMaxQueryExecutionTime expectedMaxExecutionTime = SqlAnnotationBuilder.expectMaxQueryExecutionTime(1, TimeUnit.MILLISECONDS);
51-
52-
ExecutionTime sqlExecTime = new ExecutionTime(5, TimeUnit.NANOSECONDS);
53-
54-
PerfIssue perfIssue = verifier.verifyPerfIssue(expectedMaxExecutionTime, sqlExecTime);
55-
56-
assertEquals(PerfIssue.NONE, perfIssue);
57-
58-
assertEquals(PerfIssue.NONE.getDescription(), perfIssue.getDescription());
59-
60-
}
61-
62-
@Test
63-
public void should_return_no_perf_issue_if_query_execution_time_is_same_as_expected () {
64-
65-
VerifiablePerformanceIssue<ExpectMaxQueryExecutionTime, ExecutionTime> verifier = SqlQueryMaxExecutionTimeVerifier.INSTANCE;
66-
67-
ExpectMaxQueryExecutionTime expectedMaxExecutionTime = SqlAnnotationBuilder.expectMaxQueryExecutionTime(1, TimeUnit.SECONDS);
68-
69-
ExecutionTime sqlExecTime = new ExecutionTime(1000L, TimeUnit.MILLISECONDS);
70-
71-
PerfIssue perfIssue = verifier.verifyPerfIssue(expectedMaxExecutionTime, sqlExecTime);
72-
73-
assertEquals(PerfIssue.NONE.getDescription(), perfIssue.getDescription());
74-
75-
assertEquals(PerfIssue.NONE, perfIssue);
76-
77-
}
25+
26+
@Test
27+
public void should_return_a_perf_issue_if_query_execution_time_is_greater_than_expected() {
28+
29+
// GIVEN
30+
VerifiablePerformanceIssue<ExpectMaxQueryExecutionTime, ExecutionTime> verifier = SqlQueryMaxExecutionTimeVerifier.INSTANCE;
31+
ExpectMaxQueryExecutionTime expectedMaxExecutionTime = SqlAnnotationBuilder.expectMaxQueryExecutionTime(1);
32+
ExecutionTime sqlExecTime = new ExecutionTime(5, TimeUnit.MILLISECONDS);
33+
34+
// WHEN
35+
PerfIssue perfIssue = verifier.verifyPerfIssue(expectedMaxExecutionTime, sqlExecTime);
36+
37+
// THEN
38+
Assertions.assertThat(PerfIssue.NONE).isNotEqualTo(perfIssue);
39+
Assertions.assertThat(PerfIssue.NONE.getDescription()).isNotEqualTo(perfIssue.getDescription());
40+
Assertions.assertThat(perfIssue.getDescription())
41+
.contains("Query execution time expected to be less than <1 ms>")
42+
.contains("At least one query has a greater execution time. The greater query execution time is <5 ms>");
43+
44+
}
45+
46+
@Test
47+
public void should_return_no_perf_issue_if_query_execution_time_is_less_than_expected() {
48+
49+
// GIVEN
50+
VerifiablePerformanceIssue<ExpectMaxQueryExecutionTime, ExecutionTime> verifier = SqlQueryMaxExecutionTimeVerifier.INSTANCE;
51+
ExpectMaxQueryExecutionTime expectedMaxExecutionTime = SqlAnnotationBuilder.expectMaxQueryExecutionTime(5);
52+
ExecutionTime sqlExecTime = new ExecutionTime(1, TimeUnit.MILLISECONDS);
53+
54+
// WHEN
55+
PerfIssue perfIssue = verifier.verifyPerfIssue(expectedMaxExecutionTime, sqlExecTime);
56+
57+
// THEN
58+
Assertions.assertThat(PerfIssue.NONE).isEqualTo(perfIssue);
59+
Assertions.assertThat(PerfIssue.NONE.getDescription()).isEqualTo(perfIssue.getDescription());
60+
61+
}
62+
63+
@Test
64+
public void should_return_no_perf_issue_if_query_execution_time_is_same_as_expected() {
65+
66+
// GIVEN
67+
VerifiablePerformanceIssue<ExpectMaxQueryExecutionTime, ExecutionTime> verifier = SqlQueryMaxExecutionTimeVerifier.INSTANCE;
68+
ExpectMaxQueryExecutionTime expectedMaxExecutionTime = SqlAnnotationBuilder.expectMaxQueryExecutionTime(1);
69+
ExecutionTime sqlExecTime = new ExecutionTime(1, TimeUnit.MILLISECONDS);
70+
71+
// WHEN
72+
PerfIssue perfIssue = verifier.verifyPerfIssue(expectedMaxExecutionTime, sqlExecTime);
73+
74+
// THEN
75+
Assertions.assertThat(PerfIssue.NONE).isEqualTo(perfIssue);
76+
Assertions.assertThat(PerfIssue.NONE.getDescription()).isEqualTo(perfIssue.getDescription());
77+
78+
}
7879

7980
}

0 commit comments

Comments
 (0)