| @@ -53,6 +53,7 @@ import java.io.PrintStream; | |||||
| import java.nio.file.Files; | import java.nio.file.Files; | ||||
| import java.nio.file.Path; | import java.nio.file.Path; | ||||
| import java.nio.file.Paths; | import java.nio.file.Paths; | ||||
| import java.text.NumberFormat; | |||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| import java.util.Arrays; | import java.util.Arrays; | ||||
| import java.util.Collection; | import java.util.Collection; | ||||
| @@ -609,6 +610,14 @@ public class LauncherSupport { | |||||
| }); | }); | ||||
| } | } | ||||
| private static final double ONE_SECOND = 1000.0; | |||||
| // We use this only in the testPlanExecutionFinished method, which | |||||
| // as per the JUnit5 platform semantics won't be called concurrently | |||||
| // by multiple threads (https://github.com/junit-team/junit5/issues/2539#issuecomment-766325555). | |||||
| // So it's safe to use this without any additional thread safety access controls. | |||||
| private NumberFormat timeFormatter = NumberFormat.getInstance(); | |||||
| @Override | @Override | ||||
| public void testPlanExecutionFinished(final TestPlan testPlan) { | public void testPlanExecutionFinished(final TestPlan testPlan) { | ||||
| super.testPlanExecutionFinished(testPlan); | super.testPlanExecutionFinished(testPlan); | ||||
| @@ -629,7 +638,8 @@ public class LauncherSupport { | |||||
| sb.append(", Skipped: "); | sb.append(", Skipped: "); | ||||
| sb.append(summary.getTestsSkippedCount()); | sb.append(summary.getTestsSkippedCount()); | ||||
| sb.append(", Time elapsed: "); | sb.append(", Time elapsed: "); | ||||
| sb.append((summary.getTimeFinished() - summary.getTimeStarted()) / 1000f); | |||||
| final long elapsedMs = summary.getTimeFinished() - summary.getTimeStarted(); | |||||
| sb.append(timeFormatter.format(elapsedMs / ONE_SECOND)); | |||||
| sb.append(" sec"); | sb.append(" sec"); | ||||
| this.originalSysOut.println(sb.toString()); | this.originalSysOut.println(sb.toString()); | ||||
| } | } | ||||