如何将 Gatling 与现有的 Spring-Boot + Gradle 应用程序集成

Posted

技术标签:

【中文标题】如何将 Gatling 与现有的 Spring-Boot + Gradle 应用程序集成【英文标题】:How to Integrate Gatling with existing Spring-Boot + Gradle application 【发布时间】:2021-05-17 05:06:19 【问题描述】:

我正在尝试集成 Gatling 以执行自动化负载测试。但我得到了不同的错误。我需要有关此主题的帮助。

我正在使用JDK-11 版本

我的Controller类如下

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/health")
public class HealthController 

    private static final Logger LOGGER = LoggerFactory.getLogger(HealthController.class);
    
    @Autowired
    OptionRepository repository;
    
    @GetMapping("/id/options")
    public List<Health> findAllOptions(@PathVariable("id") Long id) 
        return (List<Health>) repository.findAll(id);
    
    
    @GetMapping("/id/valid/dates")
    public List<Health> findByDates(@PathVariable("id") Long id) 
        return repository.findDates(id);
    
    



@Data
class Health
    List<String> options;
    List<String> dates;

我的build.gradle如下

/* ========================
 * Build
 * ========================
 */
buildscript 
    ext 
        springBootVersion = '2.4.4.RELEASE'
    
    repositories 
        mavenCentral()
        maven 
            url "https://plugins.gradle.org/m2/"
        
        maven  url 'https://repo.spring.io/snapshot' 
        jcenter()
        
    
    dependencies 
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.4.4")
        classpath "io.spring.gradle:dependency-management-plugin:0.6.1.RELEASE"

    


/* ========================
 * Plugins
 * ========================
 */
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'jacoco'
apply plugin: 'scala'
apply plugin: 'java-library'

/* ========================
 * Project Info
 * ========================
 */
version = '1.0.0'

sourceCompatibility = 11
targetCompatibility = 11

defaultTasks 'bootRun'

tasks.withType(JavaCompile) 
    options.encoding = 'UTF-8'



/* ========================
 * Dependencies
 * =========================
 */
repositories 
    mavenCentral()
    maven  url 'https://repo.spring.io/snapshot'  


configurations 
    providedRuntime


dependencies 
    compileOnly 'org.projectlombok:lombok:1.18.16'
    annotationProcessor 'org.projectlombok:lombok:1.18.16'  
    testCompileOnly 'org.projectlombok:lombok:1.18.16'
    testAnnotationProcessor 'org.projectlombok:lombok:1.18.16'  
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-security')
    compile 'org.springframework.boot:spring-boot-starter-thymeleaf'    
    compile ('org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.4.4')
    compile('io.jsonwebtoken:jjwt:0.9.0')
    compile ('org.apache.commons:commons-csv:1.8')
    compile("org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.3")
    compile 'org.apache.commons:commons-lang3:3.6'
    compile 'org.apache.commons:commons-collections4:4.0'
    runtime('org.springframework.boot:spring-boot-devtools')
    providedRuntime('org.springframework.boot:spring-boot-starter-tomcat')
    runtimeOnly('org.postgresql:postgresql:42.2.19')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('com.github.javafaker:javafaker:0.15')
    implementation ('org.mybatis.spring.boot:mybatis-spring-boot-test-autoconfigure:1.2.2')
    implementation ('org.liquibase:liquibase-core:4.3.2')
    implementation ('org.springdoc:springdoc-openapi-maven-plugin:1.2')
    implementation ('org.springdoc:springdoc-openapi-ui:1.5.5')
    implementation ('com.microsoft.sqlserver:mssql-jdbc:9.2.1.jre8')    
    
    //Tried with this libraries
    //compile 'org.scala-lang:scala-library:2.10.1'
    //implementation ('net.alchim31.maven:scala-maven-plugin:4.5.1')
    //implementation ('io.gatling:gatling-maven-plugin:3.1.2')
    testCompile('io.gatling.highcharts:gatling-charts-highcharts:2.3.0')


/* ========================
 * Task Configuration
 * ========================
 */
test 
    finalizedBy jacocoTestReport // report is always generated after tests run
    filter 
        excludeTestsMatching "com.dev.*"
    


test.onlyIf  project.hasProperty('executeTests') 

jacoco 
    toolVersion = "0.8.6"


jacocoTestReport 
    reports 
        xml.enabled false
        csv.enabled false
        html.destination file("$buildDir/reports/jacoco")
    
    
    afterEvaluate 
        classDirectories.setFrom(files(classDirectories.files.collect 
            fileTree(dir: it,
                    exclude: ['**/domain/**'
                    ]
            )
        ))
    


apply plugin: 'jacoco'
jacocoTestCoverageVerification 
  violationRules 
    rule 
      limit 
        minimum = 0.9
      
    
    rule 
            enabled = false
            element = 'CLASS'
            includes = ['org.gradle.*']

            limit 
                counter = 'LINE'
                value = 'TOTALCOUNT'
                maximum = 0.3
            
        
  


