View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.surefire.its;
20  
21  import java.util.Iterator;
22  
23  import org.apache.maven.surefire.its.fixture.OutputValidator;
24  import org.apache.maven.surefire.its.fixture.SurefireJUnit4IntegrationTestCase;
25  import org.apache.maven.surefire.its.fixture.SurefireLauncher;
26  import org.junit.Test;
27  
28  import static org.assertj.core.api.Assertions.assertThat;
29  
30  /**
31   * Testing JUnitCoreWrapper with ParallelComputerBuilder.
32   *
33   * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
34   * @since 2.16
35   */
36  @SuppressWarnings("checkstyle:magicnumber")
37  public class JUnit47ParallelIT extends SurefireJUnit4IntegrationTestCase {
38  
39      @Test
40      public void unknownThreadCountSuites() {
41          unpack().parallelSuites()
42                  .setTestToRun("TestClass")
43                  .failNever()
44                  .executeTest()
45                  .verifyTextInLog(
46                          "Use threadCount or threadCountSuites > 0 or useUnlimitedThreads=true for parallel='suites'");
47      }
48  
49      @Test
50      public void unknownThreadCountClasses() {
51          unpack().parallelClasses()
52                  .setTestToRun("TestClass")
53                  .failNever()
54                  .executeTest()
55                  .verifyTextInLog(
56                          "Use threadCount or threadCountClasses > 0 or useUnlimitedThreads=true for parallel='classes'");
57      }
58  
59      @Test
60      public void unknownThreadCountMethods() {
61          unpack().parallelMethods()
62                  .setTestToRun("TestClass")
63                  .failNever()
64                  .executeTest()
65                  .verifyTextInLog(
66                          "Use threadCount or threadCountMethods > 0 or useUnlimitedThreads=true for parallel='methods'");
67      }
68  
69      @Test
70      public void unknownThreadCountBoth() {
71          unpack().parallelBoth()
72                  .setTestToRun("TestClass")
73                  .failNever()
74                  .executeTest()
75                  .verifyTextInLog("Use useUnlimitedThreads=true, " + "or only threadCount > 0, "
76                          + "or (threadCountClasses > 0 and "
77                          + "threadCountMethods > 0), " + "or (threadCount > 0 and threadCountClasses > 0 and "
78                          + "threadCountMethods > 0), " + "or (threadCount > 0 and threadCountClasses > 0 and "
79                          + "threadCount > threadCountClasses) " + "for parallel='both' or "
80                          + "parallel='classesAndMethods'");
81      }
82  
83      @Test
84      public void unknownThreadCountAll() {
85          unpack().parallelAll()
86                  .setTestToRun("TestClass")
87                  .failNever()
88                  .executeTest()
89                  .verifyTextInLog("Use useUnlimitedThreads=true, " + "or only threadCount > 0, "
90                          + "or (threadCountSuites > 0 and "
91                          + "threadCountClasses > 0 and threadCountMethods > 0), " + "or every thread-count is "
92                          + "specified, " + "or (threadCount > 0 and threadCountSuites > 0 and threadCountClasses > 0 "
93                          + "and threadCount > threadCountSuites + threadCountClasses) " + "for parallel='all'");
94      }
95  
96      @Test
97      public void unknownThreadCountSuitesAndClasses() {
98          unpack().parallelSuitesAndClasses()
99                  .setTestToRun("TestClass")
100                 .failNever()
101                 .executeTest()
102                 .verifyTextInLog("Use useUnlimitedThreads=true, " + "or only threadCount > 0, "
103                         + "or (threadCountSuites > 0 and "
104                         + "threadCountClasses > 0), " + "or (threadCount > 0 and threadCountSuites > 0 and "
105                         + "threadCountClasses > 0) " + "or (threadCount > 0 and threadCountSuites > 0 and threadCount"
106                         + " > threadCountSuites) " + "for parallel='suitesAndClasses' or 'both'");
107     }
108 
109     @Test
110     public void unknownThreadCountSuitesAndMethods() {
111         unpack().parallelSuitesAndMethods()
112                 .setTestToRun("TestClass")
113                 .failNever()
114                 .executeTest()
115                 .verifyTextInLog("Use useUnlimitedThreads=true, " + "or only threadCount > 0, "
116                         + "or (threadCountSuites > 0 and "
117                         + "threadCountMethods > 0), " + "or (threadCount > 0 and threadCountSuites > 0 and "
118                         + "threadCountMethods > 0), " + "or (threadCount > 0 and threadCountSuites > 0 and "
119                         + "threadCount > threadCountSuites) " + "for parallel='suitesAndMethods'");
120     }
121 
122     @Test
123     public void unknownThreadCountClassesAndMethods() {
124         unpack().parallelClassesAndMethods()
125                 .setTestToRun("TestClass")
126                 .failNever()
127                 .executeTest()
128                 .verifyTextInLog("Use useUnlimitedThreads=true, " + "or only threadCount > 0, "
129                         + "or (threadCountClasses > 0 and "
130                         + "threadCountMethods > 0), " + "or (threadCount > 0 and threadCountClasses > 0 and "
131                         + "threadCountMethods > 0), " + "or (threadCount > 0 and threadCountClasses > 0 and "
132                         + "threadCount > threadCountClasses) " + "for parallel='both' or "
133                         + "parallel='classesAndMethods'");
134     }
135 
136     @Test
137     public void serial() {
138         // takes 7.2 s
139         unpack().setTestToRun("Suite*Test").executeTest().verifyErrorFree(24);
140     }
141 
142     @Test
143     public void unlimitedThreadsSuites1() {
144         // takes 3.6 s
145         unpack().parallelSuites()
146                 .useUnlimitedThreads()
147                 .setTestToRun("Suite*Test")
148                 .executeTest()
149                 .verifyErrorFree(24);
150     }
151 
152     @Test
153     public void unlimitedThreadsSuites2() {
154         // takes 3.6 s
155         unpack().parallelSuites()
156                 .useUnlimitedThreads()
157                 .threadCountSuites(5)
158                 .setTestToRun("Suite*Test")
159                 .executeTest()
160                 .verifyErrorFree(24);
161     }
162 
163     @Test
164     public void unlimitedThreadsClasses1() {
165         // takes 1.8 s
166         unpack().parallelClasses()
167                 .useUnlimitedThreads()
168                 .setTestToRun("Suite*Test")
169                 .executeTest()
170                 .verifyErrorFree(24);
171     }
172 
173     @Test
174     public void unlimitedThreadsClasses2() {
175         // takes 1.8 s
176         unpack().parallelClasses()
177                 .useUnlimitedThreads()
178                 .threadCountClasses(5)
179                 .setTestToRun("Suite*Test")
180                 .executeTest()
181                 .verifyErrorFree(24);
182     }
183 
184     @Test
185     public void unlimitedThreadsMethods1() {
186         // takes 2.4 s
187         unpack().parallelMethods()
188                 .useUnlimitedThreads()
189                 .setTestToRun("Suite*Test")
190                 .executeTest()
191                 .verifyErrorFree(24);
192     }
193 
194     @Test
195     public void unlimitedThreadsMethods2() {
196         // takes 2.4 s
197         unpack().parallelMethods()
198                 .useUnlimitedThreads()
199                 .threadCountMethods(5)
200                 .setTestToRun("Suite*Test")
201                 .executeTest()
202                 .verifyErrorFree(24);
203     }
204 
205     @Test
206     public void unlimitedThreadsSuitesAndClasses1() {
207         // takes 0.9 s
208         unpack().parallelSuitesAndClasses()
209                 .useUnlimitedThreads()
210                 .setTestToRun("Suite*Test")
211                 .executeTest()
212                 .verifyErrorFree(24);
213     }
214 
215     @Test
216     public void unlimitedThreadsSuitesAndClasses2() {
217         // takes 0.9 s
218         // 1.8 s with 4 parallel classes
219         unpack().parallelSuitesAndClasses()
220                 .useUnlimitedThreads()
221                 .threadCountSuites(5)
222                 .threadCountClasses(15)
223                 .setTestToRun("Suite*Test")
224                 .executeTest()
225                 .verifyErrorFree(24);
226     }
227 
228     @Test
229     public void unlimitedThreadsSuitesAndMethods1() {
230         // takes 1.2 s
231         unpack().parallelSuitesAndMethods()
232                 .useUnlimitedThreads()
233                 .setTestToRun("Suite*Test")
234                 .executeTest()
235                 .verifyErrorFree(24);
236     }
237 
238     @Test
239     public void unlimitedThreadsSuitesAndMethods2() {
240         // takes 1.2 s
241         unpack().parallelSuitesAndMethods()
242                 .useUnlimitedThreads()
243                 .threadCountSuites(5)
244                 .threadCountMethods(15)
245                 .setTestToRun("Suite*Test")
246                 .executeTest()
247                 .verifyErrorFree(24);
248     }
249 
250     @Test
251     public void unlimitedThreadsClassesAndMethods1() {
252         // takes 0.6 s
253         unpack().parallelClassesAndMethods()
254                 .useUnlimitedThreads()
255                 .setTestToRun("Suite*Test")
256                 .executeTest()
257                 .verifyErrorFree(24);
258     }
259 
260     @Test
261     public void unlimitedThreadsClassesAndMethods2() {
262         // takes 0.6 s
263         unpack().parallelClassesAndMethods()
264                 .useUnlimitedThreads()
265                 .threadCountClasses(5)
266                 .threadCountMethods(15)
267                 .setTestToRun("Suite*Test")
268                 .executeTest()
269                 .verifyErrorFree(24);
270     }
271 
272     @Test
273     public void unlimitedThreadsAll1() {
274         // takes 0.3 s
275         unpack().parallelAll()
276                 .useUnlimitedThreads()
277                 .setTestToRun("Suite*Test")
278                 .executeTest()
279                 .verifyErrorFree(24);
280     }
281 
282     @Test
283     public void unlimitedThreadsAll2() {
284         // takes 0.3 s
285         unpack().parallelAll()
286                 .useUnlimitedThreads()
287                 .threadCountSuites(5)
288                 .threadCountClasses(15)
289                 .threadCountMethods(30)
290                 .setTestToRun("Suite*Test")
291                 .executeTest()
292                 .verifyErrorFree(24);
293     }
294 
295     @Test
296     public void threadCountSuites() {
297         // takes 3.6 s
298         unpack().parallelSuites()
299                 .threadCount(3)
300                 .setTestToRun("Suite*Test")
301                 .executeTest()
302                 .verifyErrorFree(24);
303     }
304 
305     @Test
306     public void threadCountClasses() {
307         // takes 3.6 s for single core
308         // takes 1.8 s for double core
309         unpack().parallelClasses()
310                 .threadCount(3)
311                 .setTestToRun("Suite*Test")
312                 .executeTest()
313                 .verifyErrorFree(24);
314     }
315 
316     @Test
317     public void threadCountMethods() {
318         // takes 2.4 s
319         unpack().parallelMethods()
320                 .threadCount(3)
321                 .setTestToRun("Suite*Test")
322                 .executeTest()
323                 .verifyErrorFree(24);
324     }
325 
326     @Test
327     public void threadCountClassesAndMethodsOneCore() {
328         // takes 4.8 s
329         unpack().disablePerCoreThreadCount()
330                 .disableParallelOptimization()
331                 .parallelClassesAndMethods()
332                 .threadCount(3)
333                 .setTestToRun("Suite*Test")
334                 .executeTest()
335                 .verifyErrorFree(24);
336     }
337 
338     @Test
339     public void threadCountClassesAndMethodsOneCoreOptimized() {
340         // the number of reused threads in leafs depends on the number of runners and CPU
341         unpack().disablePerCoreThreadCount()
342                 .parallelClassesAndMethods()
343                 .threadCount(3)
344                 .setTestToRun("Suite*Test")
345                 .executeTest()
346                 .verifyErrorFree(24);
347     }
348 
349     @Test
350     public void threadCountClassesAndMethods() {
351         // takes 2.4 s for double core CPU
352         unpack().disableParallelOptimization()
353                 .parallelClassesAndMethods()
354                 .threadCount(3)
355                 .setTestToRun("Suite*Test")
356                 .executeTest()
357                 .verifyErrorFree(24);
358     }
359 
360     @Test
361     public void threadCountClassesAndMethodsOptimized() {
362         // the number of reused threads in leafs depends on the number of runners and CPU
363         unpack().parallelClassesAndMethods()
364                 .threadCount(3)
365                 .setTestToRun("Suite*Test")
366                 .executeTest()
367                 .verifyErrorFree(24);
368     }
369 
370     @Test
371     public void threadCountSuitesAndMethods() {
372         // usually 24 times 0.3 s = 7.2 s with one core CPU
373         // takes 1.8 s for double core CPU
374         unpack().disableParallelOptimization()
375                 .parallelSuitesAndMethods()
376                 .threadCount(3)
377                 .setTestToRun("Suite*Test")
378                 .executeTest()
379                 .verifyErrorFree(24);
380     }
381 
382     @Test
383     public void threadCountSuitesAndMethodsOptimized() {
384         // the number of reused threads in leafs depends on the number of runners and CPU
385         unpack().parallelSuitesAndMethods()
386                 .threadCount(3)
387                 .setTestToRun("Suite*Test")
388                 .executeTest()
389                 .verifyErrorFree(24);
390     }
391 
392     @Test
393     public void threadCountSuitesAndClasses() {
394         unpack().disableParallelOptimization()
395                 .parallelSuitesAndClasses()
396                 .threadCount(3)
397                 .setTestToRun("Suite*Test")
398                 .executeTest()
399                 .verifyErrorFree(24);
400     }
401 
402     @Test
403     public void threadCountSuitesAndClassesOptimized() {
404         // the number of reused threads in leafs depends on the number of runners and CPU
405         unpack().parallelSuitesAndClasses()
406                 .threadCount(3)
407                 .setTestToRun("Suite*Test")
408                 .executeTest()
409                 .verifyErrorFree(24);
410     }
411 
412     @Test
413     public void threadCountAll() {
414         unpack().disableParallelOptimization()
415                 .parallelAll()
416                 .threadCount(3)
417                 .setTestToRun("Suite*Test")
418                 .executeTest()
419                 .verifyErrorFree(24);
420     }
421 
422     @Test
423     public void threadCountAllOptimized() {
424         // the number of reused threads in leafs depends on the number of runners and CPU
425         unpack().parallelAll()
426                 .threadCount(3)
427                 .setTestToRun("Suite*Test")
428                 .executeTest()
429                 .verifyErrorFree(24);
430     }
431 
432     @Test
433     public void everyThreadCountSuitesAndClasses() {
434         // takes 1.8 s for double core CPU
435         unpack().parallelSuitesAndClasses()
436                 .threadCount(3)
437                 .threadCountSuites(34)
438                 .threadCountClasses(66)
439                 .setTestToRun("Suite*Test")
440                 .executeTest()
441                 .verifyErrorFree(24);
442     }
443 
444     @Test
445     public void everyThreadCountSuitesAndMethods() {
446         // takes 1.8 s for double core CPU
447         unpack().parallelSuitesAndMethods()
448                 .threadCount(3)
449                 .threadCountSuites(34)
450                 .threadCountMethods(66)
451                 .setTestToRun("Suite*Test")
452                 .executeTest()
453                 .verifyErrorFree(24);
454     }
455 
456     @Test
457     public void everyThreadCountClassesAndMethods() {
458         // takes 1.8 s for double core CPU
459         unpack().parallelClassesAndMethods()
460                 .threadCount(3)
461                 .threadCountClasses(34)
462                 .threadCountMethods(66)
463                 .setTestToRun("Suite*Test")
464                 .executeTest()
465                 .verifyErrorFree(24);
466     }
467 
468     @Test
469     public void everyThreadCountAll() {
470         // takes 2.4 s for double core CPU
471         unpack().parallelAll()
472                 .threadCount(3)
473                 .threadCountSuites(17)
474                 .threadCountClasses(34)
475                 .threadCountMethods(49)
476                 .setTestToRun("Suite*Test")
477                 .executeTest()
478                 .verifyErrorFree(24);
479     }
480 
481     @Test
482     public void reusableThreadCountSuitesAndClasses() {
483         // 4 * cpu to 5 * cpu threads to run test classes
484         // takes cca 1.8 s
485         unpack().disableParallelOptimization()
486                 .parallelSuitesAndClasses()
487                 .disablePerCoreThreadCount()
488                 .threadCount(6)
489                 .threadCountSuites(2)
490                 .setTestToRun("Suite*Test")
491                 .executeTest()
492                 .verifyErrorFree(24);
493     }
494 
495     @Test
496     public void reusableThreadCountSuitesAndClassesOptimized() {
497         // the number of reused threads in leafs depends on the number of runners and CPU
498         unpack().parallelSuitesAndClasses()
499                 .disablePerCoreThreadCount()
500                 .threadCount(6)
501                 .threadCountSuites(2)
502                 .setTestToRun("Suite*Test")
503                 .executeTest()
504                 .verifyErrorFree(24);
505     }
506 
507     @Test
508     public void reusableThreadCountSuitesAndMethods() {
509         // 4 * cpu to 5 * cpu threads to run test methods
510         // takes cca 1.8 s
511         unpack().disableParallelOptimization()
512                 .parallelSuitesAndMethods()
513                 .disablePerCoreThreadCount()
514                 .threadCount(6)
515                 .threadCountSuites(2)
516                 .setTestToRun("Suite*Test")
517                 .executeTest()
518                 .verifyErrorFree(24);
519     }
520 
521     @Test
522     public void reusableThreadCountSuitesAndMethodsOptimized() {
523         // the number of reused threads in leafs depends on the number of runners and CPU
524         unpack().parallelSuitesAndMethods()
525                 .disablePerCoreThreadCount()
526                 .threadCount(6)
527                 .threadCountSuites(2)
528                 .setTestToRun("Suite*Test")
529                 .executeTest()
530                 .verifyErrorFree(24);
531     }
532 
533     @Test
534     public void reusableThreadCountClassesAndMethods() {
535         // 4 * cpu to 5 * cpu threads to run test methods
536         // takes cca 1.8 s
537         unpack().disableParallelOptimization()
538                 .parallelClassesAndMethods()
539                 .disablePerCoreThreadCount()
540                 .threadCount(6)
541                 .threadCountClasses(2)
542                 .setTestToRun("Suite*Test")
543                 .executeTest()
544                 .verifyErrorFree(24);
545     }
546 
547     @Test
548     public void reusableThreadCountClassesAndMethodsOptimized() {
549         // the number of reused threads in leafs depends on the number of runners and CPU
550         unpack().parallelClassesAndMethods()
551                 .disablePerCoreThreadCount()
552                 .threadCount(6)
553                 .threadCountClasses(2)
554                 .setTestToRun("Suite*Test")
555                 .executeTest()
556                 .verifyErrorFree(24);
557     }
558 
559     @Test
560     public void reusableThreadCountAll() {
561         // 8 * cpu to 13 * cpu threads to run test methods
562         // takes 0.9 s
563         unpack().disableParallelOptimization()
564                 .parallelAll()
565                 .disablePerCoreThreadCount()
566                 .threadCount(14)
567                 .threadCountSuites(2)
568                 .threadCountClasses(4)
569                 .setTestToRun("Suite*Test")
570                 .executeTest()
571                 .verifyErrorFree(24);
572     }
573 
574     @Test
575     public void reusableThreadCountAllOptimized() {
576         // the number of reused threads in leafs depends on the number of runners and CPU
577         unpack().parallelAll()
578                 .disablePerCoreThreadCount()
579                 .threadCount(14)
580                 .threadCountSuites(2)
581                 .threadCountClasses(4)
582                 .setTestToRun("Suite*Test")
583                 .executeTest()
584                 .verifyErrorFree(24);
585     }
586 
587     @Test
588     public void suites() {
589         // takes 3.6 s
590         unpack().parallelSuites()
591                 .threadCountSuites(5)
592                 .setTestToRun("Suite*Test")
593                 .executeTest()
594                 .verifyErrorFree(24);
595     }
596 
597     @Test
598     public void classes() {
599         // takes 1.8 s on any CPU because the suites are running in a sequence
600         unpack().parallelClasses()
601                 .threadCountClasses(5)
602                 .setTestToRun("Suite*Test")
603                 .executeTest()
604                 .verifyErrorFree(24);
605     }
606 
607     @Test
608     public void methods() {
609         // takes 2.4 s on any CPU because every class has only three methods
610         // and the suites and classes are running in a sequence
611         unpack().parallelMethods()
612                 .threadCountMethods(5)
613                 .setTestToRun("Suite*Test")
614                 .executeTest()
615                 .verifyErrorFree(24);
616     }
617 
618     @Test
619     public void suitesAndClasses() {
620         // takes 0.9 s
621         unpack().parallelSuitesAndClasses()
622                 .threadCountSuites(5)
623                 .threadCountClasses(15)
624                 .setTestToRun("Suite*Test")
625                 .executeTest()
626                 .verifyErrorFree(24);
627     }
628 
629     @Test
630     public void suitesAndMethods() {
631         // takes 1.2 s on any CPU
632         unpack().parallelSuitesAndMethods()
633                 .threadCountSuites(5)
634                 .threadCountMethods(15)
635                 .setTestToRun("Suite*Test")
636                 .executeTest()
637                 .verifyErrorFree(24);
638     }
639 
640     @Test
641     public void classesAndMethods() {
642         // takes 0.6 s on any CPU
643         unpack().parallelClassesAndMethods()
644                 .threadCountClasses(5)
645                 .threadCountMethods(15)
646                 .setTestToRun("Suite*Test")
647                 .executeTest()
648                 .verifyErrorFree(24);
649     }
650 
651     @Test
652     public void all() {
653         // takes 0.3 s on any CPU
654         unpack().parallelAll()
655                 .threadCountSuites(5)
656                 .threadCountClasses(15)
657                 .threadCountMethods(30)
658                 .setTestToRun("Suite*Test")
659                 .executeTest()
660                 .verifyErrorFree(24);
661     }
662 
663     @Test
664     public void shutdown() {
665         // executes for 2.5 s until timeout has elapsed
666         unpack().parallelMethods()
667                 .threadCountMethods(2)
668                 .parallelTestsTimeoutInSeconds(2.5d)
669                 .setTestToRun("TestClass")
670                 .failNever()
671                 .executeTest()
672                 .verifyTextInLog("The test run has finished abruptly after timeout of 2.5 seconds.");
673     }
674 
675     @Test
676     public void forcedShutdown() {
677         // executes for 2.5 s until timeout has elapsed
678         unpack().parallelMethods()
679                 .threadCountMethods(2)
680                 .parallelTestsTimeoutForcedInSeconds(2.5d)
681                 .setTestToRun("TestClass")
682                 .failNever()
683                 .executeTest()
684                 .verifyTextInLog("The test run has finished abruptly after timeout of 2.5 seconds.");
685     }
686 
687     @Test
688     public void timeoutAndForcedShutdown() {
689         // executes for one s until timeout has elapsed
690         unpack().parallelMethods()
691                 .threadCountMethods(2)
692                 .parallelTestsTimeoutInSeconds(1)
693                 .parallelTestsTimeoutForcedInSeconds(2.5d)
694                 .setTestToRun("TestClass")
695                 .failNever()
696                 .executeTest()
697                 .verifyTextInLog("The test run has finished abruptly after timeout of 1.0 seconds.");
698     }
699 
700     @Test
701     public void forcedShutdownVerifyingLogs() throws Exception {
702         // attempts to run for 2.4 s until timeout has elapsed
703         OutputValidator validator = unpack().parallelMethods()
704                 .threadCountMethods(3)
705                 .disablePerCoreThreadCount()
706                 .parallelTestsTimeoutForcedInSeconds(1.05d)
707                 .setTestToRun("Waiting*Test")
708                 .failNever()
709                 .executeTest()
710                 .verifyTextInLog("The test run has finished abruptly after timeout of 1.05 seconds.")
711                 .verifyTextInLog("These tests were executed in prior to the shutdown operation:");
712 
713         for (Iterator<String> it = validator.loadLogLines().iterator(); it.hasNext(); ) {
714             String line = it.next();
715             if (line.contains("These tests are incomplete:")) {
716                 assertThat(it.hasNext()).isTrue();
717                 assertThat(it.next()).matches("^.*surefireparallel\\.Waiting(\\d{1,1})Test$");
718             }
719         }
720     }
721 
722     private SurefireLauncher unpack() {
723         return unpack("junit47-parallel").showErrorStackTraces().forkOnce().redirectToFile(false);
724     }
725 }