Гатлинг не работает с SpringBoot 2.0.1.RELEASE - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь настроить Гатлинг с Spring Boot 2.0.1.RELEASE .

Я создал этот API:

@RestController
@RequestMapping("/contact")
public class ContactController {

    @GetMapping
    public ResponseEntity get() {
        return ResponseEntity.ok("Contact retrieved successfully");
    }
}

А это базовая симуляция:

import io.gatling.core.Predef._
import io.gatling.http.Predef._

class ContactSimulation extends Simulation {

  val httpConf = http.baseURL("http://localhost:8080")

  val scn = scenario("GetContact")
    .exec(
      http("GetContact")
        .get("/contact")
        .check(status.is(200))
    )

  setUp(scn.inject(atOnceUsers(1))).protocols(httpConf)
}

build.gradle настроен следующим образом:

buildscript {
    ext {
        springBootVersion = '2.0.1.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'scala'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

group = 'com.gatling.poc'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('io.gatling.highcharts:gatling-charts-highcharts:2.3.0')
}

task loadTest(type: JavaExec) {
    dependsOn testClasses
    description = "Load Test With Gatling"
    group = "Load Test"
    classpath = sourceSets.test.runtimeClasspath
    jvmArgs = [
            "-Dgatling.core.directory.binaries=${sourceSets.test.output.classesDir.toString()}"
    ]
    main = "io.gatling.app.Gatling"
    args = [
            "--simulation", "com.gatling.poc.simulations.ContactSimulation",
            "--results-folder", "${buildDir}/gatling-results",
            "--binaries-folder", sourceSets.test.output.classesDir.toString(),
            "--bodies-folder", sourceSets.test.resources.srcDirs.toList().first().toString() + "/gatling/bodies",
    ]
}

При выполнении тестов:

./gradlew loadTest

Я получаю следующую трассировку стека:

21:00:12.804 [main] WARN io.netty.util.concurrent.DefaultPromise - An exception was thrown by org.asynchttpclient.netty.request.NettyRequestSender$1.operationComplete()
java.lang.NoSuchMethodError: io.netty.channel.DefaultChannelId.newInstance()Lio/netty/channel/DefaultChannelId;
        at io.netty.channel.AbstractChannel.newId(AbstractChannel.java:111)
        at io.netty.channel.AbstractChannel.<init>(AbstractChannel.java:83)
        at io.netty.bootstrap.FailedChannel.<init>(FailedChannel.java:33)
        at io.netty.bootstrap.AbstractBootstrap.initAndRegister(AbstractBootstrap.java:330)
        at io.netty.bootstrap.Bootstrap.doResolveAndConnect(Bootstrap.java:163)
        at io.netty.bootstrap.Bootstrap.connect(Bootstrap.java:156)
        at org.asynchttpclient.netty.request.NettyChannelConnector.connect0(NettyChannelConnector.java:81)
        at org.asynchttpclient.netty.request.NettyChannelConnector.connect(NettyChannelConnector.java:69)
        at org.asynchttpclient.netty.request.NettyRequestSender$1.onSuccess(NettyRequestSender.java:292)
        at org.asynchttpclient.netty.request.NettyRequestSender$1.onSuccess(NettyRequestSender.java:285)
        at org.asynchttpclient.netty.SimpleFutureListener.operationComplete(SimpleFutureListener.java:24)
        at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:511)
        at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:485)
        at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:424)
        at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:162)
        at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:33)
        at org.asynchttpclient.netty.request.NettyRequestSender.sendRequestWithNewChannel(NettyRequestSender.java:285)
        at org.asynchttpclient.netty.request.NettyRequestSender.sendRequestWithCertainForceConnect(NettyRequestSender.java:136)
        at org.asynchttpclient.netty.request.NettyRequestSender.sendRequest(NettyRequestSender.java:107)
        at org.asynchttpclient.DefaultAsyncHttpClient.execute(DefaultAsyncHttpClient.java:216)
        at org.asynchttpclient.DefaultAsyncHttpClient.executeRequest(DefaultAsyncHttpClient.java:184)
        at org.asynchttpclient.DefaultAsyncHttpClient.executeRequest(DefaultAsyncHttpClient.java:206)
        at io.gatling.http.ahc.HttpEngine.warmpUp(HttpEngine.scala:96)
        at io.gatling.http.protocol.HttpProtocol$$anon$1.$anonfun$newComponents$1(HttpProtocol.scala:62)
        at io.gatling.core.protocol.ProtocolComponentsRegistry.comps$1(Protocol.scala:67)
        at io.gatling.core.protocol.ProtocolComponentsRegistry.$anonfun$components$4(Protocol.scala:69)
        at scala.collection.mutable.HashMap.getOrElseUpdate(HashMap.scala:82)
        at io.gatling.core.protocol.ProtocolComponentsRegistry.components(Protocol.scala:69)
        at io.gatling.http.action.HttpActionBuilder.lookUpHttpComponents(HttpActionBuilder.scala:25)
        at io.gatling.http.action.sync.HttpRequestActionBuilder.build(HttpRequestActionBuilder.scala:33)
        at io.gatling.core.structure.StructureBuilder.$anonfun$build$1(StructureBuilder.scala:34)
        at scala.collection.LinearSeqOptimized.foldLeft(LinearSeqOptimized.scala:122)
        at scala.collection.LinearSeqOptimized.foldLeft$(LinearSeqOptimized.scala:118)
        at scala.collection.immutable.List.foldLeft(List.scala:86)
        at io.gatling.core.structure.StructureBuilder.build(StructureBuilder.scala:33)
        at io.gatling.core.structure.StructureBuilder.build$(StructureBuilder.scala:32)
        at io.gatling.core.structure.ScenarioBuilder.build(ScenarioBuilder.scala:38)
        at io.gatling.core.structure.PopulationBuilder.build(ScenarioBuilder.scala:98)
        at io.gatling.core.scenario.SimulationParams.$anonfun$scenarios$1(Simulation.scala:188)
        at scala.collection.immutable.List.map(List.scala:283)
        at io.gatling.core.scenario.SimulationParams.scenarios(Simulation.scala:188)
        at io.gatling.app.Runner.run0(Runner.scala:95)
        at io.gatling.app.Runner.run(Runner.scala:64)
        at io.gatling.app.Gatling$.start(Gatling.scala:59)
        at io.gatling.app.Gatling$.fromArgs(Gatling.scala:43)
        at io.gatling.app.Gatling$.main(Gatling.scala:35)
        at io.gatling.app.Gatling.main(Gatling.scala)

