Как избежать верного теста, который будет выполняться параллельно - PullRequest
0 голосов
/ 03 июля 2018

У меня есть приложение, в котором модульные тесты написаны так, что их нельзя запускать параллельно.

При запуске тестов с maven некоторые из них по этой причине терпят неудачу. Я мог убедиться, что они работают параллельно, выполнив команду

System.out.println(System.currentTimeMillis() +">>> executing testXXX");
System.out.println(System.currentTimeMillis() +">>> finished  testXXX");

в начале и в конце каждого метода. Выход:

1530602546964>>> executing testInstantiation                                                                                                                         
1530602547036<<< finished  testInstantiation                                                                                                                         
1530602547042>>> executing testSimilarNamedResources                                                                                                                 
1530602547050>>> executing testTranslateWithMissingKey                                                                                                               
1530602547051>>> executing testTryTranslateWithMissingKey                                                                                                            
1530602547051<<< finished  testTryTranslateWithMissingKey                                                                                                            
1530602547051>>> executing testTranslationMapWithMissingKey                                                                                                          
1530602547055>>> executing testSilentlyIgnoringExceptionTranslationMapWithMissingKey                                                                                 
1530602547055<<< finished  testSilentlyIgnoringExceptionTranslationMapWithMissingKey   

Как мы видим после запуска testS SimilarNamedResources, запускаются и другие тесты.

Я попытался настроить плагин surefire, чтобы он не работал параллельно:

<build>                                                                                                                                                           
   <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-surefire-plugin</artifactId>
       <version>2.22.0</version>
       <configuration>
         <!--parallel>false</parallel-->
         <threadCount>1</threadCount>
         <perCoreThreadCount>false</perCoreThreadCount>
       </configuration>
     </plugin>
   </plugins>
</build>

Но он все еще выполняет эти тесты в параллельном режиме. Я запустил mvn с параметром -X, чтобы посмотреть, была ли применена моя конфигурация, и получил такой вывод:

$ mvn -X test | grep -iE "(parallel|threadcount)"                                                                                                                
  <parallel>${parallel}</parallel>                                                                                                                               
  <parallelMavenExecution default-value="${session.parallel}"/>                                                                                                  
  <parallelOptimized default-value="true">${parallelOptimized}</parallelOptimized>                                                                               
  <parallelTestsTimeoutForcedInSeconds>${surefire.parallel.forcedTimeout}<parallelTestsTimeoutForcedInSeconds>                                                   
  <parallelTestsTimeoutInSeconds>${surefire.parallel.timeout}<parallelTestsTimeoutInSeconds>                                                                     
  <perCoreThreadCount default-value="true">false</perCoreThreadCount>                                                                                            
  <threadCount>0</threadCount>                                                                                                                                   
  <threadCountClasses default-value="0">${threadCountClasses}</threadCountClasses>                                                                               
  <threadCountMethods default-value="0">${threadCountMethods}</threadCountMethods>                                                                               
  <threadCountSuites default-value="0">${threadCountSuites}</threadCountSuites>                                                                                  
[DEBUG]   (f) parallelMavenExecution = false                                                                                                                     
[DEBUG]   (s) parallelOptimized = true                                                                                                                           
[DEBUG]   (s) perCoreThreadCount = false                                                                                                                         
[DEBUG]   (s) threadCount = 0                                                                                                                                    
[DEBUG]   (s) threadCountClasses = 0                                                                                                                             
[DEBUG]   (s) threadCountMethods = 0                                                                                                                             
[DEBUG]   (s) threadCountSuites = 0                    

Мне что-то не хватает в конфигурации плагина?

UPDATE:

Я сдался. Поведение было слишком странным. Попытка создать простой образец не сработала. Эти тесты не проводились параллельно. Я не выяснил, почему это так. Мы обновим весь код и, следовательно, также модульные тесты. Больше не нужно искать решение, но меня все равно удивляет, почему он показал это странное поведение ...

1 Ответ

0 голосов
/ 03 июля 2018

Я бы порекомендовал вам следовать этому руководству:

Начиная с maven-surefire-plugin: 2.18, вы можете применить аннотацию JCIP @ net.jcip.annotations.NotThreadSafe к классу Java теста JUnit (чистый тестовый класс, Suite, Parameterized и т. Д.) Для выполнения это в единственном экземпляре потока. Поток имеет имя maven-surefire-plugin @ NotThreadSafe и выполняется в конце тестового прогона. https://maven.apache.org/surefire/maven-surefire-plugin/examples/fork-options-and-parallel-execution.html#Parallel_Test_Execution_and_Single_Thread_Execution

Как и другие говорили, что они действительно должны быть переписаны, и, за исключением тех тестов, которые абсолютно не могут выполняться параллельно, должны быть аннотированы.

Для определения вашего плагина я предлагаю вам запустить его параллельно, поскольку на современных машинах он может быть немного быстрее.

У меня есть мой, определенный как:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven-surefire-plugin.version}</version>
    <configuration>
        <useUnlimitedThreads>true</useUnlimitedThreads>
        <runOrder>random</runOrder>
        <redirectTestOutputToFile>true</redirectTestOutputToFile>
        <rerunFailingTestsCount>1</rerunFailingTestsCount>
        <parallel>methods</parallel>
        <forkedProcessExitTimeoutInSeconds>2</forkedProcessExitTimeoutInSeconds>
    </configuration>
</plugin>
...