/**
 * Gatling load tests
 */
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.classesDirs.toString()"
   ]
   main = "io.gatling.app.Gatling"
   args = [
           "--simulation", "com.dev.ApiGatlingSimulationTest",
           "--results-folder", "$buildDir/gatling-results",
           //"--binaries-folder", sourceSets.test.output.classesDirs.toString(),
           "--bodies-folder", sourceSets.test.resources.srcDirs.toList().first().toString() + "/gatling/bodies",
   ]


def logbackGatlingConfig() 
    return sourceSets.test.resources.find  it.name == 'logback-gatling.xml' 
 

bootJar  baseName = 'migroes-services' 

我的scala测试服如下

package com.dev
 
import io.gatling.core.scenario.Simulation
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import java.util.Date
import scala.concurrent.duration.FiniteDuration
import scala.concurrent.duration.Duration
import java.util.concurrent.TimeUnit

class ApiGatlingSimulationTest extends Simulation 

  val scn = scenario("Dev Status").repeat(1000, "n") 
        exec(
          http("Get All Options")
            .get("http://localhost:8080/health/dev-001/options")
            .check(status.is(200))
        ).pause(Duration.apply(5, TimeUnit.MILLISECONDS))    
  .repeat(1000, "n") 
        exec(
          http("Valid Dates")
            .get("http://localhost:8090/health/dev-002/valid/dates")
            .check(status.is(200))
        )   
  
  
  setUp(scn.inject(atOnceUsers(30))).maxDuration(FiniteDuration.apply(10, "minutes"))
  

目前我从命令行收到以下错误。 我首先通过 STS 运行应用程序,然后尝试触发 gradle loadTest 命令。

D:\dev-repo\migroes-services>gradle clean build

> Task :compileJava
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

> Task :compileTestJava
Note: D:\dev-repo\migroes-services\src\test\java\com\dev\services\TestUtils.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.8.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 1m 3s
8 actionable tasks: 8 executed
D:\dev-repo\migroes-services>gradle loadTest

> Task :loadTest
21:02:53.898 [GatlingSystem-akka.actor.default-dispatcher-2] INFO akka.event.slf4j.Slf4jLogger - Slf4jLogger started
Exception in thread "main" io.gatling.core.session.el.ElParserException: Failed to parse VIN with error 'class [B cannot be cast to class [C ([B and [C are in module java.base of loader 'bootstrap')'
        at io.gatling.core.session.el.ElCompiler.parseEl(ElCompiler.scala:249)
        at io.gatling.core.session.el.ElCompiler$.parse(ElCompiler.scala:171)
        at io.gatling.core.session.el.ElCompiler$.compile(ElCompiler.scala:174)
        at io.gatling.core.session.el.package$El$.el$extension(package.scala:26)
        at io.gatling.core.ValidationImplicits.stringToExpression(ValidationImplicits.scala:48)
        at io.gatling.core.ValidationImplicits.stringToExpression$(ValidationImplicits.scala:48)
        at io.gatling.core.Predef$.stringToExpression(Predef.scala:22)
        at com.dev.ApiGatlingSimulationTest.<init>(ApiGatlingSimulationTest.scala:15)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
        at java.base/java.lang.Class.newInstance(Class.java:584)
        at io.gatling.app.Runner.run0(Runner.scala:79)
        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)

> Task :loadTest FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':loadTest'.
> Process 'command 'C:\Program Files\Java\jdk-11.0.8\bin\java.exe'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.8.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 15s
6 actionable tasks: 1 executed, 5 up-to-date

我大部分时间都在错误以下。

线程 "main" io.gatling.core.session.el.E​​lParserException 中的异常:无法解析 VIN 并出现错误 'class [B cannot be cast to class [C ([B and [C are in module java.base加载程序'bootstrap')'

我尝试在不同的平台上接触到几个不同的博客和类似的情况。到目前为止没有运气!!

【问题讨论】:

【参考方案1】:
    testCompile('io.gatling.highcharts:gatling-charts-highcharts:2.3.0')

您正在尝试使用已死去多年的 Gatling 2。 请升级。目前最新版本为 3.5.1。

【讨论】:

嘿谢谢你,很抱歉很晚才回复你@Stephane 现在它对我有用。 太棒了!请注意,最新版本现在是 3.6.1 :) 哦,我去看看 BlackDuck 看看是否可行,感谢更新:)

以上是关于如何将 Gatling 与现有的 Spring-Boot + Gradle 应用程序集成的主要内容,如果未能解决你的问题,请参考以下文章

如何将 asyncio 与现有的阻塞库一起使用?

如何将 Entity Framework Code First 与现有的 MS Access (.accdb) 数据库一起使用?

iOS - 如何将 Firebase Analytics 与现有的 Google Analytics、GoogleService-Info.plist 集成

将 grunt 与现有的 wordpress 实例一起使用

我的 react js 代码如何与现有的 Obj-C 逻辑交互?

尝试将 LowDB 与现有的 db.json 集成