Пружинный плагин mvn прерывает интеграционное тестирование - PullRequest
0 голосов
/ 05 июня 2018

Мое интеграционное тестирование с maven-failsafe-plugin и JUnit5 было сложно настроить изначально, но теперь оно работает:

plugins:
  - artifactId: maven-failsafe-plugin
    groupId: org.apache.maven.plugins
    version: 2.19.1
    dependencies:
      - artifactId: junit-platform-surefire-provider
        groupId: org.junit.platform
        version: 1.0.3
      - artifactId: junit-jupiter-engine
        groupId: org.junit.jupiter
        version: 5.1.1
    configuration:
        includes:
          - v3api/*IntegrationTests.java
    executions:
      - goals: [ integration-test, verify ]

Однако затем я хочу превратить артефакт в толстую банку, и кажется,как будто spring-boot-maven-plugin конфликтует с maven-failsafe-plugin, потому что, если я помещу этот конфиг в мой pom ...

  - artifactId: spring-boot-maven-plugin
    groupId: org.springframework.boot
    version: ${spring.boot.version}
    executions:
      - goals: [ repackage ]
    configuration:
        fork: true
        executable: true
        outputDirectory: ${project.build.directory}/binary

, я получу эту ошибку вместо этого при интеграционном тестировании:

Jun 05, 2018 3:03:15 PM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'junit-jupiter' failed to discover tests
java.lang.NoClassDefFoundError: com/adam/api/DbAccess
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetPublicMethods(Class.java:2902)
    at java.lang.Class.getMethods(Class.java:1615)
    at org.junit.platform.commons.util.ReflectionUtils.getDefaultMethods(ReflectionUtils.java:1024)
    at org.junit.platform.commons.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:997)
    at org.junit.platform.commons.util.ReflectionUtils.findAllMethodsInHierarchy(ReflectionUtils.java:939)
    at org.junit.platform.commons.util.ReflectionUtils.findMethods(ReflectionUtils.java:923)
    at org.junit.platform.commons.util.ReflectionUtils.findMethods(ReflectionUtils.java:909)
    at org.junit.jupiter.engine.discovery.JavaElementsResolver.resolveContainedMethods(JavaElementsResolver.java:189)
    at org.junit.jupiter.engine.discovery.JavaElementsResolver.resolveChildren(JavaElementsResolver.java:177)
    at java.lang.Iterable.forEach(Iterable.java:75)
    at org.junit.jupiter.engine.discovery.JavaElementsResolver.resolveClass(JavaElementsResolver.java:61)
    at org.junit.jupiter.engine.discovery.DiscoverySelectorResolver.lambda$resolve$3(DiscoverySelectorResolver.java:69)
    at java.util.ArrayList.forEach(ArrayList.java:1249)
    at org.junit.jupiter.engine.discovery.DiscoverySelectorResolver.resolve(DiscoverySelectorResolver.java:68)
    at org.junit.jupiter.engine.discovery.DiscoverySelectorResolver.resolveSelectors(DiscoverySelectorResolver.java:50)
    at org.junit.jupiter.engine.JupiterTestEngine.discover(JupiterTestEngine.java:61)
    at org.junit.platform.launcher.core.DefaultLauncher.discoverEngineRoot(DefaultLauncher.java:130)
    at org.junit.platform.launcher.core.DefaultLauncher.discoverRoot(DefaultLauncher.java:117)
    at org.junit.platform.launcher.core.DefaultLauncher.discover(DefaultLauncher.java:82)
    at org.junit.platform.surefire.provider.TestPlanScannerFilter.accept(TestPlanScannerFilter.java:50)
    at org.apache.maven.surefire.util.DefaultScanResult.applyFilter(DefaultScanResult.java:98)
    at org.junit.platform.surefire.provider.JUnitPlatformProvider.scanClasspath(JUnitPlatformProvider.java:121)
    at org.junit.platform.surefire.provider.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:111)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:290)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:242)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:121)
Caused by: java.lang.ClassNotFoundException: com.adam.api.DbAccess
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 28 more

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0

В документах maven с пружинной загрузкой они описывают, как можно настроить плагин для запуска и остановки приложения с загрузочной пружиной для интеграционного тестирования с фазами жизненного цикла pre- и post-integration-testing.

Жизненный цикл моего приложения немного отличается в аспекте Docker и Kubernetes.Это выглядит так:

  • упакуйте банку
  • превратите банку в толстую банку с помощью весеннего загрузочного плагина
  • докеризуйте его
  • установите егов реестр Docker
  • развернуть в dev
  • интеграционное тестирование
  • продвинуть сборку из dev в тест
  • развернуть в тест

Я попытался привязать плагин весенней загрузки к фазе package, но это не имеет значения для ошибки.

Помимо проблемы фазы жизненного цикла весенней загрузки, она также может иметь много общего с JUnit5, потому что maven-failsafe-plugin, похоже, находится на грани неподдерживаемого для JUnit5: Как запустить интеграционные тесты JUnit 5с плагином Maven Failsafe?

Я также видел это на Spring плюс JUnit Jupiter , но это не помогает в интеграционном тестировании.

1 Ответ

0 голосов
/ 06 июня 2018

Я сделал это с помощью этих плагинов в иерархической структуре:

Parent
|
 \pom.xml (Added tests plugins including maven-failsafe-plugin)
|
 \ application-startup
   |
    \ pom.xml (Added spring-boot-maven-plugin)

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

...