gradle - Как запустить весенний загрузочный сервер перед тестом integarion - так просто с maven - PullRequest
0 голосов
/ 27 апреля 2020

Мы переключаемся с maven на gradle. В maven мы запускаем сервер Spring Boot в фазе «pre-интеграционный тест» с использованием плагина spring-boot-mvane-plugin, как описано здесь https://docs.spring.io/spring-boot/docs/current/maven-plugin/usage.html

   <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <executable>true</executable>
            </configuration>
            <executions>
                <execution>
                    <id>pre-integration-test</id>
                    <goals>
                        <goal>start</goal>
                    </goals>
                </execution>
                <execution>
                    <id>post-integration-test</id>
                    <goals>
                        <goal>stop</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>com.github.eirslett</groupId>
            <artifactId>frontend-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>run e2e tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>npm</goal>
                    </goals>
                    <configuration>
                        <arguments>run verify</arguments>
                    </configuration>
                </execution>
            </executions>
        </plugin>

Я не нашел способа раскрутить процесс в Gradle. Плагин Spring Boot для Gradle тоже не помогает.

Как мне добиться этого в Gradle?

1 Ответ

0 голосов
/ 27 апреля 2020

Я получил его работать с Gradle-Spawn-плагином, но он выглядит очень сложным для меня

backend / build.gradle

plugins {
    id "com.wiredforcode.spawn" version "0.8.2"
}
task startServer(type: SpawnProcessTask, dependsOn: 'bootJar') {
    command "java -jar ${projectDir}/build/libs/project-${version}.jar --spring.profiles.active=integration"
    ready 'Started'
}
task stopServer(type: KillProcessTask)

frontend / build.gradle

task verify(dependsOn: ':backend:startServer', type: NpmTask) {
    // Copy from 'dist'
    inputs.files(fileTree('tests/e2e'))
    dependsOn 'npmBuild'
    args = ['run', 'verify']
}
check.dependsOn verify
verify.finalizedBy ':backend:stopServer'

Но обратите внимание на некоторые странности: если вы входите в консоль, у вас возникают проблемы. Сначала все выглядит хорошо. Но после нескольких минут тестирования регистрация больше не работает.

Многие потоки блокируются следующим образом:

"http-nio-127.0.0.1-8082-exec-2" #27 daemon prio=5 os_prio=0 cpu=462,00ms elapsed=531,88s tid=0x00007f1442a32000 nid=0x76d5 waiting on condition  [0x00007f136f021000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.7/Native Method)
        - parking to wait for  <0x0000000454d81218> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.7/LockSupport.java:194)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(java.base@11.0.7/AbstractQueuedSynchronizer.java:885)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(java.base@11.0.7/AbstractQueuedSynchronizer.java:917)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.base@11.0.7/AbstractQueuedSynchronizer.java:1240)
        at java.util.concurrent.locks.ReentrantLock.lock(java.base@11.0.7/ReentrantLock.java:267)
        at ch.qos.logback.core.OutputStreamAppender.writeBytes(OutputStreamAppender.java:197)
        at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:231)
        at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:102)
        at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84)
        at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)
        at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270)
        at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257)
        at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421)
        at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
        at ch.qos.logback.classic.Logger.info(Logger.java:579)

Я не знаю точно, почему, но мне кажется, что gradle-spawn-plugin что-то делает с STDOUT. Возможно из-за поиска «готовой» строки. И поскольку мы не ведем журнал на консоли в производственной среде, лучше не делать этого при интеграционном тестировании. Поэтому я отключил запись в консоль, и все снова работает нормально.

...