gatling 使用_使用Gatling + Gradle + Jenkins Pipeline为您的JAX-RS(和JavaEE)应用程序进行连续压力测试...

gatling 使用

在这篇文章中,我将解释如何使用Gatling项目为您的JAX-RS Java EE端点编写压力测试,以及如何将它们与GradleJenkins Pipeline集成,因此,除了进行简单的压力测试外,您还可以使用以下方法: 连续压力测试,其中每个提交可能会自动触发此类测试,并提供自动断言和每个执行的更重要的图形反馈,因此您可以监视应用程序中性能的变化。

首先要开发的是JAX-RS JavaEE服务:

@Path("/planet")
@Singleton
@Lock(LockType.READ)
public class PlanetResources {@InjectSwapiGateway swapiGateway;@InjectPlanetService planetService;@Inject@AverageFormatterDecimalFormat averageFormatter;@GET@Path("/orbital/average")@Produces(MediaType.TEXT_PLAIN)@Asynchronouspublic void calculateAverageOfOrbitalPeriod(@Suspended final AsyncResponse response) {// Timeout controlresponse.setTimeoutHandler(asyncResponse -> asyncResponse.resume(Response.status(Response.Status.SERVICE_UNAVAILABLE).entity("TIME OUT !").build()));response.setTimeout(30, TimeUnit.SECONDS);try {// SwapiGateway is an interface to swapi.co (Star Wars API)JsonObject planets = swapiGateway.getAllPlanets();final JsonArray results = planets.getJsonArray("results");// Make some calculations with the result retrieved from swapi.codouble average = planetService.calculateAverageOfOrbitalPeriod(results);final Response averageResponse = Response.ok(averageFormatter.format(average)).build();response.resume(averageResponse);} catch(Throwable e) {response.resume(e);}}
}

没什么特别的,这是一个异步的JAX-RS端点,它连接到swapi.co网站,检索“星球大战”行星的所有信息,计算出轨道周期的平均值,最后以文本形式返回。 为了简单起见,我不会向您展示所有其他类,但是它们非常简单,在文章结尾,我将为您提供github存储库。

该应用程序打包在war文件中,并部署到应用程序服务器中。 在这种情况下,将部署到官方Apache TomEE Docker映像内部署的Apache TomEE 7 。

下一步是使用Gatling依赖项配置Gradle构建脚本。 由于Gatling是用Scala编写的,因此您需要使用Scala插件。

apply plugin: 'java'
apply plugin: 'scala'def gatlingVersion = "2.1.7"dependencies {compile "org.scala-lang:scala-library:2.11.7"testCompile "io.gatling:gatling-app:${gatlingVersion}"testCompile "io.gatling.highcharts:gatling-charts-highcharts:${gatlingVersion}"
}

之后,是时候编写我们的第一个压力测试了。 重要的是要注意,为加特林编写压力测试正在使用提供的DSL编写Scala类。 即使对于从未看过Scala的人来说,如何使用它也非常直观。

因此,创建一个名为src / test / scala的目录,并创建一个具有下一个内容的名为AverageOrbitalPeriodSimulation.scala的新类:

package org.starwarsimport io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
import scala.util.Properties// Extends from Simulation
class AverageOrbitalPeriodSimulation extends Simulation {// Gets the base URL where our service is running from environment/system propertyval LOCATION_PROPERTY = "starwars_planets_url";val location = Properties.envOrElse(LOCATION_PROPERTY, Properties.propOrElse(LOCATION_PROPERTY, "http://localhost:8080/"))// configures the base URLval conf = http.baseURL(location)// defines the scenario to run, which in this case is a GET to endpoint defined in JAX-RS serviceval scn = scenario("calculate average orbital period").exec(http("get average orbital period").get("rest/planet/orbital/average")).pause(1)// instead of simulating 10 users at once, it adds gradullay the 10 users during 3 seconds// asserts that there is no failing requests and that at max each request takes less than 3 secondssetUp(scn.inject(rampUsers(10).over(3 seconds))).protocols(conf).assertions(global.successfulRequests.percent.is(100), global.responseTime.max.lessThan(3000))
}

每个模拟都必须扩展模拟对象。 此模拟从starwars_planets_url环境或系统属性获取服务的基本URL,它创建指向JAX-RS中定义的端点的方案,最后在3秒钟内它将逐渐添加用户,直到同时运行10个用户。 仅在所有请求在3秒内成功通过后,测试才能通过。

现在我们需要运行此测试。 您会注意到这不是JUnit测试,因此您无法执行Run As JUnit测试。 您需要做的是使用Gatling提供的可运行类,该类要求您将模拟类作为参数传递。 使用Gradle确实很容易做到。

task runLoadTest(type: JavaExec) {// before runnign the task we need to compile the testsdependsOn testClassesdescription = 'Stress Test Calculating Orbital Period'classpath = sourceSets.main.runtimeClasspath + sourceSets.test.runtimeClasspath// if starwars_planets_url is not provided we add the DOCKER_HOST one automaticallydef starwarsUrl;if (!System.env.containsKey('starwars_planets_url') && !System.properties.containsKey('starwars_planets_url')) {if (System.env.containsKey('DOCKER_HOST')) {starwarsUrl = System.env.DOCKER_HOST.replace("tcp", "http").replace("2376", "9090") + "/starwars/"} else {starwarsUrl = "http://localhost:8080/starwars/"}}jvmArgs = [ "-Dgatling.core.directory.binaries=${sourceSets.test.output.classesDir.toString()}" ]// Means that the url has been calculated here and we set itif (starwarsUrl != null) {environment["starwars_planets_url"] = starwarsUrl}// Gatling applicationmain = "io.gatling.app.Gatling"// Specify the simulation to run and outputargs = ["--simulation", "org.starwars.AverageOrbitalPeriodSimulation","--results-folder", "${buildDir}/reports/gatling-results","--binaries-folder", sourceSets.test.output.classesDir.toString(),"--output-name", "averageorbitalperiodsimulation","--bodies-folder", sourceSets.test.resources.srcDirs.toList().first().toString() + "/gatling/bodies",]
}// when running test task we want to execute the Gatling test
test.dependsOn runLoadTest

我们正在定义JavaExec类型的Gradle任务,因为我们想要的是运行一个可运行的类。 然后,通过自动检测是否未设置starwars_planets_url,将测试运行到已安装Docker的计算机上,因此我们可以使开发人员的工作更加轻松。

最后,如果需要,我们将覆盖环境变量,我们为可运行类设置必需的属性,并配置Gradle在每次执行测试任务(./gradlew test)时执行此任务。

如果运行它,您可能会看到来自Gatling的一些输出消息,以及所有类似如下的消息:请打开以下文件: /Users/…./stress-test/build/reports/gatlingresults / averageorbitalperiodsimulation-1459413095563 / index。 html ,这是您获取报告的地方。 请注意,在目录末尾附加了一个随机数,这很重要,因为稍后我们会看到。 该报告可能如下所示:

屏幕截图2016年3月31日在15.36.15

目前,我们已将GatlingGradle集成在一起,但是这里缺少一个片段,它在方程式上添加了连续部分。 为了添加连续的压力测试,我们将使用JenkinsJenkins Pipeline作为CI服务器,因此对于每个提交都执行压力测试   其他任务,例如编译,运行单元,集成测试或代码质量门。

过去, Jenkins作业是使用Web UI配置的,需要用户手动创建作业,填写作业的详细信息并通过Web浏览器创建管道。 同样,这使得保持作业的配置与正在构建的实际代码分离。

随着Jenkins Pipeline插件的引入。 该插件是Groovy DSL,可让您在文件中实施整个构建过程,并将其与代码一起存储。 Jenkins 2.0默认带有此插件,但是如果您使用的是Jenkins 1.X,则可以将其安装为其他任何插件( https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin )

因此,现在我们可以开始对发布插件进行编码了,但是出于本文的目的,仅涉及压力部分。 您需要在项目的根目录上创建一个名为Jenkinsfile的文件(名称不是强制性的,但实际上是名称),在本例中为下一个内容:

stage 'Compile And Unit Test'stage 'Code Quality'stage 'Integration Test'stage 'Acceptance Test'// defines an stage for info purposes
stage 'Stress Test'def dockerHost = '...'
//defines a node to run the stage
node {// get source code from location where Jenkinsfile (this) is located.// you could use stash/unstash to get sources from previous stages instead of getting from SCMcheckout scm// defines the environment variable for stress testwithEnv(["starwars_planets_url=http://${dockerHost}:9090/starwars/"]) {// executes shell scriptsh './gradlew test'}}

在这种情况下,我们定义了一个新阶段,称为压力测试。 阶段步骤仅用作参考,将用于记录目的。 接下来定义一个节点。 节点是执行代码的Jenkins执行程序。 在此节点内,从放置Jenkinsfile的同一位置检出源代码,设置一个新的环境变量以指出应用程序的部署位置,最后是执行Gradle测试任务的shell步骤。

Jenkins的最后一步是创建Pipeline类型的新作业,并设置Jenkinsfile的位置。 因此,转到“ 詹金斯”>“新项目”>“管道”,并为作业命名。

屏幕截图2016年3月31日在11.55.28

然后,您只需要转到“ 管道”部分,并配置用于存储项目的SCM存储库。

屏幕截图2016年3月31日在11.56.30

然后,如果您已经正确配置了来自Jenkins和SCM服务器的挂钩,那么将为每次提交执行此作业,因此您的压力测试将连续运行。

当然,您可能已经注意到压力测试已执行,但是Jenkins没有发布任何报告,因此您无法查看或比较不同执行的结果。 因此,您可以使用publishHtml插件将生成的报告存储在Jenkins中 。 如果尚未安装该插件,则需要与其他任何Jenkins插件一样安装。

PublishHtml插件使我们可以将构建工具生成的一些html文件发布到Jenkins,以便用户可以使用,也可以按内部版本号进行分类。 您需要配置要发布的文件目录的位置,在这里我们找到了第一个问题,您还记得盖特林生成带有随机数的目录吗? 因此,我们需要首先解决此问题。 您可以采用不同的策略,但是最简单的方法是在测试后将目录重命名为已知的静态名称。

打开Gradle构建文件并添加下一个内容。

task(renameGatlingDirectory) << {// find the directorydef report = {file -> file.isDirectory() && file.getName().startsWith('averageorbitalperiodsimulation')}def reportDirectory = new File("${buildDir}/reports/gatling-results").listFiles().toList().findAll(report).sort().last()// rename to a known directory// should always work because in CI it comes from a clean executionreportDirectory.renameTo("${buildDir}/reports/gatling-results/averageorbitalperiodsimulation")
}// it is run after test phase
test.finalizedBy renameGatlingDirectory

我们正在创建一个在测试任务结束时执行的新任务,该任务将最后创建的目录重命名为averageorbitalperiodsimulation

最后一步是在shell调用之后在Jenkinsfile下一个调用中添加:

publishHTML(target: [reportDir:'stress-test/build/reports/gatling-results/averageorbitalperiodsimulation', reportFiles: 'index.html', reportName: 'Gatling report', keepAll: true])

之后,您可能会在作业页面中看到一个指向报告的链接。

屏幕截图2016年3月31日在15.22.30

就是如此,多亏了GradleJenkins,您可以轻松地实施持续的压力测试策略,而只需使用所有开发人员都讲的语言代码即可。

我们不断学习,

亚历克斯

翻译自: https://www.javacodegeeks.com/2016/04/continuous-stress-testing-jax-rs-javaee-applications-gatling-gradle-jenkins-pipeline.html

gatling 使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java comparator_【面试题】Java必考面试题全集(15)

Java基础面试题(15)1&#xff1a;Comparator 与Comparable 有什么不同&#xff1f;2&#xff1a;Object中有哪些方法&#xff1f;3&#xff1a;说下jdk8中的一些新特性4&#xff1a;在64 位 JVM 中&#xff0c;int 的长度是多数&#xff1f;5&#xff1a;java每改一点都需要重新…

px是什么意思计算机二级,px是什么意思?照片中的px是什么的缩写?

px是什么意思?px(Pixel&#xff0c;像素)是可以在数字显示设备上显示和表示的数字图像或图形的最小单位。像素是数字图形中的基本逻辑单元。将像素组合在一起以在计算机显示器上形成完整的图像&#xff0c;视频&#xff0c;文本或任何可见的东西。像素也称为图像元素。若把影像…

java 交替_Java 8:使用交替接口公开的类型安全地图生成器

java 交替动态展示您的课程 当我还是Java新手时&#xff0c;我记得当时以为应该有一种方法可以删除或隐藏我不想公开的类中的方法。 就像用private方法或类似方法覆盖public方法一样&#xff08;哪种情况是不可能的&#xff0c;也不应该是不可能的&#xff09;。 显然&#xff…

ieee期刊_论文绘图神器来了:一行代码绘制不同期刊格式图表,哈佛博士后开源...

贾浩楠 发自 凹非寺量子位 报道 | 公众号 QbitAI「一篇论文投多个期刊&#xff0c;每个期刊对图表格式要求不一&#xff0c;同一组数据要用多种工具分别绘图。」不光是你&#xff0c;哈佛大学天文研究所的博士后&#xff0c;也不堪忍受论文重复绘图之苦。他的解决办法是&#x…

微课与计算机技术的论文,微课在高校计算机教学的运用论文

微课在高校计算机教学的运用论文摘要&#xff1a;现代信息社会不断发展进步&#xff0c;高校计算机教学也面临着复杂的形势&#xff0c;为全面提高计算机教学质量&#xff0c;提升学生的专业素质及综合能力&#xff0c;应当微课加以科学化应用。本文基于微课的内涵及应用意义出…

spring 启动加载数据_12个很棒的Spring数据教程来启动您的数据项目

spring 启动加载数据Spring Data的任务是为数据访问提供一个熟悉且一致的&#xff0c;基于Spring的编程模型&#xff0c;同时仍保留基础数据存储的特​​殊特征。 它使使用数据访问技术&#xff0c;关系和非关系数据库&#xff0c;map-reduce框架以及基于云的数据服务变得容易…

concurrenthashmap_ConcurrentHashMap是如何保证线程安全的

文章已同步发表于微信公众号JasonGaoH&#xff0c;ConcurrentHashMap是如何保证线程安全的之前分析过HashMap的一些实现细节&#xff0c;关于HashMap你需要知道的一些细节, 今天我们从源码角度来看看ConcurrentHashMap是如何实现线程安全的&#xff0c;其实网上这类文章分析特别…

【OpenGL从入门到精通(三)】第一个点的理论

OpenGL状态机 一&#xff0c;OpenGL是一个状态机matrix中包括&#xff1a; model view (模型矩阵) worldpos(世界坐标,也称为顶点坐标)通过mv(模型矩阵)转到cameru摄像机下&#xff08;根据右手坐标系&#xff0c;只有在Z的负方向才可以看得见&#xff09; projection …

js find的用法_React常用库Immutable.js常用API

JavaScript 中的对象一般是可变的(Mutable)&#xff0c;因为使用了引用赋值&#xff0c;新的对象简单的引用了原始对象&#xff0c;改变新的对象将影响到原始对象。如 foo{a: 1}; barfoo; bar.a2 你会发现此时 foo.a 也被改成了 2。虽然这样做可以节约内存&#xff0c;但当应用…

教学案例 计算机,计算机教学案例

海量优秀的免费计算机教学案例范文供您参考与下载&#xff0c;关于计算机教学案例的免费论文范文参考资料是由2016年最新的相关论文题目按照标准论文格式模板写作的,适合不知道怎么写计算机教学案例的大学毕业生,对相关的本科论文和硕士毕业论文及职称论文发表写作有参考价值&a…

java 开发:md5_Java社区调查结果:74%的开发人员希望减少详细程度

java 开发:md5一个新的JDK增强建议&#xff08;JEP&#xff09;在Java社区中风起云涌&#xff1a;JEP286。该建议建议在Java的未来版本中引入局部变量类型推断&#xff0c;以简化Java应用程序的编写。 在下面的文章中&#xff0c;我们将解释它的含义以及它将如何影响您的代码。…

python获取当前目录_又有几个Python小技巧分享

今天这篇文章为大家带来几个Python使用的小技巧&#xff1a;快速生成依赖文件文件路径处理通过set将对象去重单元测试unitest捕获异常快速生成依赖文件Python通过requirements.txt来管理项目所依赖的库&#xff0c;通过pip install -r requirements.txt命令可以直接安装项目所需…

python敏感字替换_python用类实现文章敏感词的过滤方法示例

过滤一遍并将敏感词替换之后剩余字符串中新组成了敏感词语,这种情况就要用递归来解决&#xff0c;直到过滤替换之后的结果和过滤之前一样时才算结束 第一步:建立一个敏感词库(.txt文本)第二步:编写代码在文章中过滤敏感词(递归实现) # -*- coding: utf-8 -*- # author 代序春秋…

2018年冷链百强_在分析了47,251个依赖关系之后,2016年Java图书馆百强

2018年冷链百强谁在上面&#xff0c;谁在后面&#xff1f; 我们分析了Github上的47,251个依赖关系&#xff0c;并抽取了前100个Java库 对于长周末而言&#xff0c;我们最喜欢的消遣是浏览Github并搜索流行的Java库。 我们决定与您分享乐趣和信息。 我们分析了Github上前3,862…

计算机键盘标注,电脑键盘上怎么打√和×

用电脑键盘上打出√和两个符号的方法1、在输入法开启状态下&#xff0c;鼠标右键点击输入法状态栏上面的“软键盘图标”&#xff0c;然后选择“数学符号”(直接右击打不开就先左击再右击)。2、在数学符号的软键盘面板上直接用鼠标点击“√和”就好(光标要定位在需要输入的地方)…

web服务优化与健壮性改进_创建健壮的微服务架构所涉及的组件

web服务优化与健壮性改进在本文中&#xff0c;我们将简要学习构建强大的微服务应用程序所需的各种软件组件。 在简要了解每个架构组件之前&#xff0c;我们将陈述设计微服务架构时出现的一般查询。 1.微服务架构组件 每当我们创建微服务应用程序时&#xff0c;我们都会想到以下…

owin 怎么部署在云中_使用Boxfuse轻松在云中运行Spring Boot应用程序

owin 怎么部署在云中几天前&#xff0c;我开始构建一个将使用REST API检索和存储数据的iOS应用。 该REST API将是我也必须构建的服务器应用程序。 由于我熟悉Java和Spring &#xff0c;因此决定使用Spring Boot作为框架。 为了能够在我的iPhone上使用它&#xff0c;如果我可以在…

用python画时序图源代码_使用python实现画AR模型时序图

背景&#xff1a; 用python画AR模型的时序图。 结果&#xff1a;代码&#xff1a; import numpy as np import matplotlib.pyplot as plt """ AR(1)的时序图&#xff1a;x[t]a*x[t-1]e """ num 2000 e np.random.rand(num) x np.empty(num) &…

python模块使用_一文让你学会所有的python模块使用

部分高等技能:为了削减一个编译模块的大年夜小&#xff0c;你可以在 Python 敕令行中应用 -O 或者 -OO。-O 参数删除了断言语句&#xff0c;-OO 参数删除了断言语句和 __doc__ 字符串。 因为某些法度榜样依附于这些变量的可用性&#xff0c;你应当只在肯定无误的场合应用这一选…

rest web服务_在WildFly的REST Web服务中与Jackson的双向关系

rest web服务这是使用Jackson的REST Web服务中Java实体之间的双向关系的示例。 假设我们在两个实体Parent和Child之间存在双向关系。 使用MySQL工作台为这两个表生成SQL模式文件。 DROP SCHEMA IF EXISTS bidirectional_schema ; CREATE SCHEMA IF NOT EXISTS bidirectional…