Если я создаю тот же проект, используя SpringBoot 1.5.12.RELEASE , он работает отлично. Я подозреваю, что spring-boot-gradle-plugin , поскольку он меняется в зависимости от версии SpringBoot.

При необходимости я могу создать проект в github, чтобы продемонстрировать проблему. =)

Буду признателен, если кто-нибудь сможет мне помочь!

1 Ответ

0 голосов
/ 09 мая 2018

Я получил исправить эту проблему.

Проблема была в версии io.netty группы, используемой SpringBoot 2.0.1.RELEASE .Он использует версию 4.1.23.Final , которая по какой-то причине (возможно, некоторое изменение в scala) не выполняет тесты Гатлинга.

Я выполнил понижение, чтобы использовать ту же версию, что и SpringBoot 1.5.12.RELEASE , то есть 4.0.51.Final .Мне пришлось добавить эту конфигурацию в build.gradle :

{
// This build.gradle is the same that I posted above. For the sake of simplicity I just put the configuration that has been necessary to solve the problem.

// After dependencies{} section, I had to put this:

configurations.all {
    resolutionStrategy {
        eachDependency { DependencyResolveDetails details ->
            if (details.requested.group == 'io.netty') {
                details.useVersion "4.0.51.Final"
            }
        }
    }
}
}

Не думаю, что это лучшее решение, так как я возвращаю версию io.netty для использования более старойверсия, которая может иметь некоторый побочный эффект.В моем случае у меня не было возможности понизить версию SpringBoot.Если у вас есть возможность вернуть версию SpringBoot, я бы порекомендовал это сделать.

...