【问题标题】:gradle - How to start spring boot server before integarion test - so easy with mavengradle - 如何在集成测试之前启动 Spring Boot 服务器 - 使用 maven 很容易
【发布时间】:2020-04-27 08:10:50
【问题描述】:

我们正在从 maven 切换到 gradle。在 maven 中,我们使用 spring-boot-mvane-plugin 在“预集成测试”阶段启动 Spring Boot 服务器,如本文所述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 中分叉进程的方法。 gradle Spring Boot Plugin 也无济于事。

如何在 gradle 中实现这一点?

【问题讨论】:

标签: spring-boot maven gradle integration-testing


【解决方案1】:

我让它与 gradle-spawn-plugin 一起工作,但对我来说它看起来很复杂

后端/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)

前端/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 相关。可能是因为搜索“就绪”字符串。由于我们不会在生产环境中登录控制台,因此在集成测试时最好不要这样做。所以我禁用了日志记录到控制台,一切都恢复正常了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2013-04-08
    • 2015-10-03
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 2016-06-21
    相关资源
    最近更新 更多