Added tracking of test run duration.
Change-Id: Ideeb01b8d822a90433aad4b90ebb6fb479759a1a
Showing
3 changed files
with
53 additions
and
5 deletions
... | @@ -109,6 +109,15 @@ public class Coordinator { | ... | @@ -109,6 +109,15 @@ public class Coordinator { |
109 | } | 109 | } |
110 | 110 | ||
111 | /** | 111 | /** |
112 | + * Returns number of milliseconds it took to execute. | ||
113 | + * | ||
114 | + * @return number of millis elapsed during the run | ||
115 | + */ | ||
116 | + public long duration() { | ||
117 | + return store.endTime() - store.startTime(); | ||
118 | + } | ||
119 | + | ||
120 | + /** | ||
112 | * Returns a list of steps that match the specified list of patterns. | 121 | * Returns a list of steps that match the specified list of patterns. |
113 | * | 122 | * |
114 | * @param runToPatterns list of patterns | 123 | * @param runToPatterns list of patterns | ... | ... |
... | @@ -44,11 +44,12 @@ public final class Main { | ... | @@ -44,11 +44,12 @@ public final class Main { |
44 | private static final String GREEN = "\u001B[32;1m"; | 44 | private static final String GREEN = "\u001B[32;1m"; |
45 | private static final String BLUE = "\u001B[36m"; | 45 | private static final String BLUE = "\u001B[36m"; |
46 | 46 | ||
47 | - private static final String SUCCESS_SUMMARY = "%sPassed! %d steps succeeded%s"; | 47 | + private static final String SUCCESS_SUMMARY = |
48 | + "%s %sPassed! %d steps succeeded%s"; | ||
48 | private static final String MIXED_SUMMARY = | 49 | private static final String MIXED_SUMMARY = |
49 | "%s%d steps succeeded; %s%d steps failed; %s%d steps skipped%s"; | 50 | "%s%d steps succeeded; %s%d steps failed; %s%d steps skipped%s"; |
50 | - private static final String FAILURE_SUMMARY = "%sFailed! " + MIXED_SUMMARY; | 51 | + private static final String FAILURE_SUMMARY = "%s %sFailed! " + MIXED_SUMMARY; |
51 | - private static final String ABORTED_SUMMARY = "%sAborted! " + MIXED_SUMMARY; | 52 | + private static final String ABORTED_SUMMARY = "%s %sAborted! " + MIXED_SUMMARY; |
52 | 53 | ||
53 | private boolean isReported = false; | 54 | private boolean isReported = false; |
54 | 55 | ||
... | @@ -180,6 +181,7 @@ public final class Main { | ... | @@ -180,6 +181,7 @@ public final class Main { |
180 | private void processList() { | 181 | private void processList() { |
181 | coordinator.getRecords() | 182 | coordinator.getRecords() |
182 | .forEach(event -> logStatus(event.time(), event.name(), event.status(), event.command())); | 183 | .forEach(event -> logStatus(event.time(), event.name(), event.status(), event.command())); |
184 | + printSummary(0, false); | ||
183 | System.exit(0); | 185 | System.exit(0); |
184 | } | 186 | } |
185 | 187 | ||
... | @@ -201,14 +203,15 @@ public final class Main { | ... | @@ -201,14 +203,15 @@ public final class Main { |
201 | if (!isReported) { | 203 | if (!isReported) { |
202 | isReported = true; | 204 | isReported = true; |
203 | Set<Step> steps = coordinator.getSteps(); | 205 | Set<Step> steps = coordinator.getSteps(); |
206 | + String duration = formatDuration((int) (coordinator.duration() / 1_000)); | ||
204 | int count = steps.size(); | 207 | int count = steps.size(); |
205 | if (exitCode == 0) { | 208 | if (exitCode == 0) { |
206 | - print(SUCCESS_SUMMARY, color(SUCCEEDED), count, color(null)); | 209 | + print(SUCCESS_SUMMARY, duration, color(SUCCEEDED), count, color(null)); |
207 | } else { | 210 | } else { |
208 | long success = steps.stream().filter(s -> coordinator.getStatus(s) == SUCCEEDED).count(); | 211 | long success = steps.stream().filter(s -> coordinator.getStatus(s) == SUCCEEDED).count(); |
209 | long failed = steps.stream().filter(s -> coordinator.getStatus(s) == FAILED).count(); | 212 | long failed = steps.stream().filter(s -> coordinator.getStatus(s) == FAILED).count(); |
210 | long skipped = steps.stream().filter(s -> coordinator.getStatus(s) == SKIPPED).count(); | 213 | long skipped = steps.stream().filter(s -> coordinator.getStatus(s) == SKIPPED).count(); |
211 | - print(isAborted ? ABORTED_SUMMARY : FAILURE_SUMMARY, | 214 | + print(isAborted ? ABORTED_SUMMARY : FAILURE_SUMMARY, duration, |
212 | color(FAILED), color(SUCCEEDED), success, | 215 | color(FAILED), color(SUCCEEDED), success, |
213 | color(FAILED), failed, color(SKIPPED), skipped, color(null)); | 216 | color(FAILED), failed, color(SKIPPED), skipped, color(null)); |
214 | } | 217 | } |
... | @@ -281,6 +284,17 @@ public final class Main { | ... | @@ -281,6 +284,17 @@ public final class Main { |
281 | } | 284 | } |
282 | } | 285 | } |
283 | 286 | ||
287 | + // Formats time duration | ||
288 | + private static String formatDuration(int totalSeconds) { | ||
289 | + int seconds = totalSeconds % 60; | ||
290 | + int totalMinutes = totalSeconds / 60; | ||
291 | + int minutes = totalMinutes % 60; | ||
292 | + int hours = totalMinutes / 60; | ||
293 | + return hours > 0 ? | ||
294 | + String.format("%d:%02d:%02d", hours, minutes, seconds) : | ||
295 | + String.format("%d:%02d", minutes, seconds); | ||
296 | + } | ||
297 | + | ||
284 | // Shutdown hook to report status even when aborted. | 298 | // Shutdown hook to report status even when aborted. |
285 | private class ShutdownHook extends Thread { | 299 | private class ShutdownHook extends Thread { |
286 | @Override | 300 | @Override | ... | ... |
... | @@ -43,6 +43,9 @@ class ScenarioStore { | ... | @@ -43,6 +43,9 @@ class ScenarioStore { |
43 | private final List<StepEvent> events = Lists.newArrayList(); | 43 | private final List<StepEvent> events = Lists.newArrayList(); |
44 | private final Map<String, Status> statusMap = Maps.newConcurrentMap(); | 44 | private final Map<String, Status> statusMap = Maps.newConcurrentMap(); |
45 | 45 | ||
46 | + private long startTime = Long.MAX_VALUE; | ||
47 | + private long endTime = Long.MIN_VALUE; | ||
48 | + | ||
46 | /** | 49 | /** |
47 | * Creates a new scenario store for the specified process flow. | 50 | * Creates a new scenario store for the specified process flow. |
48 | * | 51 | * |
... | @@ -69,6 +72,8 @@ class ScenarioStore { | ... | @@ -69,6 +72,8 @@ class ScenarioStore { |
69 | PropertiesConfiguration cfg = new PropertiesConfiguration(storeFile); | 72 | PropertiesConfiguration cfg = new PropertiesConfiguration(storeFile); |
70 | cfg.clear(); | 73 | cfg.clear(); |
71 | cfg.save(); | 74 | cfg.save(); |
75 | + startTime = Long.MAX_VALUE; | ||
76 | + endTime = Long.MIN_VALUE; | ||
72 | } catch (ConfigurationException e) { | 77 | } catch (ConfigurationException e) { |
73 | print("Unable to store file %s", storeFile); | 78 | print("Unable to store file %s", storeFile); |
74 | } | 79 | } |
... | @@ -156,6 +161,8 @@ class ScenarioStore { | ... | @@ -156,6 +161,8 @@ class ScenarioStore { |
156 | private synchronized void add(StepEvent event) { | 161 | private synchronized void add(StepEvent event) { |
157 | events.add(event); | 162 | events.add(event); |
158 | statusMap.put(event.name(), event.status()); | 163 | statusMap.put(event.name(), event.status()); |
164 | + startTime = Math.min(startTime, event.time()); | ||
165 | + endTime = Math.max(endTime, event.time()); | ||
159 | } | 166 | } |
160 | 167 | ||
161 | /** | 168 | /** |
... | @@ -198,4 +205,22 @@ class ScenarioStore { | ... | @@ -198,4 +205,22 @@ class ScenarioStore { |
198 | } | 205 | } |
199 | } | 206 | } |
200 | 207 | ||
208 | + /** | ||
209 | + * Returns the scenario run start time. | ||
210 | + * | ||
211 | + * @return start time in mills since start of epoch | ||
212 | + */ | ||
213 | + public long startTime() { | ||
214 | + return startTime; | ||
215 | + } | ||
216 | + | ||
217 | + /** | ||
218 | + * Returns the scenario run end time or current time if the scenario | ||
219 | + * is still running. | ||
220 | + * | ||
221 | + * @return end time (or current time) in mills since start of epoch | ||
222 | + */ | ||
223 | + public long endTime() { | ||
224 | + return endTime > 0 ? endTime : System.currentTimeMillis(); | ||
225 | + } | ||
201 | } | 226 | } | ... | ... |
-
Please register or login to post a comment