精华内容
下载资源
问答
  • Software Performance Testing - Gatling测试脚本编写
    2020-08-09 19:13:58

    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net

    脚本示例

    import io.gatling.core.Predef._
    import io.gatling.http.Predef._
    import scala.concurrent.duration._
    
    class BaiduSimulation extends Simulation {
      // 设置请求的根路径
      val httpConf = http.baseURL("https://www.baidu.com")
    
      // 运行100秒 during 默认单位秒,如果要用微秒 during(100 millisecond)
      val scn = scenario("BaiduSimulation").during(100){
        exec(http("baidu_home").get("/"))
      }
    
      // 设置线程数
      setUp(scn.inject(atOnceUsers(10)).protocols(httpConf))
    }

    脚本编写

    Gatling脚本的编写主要包含下面三个步骤:

    • HTTP Head配置
    • Scenario执行细节
    • setUp组装

    这里以百度为例,进行第一个GET请求测试脚本的编写,类必须继承自Simulation。

    1、配置下head,只是简单的请求下百度首页,所以只定义下请求的base url,采用默认的http配置即可

    // 设置请求的根路径
    val httpConf = http.baseURL("https://www.baidu.com")

    2、声明Scenario,指定请求动作

    val scn = scenario("BaiduSimulation").exec(http("baidu_home").get("/"))

    scenario里的参数:scenario name
    exec()里的参数就是我们的执行动作,http(“本次请求的名称”).get(“本次http get请求的地址”)

    3、设置并发数并组装

    // 设置线程数
    setUp(scn.inject(atOnceUsers(10)).protocols(httpConf))

    atOnceUsers:立马启动的用户数,可以理解为并发数

    这样我们一个简单的脚本就完成了。

    高级教程

    Injection – 注入

    注入方法用来定义虚拟用户的操作

    setUp(
      scn.inject(
        nothingFor(4 seconds), // 1
        atOnceUsers(10), // 2
        rampUsers(10) over(5 seconds), // 3
        constantUsersPerSec(20) during(15 seconds), // 4
        constantUsersPerSec(20) during(15 seconds) randomized, // 5
        rampUsersPerSec(10) to 20 during(10 minutes), // 6
        rampUsersPerSec(10) to 20 during(10 minutes) randomized, // 7
        splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds), // 8
        splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy atOnceUsers(30), // 9
        heavisideUsers(1000) over(20 seconds) // 10
      ).protocols(httpConf)
    )

    nothingFor(duration):设置一段停止的时间

    1. atOnceUsers(nbUsers):立即注入一定数量的虚拟用户

    2. rampUsers(nbUsers) over(duration):在指定时间内,设置一定数量逐步注入的虚拟用户

    3. constantUsersPerSec(rate) during(duration):定义一个在每秒钟恒定的并发用户数,持续指定的时间

    4. constantUsersPerSec(rate) during(duration) randomized:定义一个在每秒钟围绕指定并发数随机增减的并发,持续指定时间

    5. rampUsersPerSec(rate1) to (rate2) during(duration):定义一个并发数区间,运行指定时间,并发增长的周期是一个规律的值

    6. rampUsersPerSec(rate1) to(rate2) during(duration) randomized:定义一个并发数区间,运行指定时间,并发增长的周期是一个随机的值

    7. heavisideUsers(nbUsers) over(duration):定义一个持续的并发,围绕和海维赛德函数平滑逼近的增长量,持续指定时间(译者解释下海维赛德函数,H(x)当x>0时返回1,x<0时返回0,x=0时返回0.5。实际操作时,并发数是一个成平滑抛物线形的曲线)

    8. splitUsers(nbUsers) into(injectionStep) separatedBy(duration):定义一个周期,执行injectionStep里面的注入,将nbUsers的请求平均分配

    9. splitUsers(nbUsers) into(injectionStep1) separatedBy(injectionStep2):使用injectionStep2的注入作为周期,分隔injectionStep1的注入,直到用户数达到nbUsers

    循环

     可以使用以下两种方式:

    1、repeat

    /*
    repeat(times,counterName)
    times:循环次数
    counterName:计数器名称,可选参数,可以用来当当前循环下标值使用,从0开始
    */
    val scn = scenario("BaiduSimulation").repeat(100){
        exec(http("baidu_home").get("/"))
    }

    2、during

    /*
    during(duration, counterName, exitASAP)
    duration:时长,默认单位秒,可以加单位milliseconds,表示毫秒
    counterName:计数器名称,可选。很少使用
    exitASAP:默认为true,简单的可以认为当这个为false的时候循环直接跳出,可在
    循环中进行控制是否继续
    */
    // 运行100秒,during默认单位为秒,如果要用微秒使用during(100 millisecond)
    val scn = scenario("BaiduSimulation").during(100){
        exec(http("baidu_home").get("/"))
    }

    POST请求

    JSON方式

    import io.gatling.core.Predef._
    import io.gatling.core.scenario.Simulation
    import io.gatling.http.Predef._
    
    class JsonSimulation extends Simulation {
    val httpConf = http.baseURL("http://127.0.0.1:7001/tst")
    
    // 注意这里,设置提交内容type
    val headers_json = Map("Content-Type" -> "application/json")
    val scn = scenario("json scenario")
        .exec(http("test_json") //http请求name
        .post("/order/get") //post url
        .headers(headers_json) //设置body数据格式
        //将json参数用StringBody包起,并作为参数传递给function body()
        .body(StringBody("{\"orderNo\":201519828113}")))
    setUp(scn.inject(atOnceUsers(10))).protocols(httpConf)
    }

    Form方式

    import io.gatling.core.Predef._
    import io.gatling.http.Predef._
    
    class FormSimulation extends Simulation {
    val httpConf = http.baseURL("http://computer-database.gatling.io")
    
    // 注意这里,设置提交内容type
    val contentType = Map("Content-Type" -> "application/x-www-form-urlencoded")
    
    // 声明scenario
    val scn = scenario("form Scenario")
        .exec(http("form_test") //http请求name
        .post("/computers") //post地址,真正发起的地址会拼上上面的baseUrl http://computer-database.gatling.io/computers
        .headers(contentType)
        .formParam("name", "Beautiful Computer") //form表单的property name = name, value=Beautiful Computer
        .formParam("introduced", "2012-05-30")
        .formParam("discontinued", "")
        .formParam("company", "37"))
    setUp(scn.inject(atOnceUsers(1)).protocols(httpConf))
    }

    RawFileBody

    import io.gatling.core.Predef._
    import io.gatling.core.scenario.Simulation
    import io.gatling.http.Predef._
    
    class JsonSimulation extends Simulation {
    val httpConf = http.baseURL("http://127.0.0.1:7001/tst")
    
    // 注意这里,设置提交内容type
    val headers_json = Map("Content-Type" -> "application/json")
    val scn = scenario("json scenario")
        .exec(http("test_json") //http请求name
        .post("/order/get") //post url
        .headers(headers_json) //设置body数据格式
        //将json参数用StringBody包起,并作为参数传递给function body()
        .body(RawFileBody("request.txt"))
    setUp(scn.inject(atOnceUsers(10))).protocols(httpConf)
    }

    txt的文件内容为JSON数据,存放在目录/resources/bodies下。

    Feed动态参数

    Gatling对参数的处理称为Feeder【供料器】,支持主要有:

    数组

    val feeder = Array(
    Map("foo" -> "foo1", "bar" -> "bar1"),
    Map("foo" -> "foo2", "bar" -> "bar2"),
    Map("foo" -> "foo3", "bar" -> "bar3"))

    CSV文件

    val csvFeeder = csv("foo.csv") //文件路径在 %Gatling_Home%/user-files/data/ 下

    JSON文件

    val jsonFileFeeder = jsonFile("foo.json")
    // json的形式:
    [
    {
        "id":19434,
        "foo":1
    },
    {
        "id":19435,
        "foo":2
    }
    ]

    JDBC数据

    jdbcFeeder("databaseUrl", "username", "password", "SELECT * FROM users")

    Redis

    可参看官方文档http://gatling.io/docs/2.1.7/session/feeder.html#feeder

    使用示例:

    import io.gatling.core.Predef._
    import io.gatling.core.scenario.Simulation
    import io.gatling.http.Predef._
    import scala.concurrent.duration._
    
    /**
    * region请求接口测试
    */
    class DynamicTest extends Simulation {
    val httpConf = http.baseURL("http://127.0.0.1:7001/test")
    // 地区feeder
    val regionFeeder = csv("region.csv").random
    // 数组形式
    val mapTypeFeeder = Array(
        Map("type" -> ""),
        Map("type" -> "id_to_name"),
        Map("type" -> "name_to_id")).random
    // 设置请求地址
    val regionRequest =
        exec(http("region_map").get("/region/map/get"))
        // 加载mapType feeder
        .feed(mapTypeFeeder)
        // 执行请求,feeder里key=type,在下面可以直接使用${type}
        .exec(http("province_map").get("/region/provinces?mType=${type}"))
        // 加载地区feeder
        .feed(regionFeeder)
        // region.csv里title含有provinceId和cityId,所以请求中直接引用${cityId}/${provinceId}
        .exec(http("county_map").get("/region/countties/map?mType=${type}&cityId=${cityId}&provinceId=${provinceId}"))
    
    // 声明scenario name = dynamic_test
    val scn = scenario("dynamic_test")
            .exec(during(180){ regionRequest
            })
    // 在2秒内平滑启动150个线程(这里线程数需要评估)
    setUp(scn.inject(rampUsers(150) over (2 seconds)).protocols(httpConf))
    }

    注意:通过下面的代码只会第一次调用生成一个随机数,后面调用不变。

    exec(http("Random id browse")
            .get("/articles/" + scala.util.Random.nextInt(100))
            .check(status.is(200))

    Gatling的官方文档解释是:由于DSL会预编译,在整个执行过程中是静态的。因此Random在运行过程中就已经静态化了,不会再执行。应改为使用Feeder实现,Feeder是Gatling用于实现注入动态参数或变量的。

    val randomIdFeeder =
        Iterator.continually(Map("id" ->
            (scala.util.Random.nextInt(100))))
    
    feed(randomIdFeeder)
        .exec(http("Random id browse")
            .get("/articles/${id}"))
            .check(status.is(200))

    feed()在每次执行时都会从Iterator[Map[String, T]]对象中取出一个值,这样才能实现动态参数的需求。

    更多相关内容
  • 关于加特林报告 ... 加特林报告的例子 ... :紧凑的工作台响应时间表示,有... java -jar path/to/gatling-report-VERSION-capsule-fat.jar -h 输出CSV统计信息 以下命令将向stdout输出CSV,其中包含每个请求的统计信息。 j
  • Gatling 快速入门,功能强大的负载测试工具 李耀龙 - 这是为需要快速入门 Gatling 的人提供的简要指南。 有关更多详细信息,请访问。 1.什么是加特林 **** **** 是一个基于 Scala、Akka 和 Netty 的开源负载测试...
  • Gatling

    2021-03-27 11:09:52
    Gatling
  • gatling-charts-highcharts-bundle-3.3.1-bundle,很好用的测试工具,有一定的学习成本。
  • gatling-gradle-plugin:Gradle的Gatling插件
  • gatling 3.1.2

    2019-06-02 15:52:02
    性能测试工具gatling2.1.7, 官网下载太慢,上传到csdn,方便下载,供大家使用
  • 1.gatling和其他压力工具相比有个好处是放在同一内网环境下linux服务器上,这样避免其他压力使用办公机使用共有网络,网络情况对压力测试的影响。 2 生成比较详细的压力测试报告。 3 能够更灵活的编写压力脚本。 ...
  • gatling 3.0.2

    2019-01-14 14:41:56
    gatling 3.0.2
  • gatling3.0.0

    2018-10-11 17:51:09
    性能测试工具gatling3.0.0, 官网下载太慢,上传到csdn,方便下载,供大家使用
  • 负载测试 使用加特林(Gatling)和蝗虫(Locust)进行负载测试
  • Gatling初识.pdf

    2019-11-04 19:28:25
    参数化 用于性能测试脚本编写 提供参数化新方案 通过调用自己的java工具类 实现参数化 同时也可以实现参座数据库 链接外部操作等
  • Gatling程序

    2017-11-14 14:15:19
    Gatling是一个高性能,简洁强大的DSL API,支持命令行运行,支持Jenkins,以便于持续集成
  • Gatling是一款基于Scala 开发的高性能服务器性能测试工具,它主要用于对服务器进行负载等测试,并分析和测量服务器的各种性能指标。Gatling主要用于测量基于HTTP的服务器,比如Web应用程序,RESTful服务等,除此之外...
  • Gatling的非官方Dubbo压测插件,基于Gatling 2.3.1。
  • Wicket-Gatling 集成 仅使用开箱即用的 Gatling 时,使用 Gatling 框架对基于 Wicket 的 Web 应用程序进行负载测试并不容易。 这是因为每次请求页面时,有状态 Wicket 页面都会重写 URI,以保持页面的正确状态。 ...
  • Gatling是一款功能强大的负载测试工具。它的设计易于使用,可维护性和高性能。开箱即用,Gatling提供了对HTTP协议的出色支持,使其成为负载测试HTTP服务器的首选工具。
  • gatling_magento2 Magento 2 的 Gatling 压力/性能测试。 地位 这是一项正在进行的工作。 目前只实现了以客人身份结账。 目前针对 Gatling 2.1.2 构建,但可能会在 2.1.x 和更新版本中正常工作(取决于较新的 ...
  • 文章目录Gatling 介绍Gatling 下载Gatling 目录结构Gatling 脚本Gatling 快速执行总结 Gatling 介绍 Gatling 是一款基于 Scala 开发的高性能服务器性能测试工具,它主要用于对服务器进行负载等测试,并分析和测量...

    一、介绍

    Gatling 是一款基于 Scala 开发的高性能服务器性能测试工具,它主要用于对服务器进行负载等测试,并分析和测量服务器的各种性能指标。

    它拥有以下特点:

    • 支持 Akka Actors 和 Async IO,从而能达到很高的性能;
    • 支持实时生成Html动态轻量报表,从而使报表更易阅读和进行数据分析;
    • 支持DSL脚本,从而使测试脚本更易开发与维护;
    • 支持录制并生成测试脚本,从而可以方便的生成测试脚本;
    • 支持导入HAR(Http Archive)并生成测试脚本;
    • 支持 Maven,Eclipse,IntelliJ 等,以便于开发;
    • 支持Jenkins,以便于进行持续集成;
    • 支持插件,从而可以扩展其功能,比如可以扩展对其他协议的支持;
    • 开源免费,开箱即用。

    二、 下载

    下载地址:https://Gatling.io/open-source/start-testing/

    三、目录结构

    安装结构如下:
    在这里插入图片描述

    • bin :目录下有2个脚本,Gatling 和 recorder, Gatling 用来运行测试;

    • conf:Gatling自身的一些配置;

    • lib:Gatling自身依赖的库文件;

    • results:存放测试报告

    • target:你启动运行组件后,Gatling 会为你编译好所有的 .scala 脚本,而编译后的 class 文件就会在这里

    • user-files: 脚本存放位置 user-files/simulations ,默认下载好的包会有几个官方的示例测试 Demo

    四、脚本

    当运行 gating 脚本的时候,其会扫描 user-files 目录下的所有文件,列出其中所有的 Simulation(一个测试类,里面可以包含任意多个测试场景)。

    选择其中一个 Simulation,然后填写 Simulation ID 和运行描述,脚本列表如下:
    在这里插入图片描述

    挑选 AdvancedSimulationStep01.scala 脚本查看如下:

    RANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package computerdatabase.advanced
    
    import scala.concurrent.duration._
    import io.gatling.core.Predef._
    import io.gatling.http.Predef._
    
    class AdvancedSimulationStep01 extends Simulation {
    
      // Let's split this big scenario into composable business processes, like one would do with PageObject pattern with Selenium
      // object are native Scala singletons
      object Search {
        val search = exec(
          http("Home") // let's give proper names, they are displayed in the reports, and used as keys
            .get("/")
        ).pause(1) // let's set the pauses to 1 sec for demo purpose
          .exec(
            http("Search")
              .get("/computers?f=macbook")
          )
          .pause(1)
          .exec(
            http("Select")
              .get("/computers/6")
          )
          .pause(1)
      }
    
      object Browse {
    
        val browse = exec(
          http("Home")
            .get("/")
        ).pause(2)
          .exec(
            http("Page 1")
              .get("/computers?p=1")
          )
          .pause(670.milliseconds)
          .exec(
            http("Page 2")
              .get("/computers?p=2")
          )
          .pause(629.milliseconds)
          .exec(
            http("Page 3")
              .get("/computers?p=3")
          )
          .pause(734.milliseconds)
          .exec(
            http("Page 4")
              .get("/computers?p=4")
          )
          .pause(5)
      }
    
      object Edit {
    
        val edit = exec(
          http("Form")
            .get("/computers/new")
        ).pause(1)
          .exec(
            http("Post")
              .post("/computers")
              .formParam("name", "Beautiful Computer")
              .formParam("introduced", "2012-05-30")
              .formParam("discontinued", "")
              .formParam("company", "37")
          )
      }
    
      val httpProtocol = http
        .baseUrl("http://computer-database.gatling.io")
        .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
        .doNotTrackHeader("1")
        .acceptLanguageHeader("en-US,en;q=0.5")
        .acceptEncodingHeader("gzip, deflate")
        .userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0")
    
      // Now, we can write the scenario as a composition
      val scn = scenario("Scenario Name").exec(Search.search, Browse.browse, Edit.edit)
    
      setUp(scn.inject(atOnceUsers(1)).protocols(httpProtocol))
    }
    

    五、快速执行

    进入 bin 目录执行:

    ./gatling.sh
    

    结果如下:

    $ bin % ./gatling.sh  #Gatling 会遍历user-files/simulations,列出所有的Simulation
    GATLING_HOME is set to /Users/liwen/Downloads/gatling-charts-highcharts-bundle-3.5.1
    Choose a simulation number:
         [0] computerdatabase.BasicSimulation
         [1] computerdatabase.advanced.AdvancedSimulationStep01
         [2] computerdatabase.advanced.AdvancedSimulationStep02
         [3] computerdatabase.advanced.AdvancedSimulationStep03
         [4] computerdatabase.advanced.AdvancedSimulationStep04
         [5] computerdatabase.advanced.AdvancedSimulationStep05
    1 # 这个是我选择运行的测试用例ID - 代表选择AdvancedSimulationStep01执行,
    Select run description (optional)
    runtest # 填入测试用例的描述,可以直接回车跳过
    Simulation computerdatabase.advanced.AdvancedSimulationStep01 started...
    
    ================================================================================
    2021-04-23 21:48:31                                           5s elapsed
    ---- Requests ------------------------------------------------------------------
    > Global                                                   (OK=6      KO=0     )
    > Home                                                     (OK=2      KO=0     )
    > Home Redirect 1                                          (OK=2      KO=0     )
    > Search                                                   (OK=1      KO=0     )
    > Select                                                   (OK=1      KO=0     )
    
    ---- Scenario Name -------------------------------------------------------------
    [--------------------------------------------------------------------------]  0%
              waiting: 0      / active: 1      / done: 0
    ================================================================================
    
    
    ================================================================================
    2021-04-23 21:48:36                                          10s elapsed
    ---- Requests ------------------------------------------------------------------
    > Global                                                   (OK=9      KO=0     )
    > Home                                                     (OK=2      KO=0     )
    > Home Redirect 1                                          (OK=2      KO=0     )
    > Search                                                   (OK=1      KO=0     )
    > Select                                                   (OK=1      KO=0     )
    > Page 1                                                   (OK=1      KO=0     )
    > Page 2                                                   (OK=1      KO=0     )
    > Page 3                                                   (OK=1      KO=0     )
    
    ---- Scenario Name -------------------------------------------------------------
    [--------------------------------------------------------------------------]  0%
              waiting: 0      / active: 1      / done: 0
    ================================================================================
    
    
    ================================================================================
    2021-04-23 21:48:41                                          15s elapsed
    ---- Requests ------------------------------------------------------------------
    > Global                                                   (OK=10     KO=0     )
    > Home                                                     (OK=2      KO=0     )
    > Home Redirect 1                                          (OK=2      KO=0     )
    > Search                                                   (OK=1      KO=0     )
    > Select                                                   (OK=1      KO=0     )
    > Page 1                                                   (OK=1      KO=0     )
    > Page 2                                                   (OK=1      KO=0     )
    > Page 3                                                   (OK=1      KO=0     )
    > Page 4                                                   (OK=1      KO=0     )
    
    ---- Scenario Name -------------------------------------------------------------
    [--------------------------------------------------------------------------]  0%
              waiting: 0      / active: 1      / done: 0
    ================================================================================
    
    
    ================================================================================
    2021-04-23 21:48:43                                          16s elapsed
    ---- Requests ------------------------------------------------------------------
    > Global                                                   (OK=13     KO=0     )
    > Home                                                     (OK=2      KO=0     )
    > Home Redirect 1                                          (OK=2      KO=0     )
    > Search                                                   (OK=1      KO=0     )
    > Select                                                   (OK=1      KO=0     )
    > Page 1                                                   (OK=1      KO=0     )
    > Page 2                                                   (OK=1      KO=0     )
    > Page 3                                                   (OK=1      KO=0     )
    > Page 4                                                   (OK=1      KO=0     )
    > Form                                                     (OK=1      KO=0     )
    > Post                                                     (OK=1      KO=0     )
    > Post Redirect 1                                          (OK=1      KO=0     )
    
    ---- Scenario Name -------------------------------------------------------------
    [##########################################################################]100%
              waiting: 0      / active: 0      / done: 1
    ================================================================================
    
    Simulation computerdatabase.advanced.AdvancedSimulationStep01 completed in 16 seconds
    Parsing log file(s)...
    Parsing log file(s) done
    Generating reports...
    
    ================================================================================
    ---- Global Information --------------------------------------------------------
    > request count                                         13 (OK=13     KO=0     )
    > min response time                                    265 (OK=265    KO=-     )
    > max response time                                    547 (OK=547    KO=-     )
    > mean response time                                   289 (OK=289    KO=-     )
    > std deviation                                         75 (OK=75     KO=-     )
    > response time 50th percentile                        267 (OK=267    KO=-     )
    > response time 75th percentile                        268 (OK=268    KO=-     )
    > response time 95th percentile                        380 (OK=380    KO=-     )
    > response time 99th percentile                        514 (OK=514    KO=-     )
    > mean requests/sec                                  0.765 (OK=0.765  KO=-     )
    ---- Response Time Distribution ------------------------------------------------
    > t < 800 ms                                            13 (100%)
    > 800 ms < t < 1200 ms                                   0 (  0%)
    > t > 1200 ms                                            0 (  0%)
    > failed                                                 0 (  0%)
    ================================================================================
    # result目录找到报告的html文件
    Reports generated in 0s.
    Please open the following file: /Users/liwen/Downloads/gatling-charts-highcharts-bundle-3.5.1/results/advancedsimulationstep01/index.html
    

    打开指定路径报告如下:
    在这里插入图片描述

    六、总结

    Gatling 压测工具开箱就能使用,就是脚本编写,对测试人员要有开发基础,同时我们可以做二次封装,这样普通的使用人员只要填写常用请求即可。

    相关系列:

    展开全文
  • mvn gatling:execute 小费 要选择特定的模拟,请使用-D标志,例如: -Dgatling.simulationClass=com.rmmpestano.gatling.perf.DatatableSelectionSimulation 否则所有的模拟都会运行。 JSF 视图状态 使用 JSF 时,...
  • 性能测试工具。该工具仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
  • 性能测试框架gatling

    2022-03-10 14:06:50
    Gatling 3.7 支持用 Java、Kotlin 和 Scala 编写测试,较旧的 Gatling 版本仅支持 Scala。 1.下载安装java环境 Gatling 支持 64 位 openjdk8、11和17,推荐使用openjdk17 openjdk17下载地址:...

    一.下载与安装

    Gatling 3.7下载地址: https://gatling.io/open-source/
    下载后的软件包直接解压即可,解压后文件目录如图所示
    在这里插入图片描述

    二.环境准备

    Gatling 3.7 支持用 Java、Kotlin 和 Scala 编写测试,较旧的 Gatling 版本仅支持 Scala。
    1.下载安装java环境
    Gatling 支持 64 位 openjdk8、11和17,推荐使用openjdk17
    openjdk17下载地址:https://www.oracle.com/java/technologies/downloads/
    2.下载安装 scala
    这里推荐使用ide以插件的形式下载
    在这里插入图片描述
    3.打开gatling
    以项目的方式用ide打开gatling,便于后续维护与调试
    在这里插入图片描述

    三.gatling目录介绍

    在这里插入图片描述

    bin:
    	gatling.bat:压测启动脚本
    	recorder.bat:录制脚本
    conf:gatling自身的一些配置
    lib:gatling自身依赖的库文件
    results:测试报告存放目录
    uesr-files:
    	simulations:测试脚本存放目录
    	resources:存放请求数据的目录
    

    四.录制

    在这里插入图片描述
    recorder.bat:录制脚本,双击打开界面如下
    在这里插入图片描述

    HTTP Proxy:代理录制
    HAR Converter:HAR文件导入
    Listening port:代理端口
    Packane:保存路径
    Class Name:保存的包名
    Format:保存的脚本语言版本
    

    点击Start进行录制,页面如下
    在这里插入图片描述
    点击Stop&Save保存脚本,脚本如下

    package test;
    
    import java.time.Duration;
    import java.util.*;
    
    import io.gatling.javaapi.core.*;
    import io.gatling.javaapi.http.*;
    import io.gatling.javaapi.jdbc.*;
    
    import static io.gatling.javaapi.core.CoreDsl.*;
    import static io.gatling.javaapi.http.HttpDsl.*;
    import static io.gatling.javaapi.jdbc.JdbcDsl.*;
    
    public class Test extends Simulation {
    
      {
        HttpProtocolBuilder httpProtocol = http
          .baseUrl("http://8.8.8.8")
          .inferHtmlResources(AllowList(), DenyList())
          .acceptHeader("*/*")
          .acceptEncodingHeader("gzip, deflate")
          .acceptLanguageHeader("zh-CN,zh;q=0.9")
          .userAgentHeader("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36");
        
        Map<CharSequence, String> headers_0 = new HashMap<>();
        headers_0.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
        headers_0.put("Cache-Control", "no-cache");
        headers_0.put("Pragma", "no-cache");
        headers_0.put("Proxy-Connection", "keep-alive");
        headers_0.put("Upgrade-Insecure-Requests", "1");
        
        Map<CharSequence, String> headers_1 = new HashMap<>();
        headers_1.put("Cache-Control", "no-cache");
        headers_1.put("Content-Type", "application/json");
        headers_1.put("Origin", "http://8.8.8.8");
        headers_1.put("Pragma", "no-cache");
        headers_1.put("Proxy-Connection", "keep-alive");
        headers_1.put("X-Requested-With", "XMLHttpRequest");
        
        Map<CharSequence, String> headers_2 = new HashMap<>();
        headers_2.put("Cache-Control", "no-cache");
        headers_2.put("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
        headers_2.put("Origin", "http://8.8.8.8");
        headers_2.put("Pragma", "no-cache");
        headers_2.put("Proxy-Connection", "keep-alive");
        headers_2.put("X-Requested-With", "XMLHttpRequest");
        
        Map<CharSequence, String> headers_3 = new HashMap<>();
        headers_3.put("Cache-Control", "no-cache");
        headers_3.put("Pragma", "no-cache");
        headers_3.put("Proxy-Connection", "keep-alive");
        headers_3.put("X-Requested-With", "XMLHttpRequest");
    
    
        ScenarioBuilder scn = scenario("Test")
          .exec(
            http("request_0")
              .get("/study/ajax")
              .headers(headers_0)
          )
          .pause(11)
          .exec(
            http("request_1")
              .post("/study/ajax_json")
              .headers(headers_1)
              .body(RawFileBody("test/test/0001_request.json"))
          )
          .pause(14)
          .exec(
            http("request_2")
              .post("/study/ajax_form")
              .headers(headers_2)
              .formParam("username", "admin")
              .formParam("password", "123456")
          )
          .pause(11)
          .exec(
            http("request_3")
              .get("/study/ajax_get?username=admin&password=123456&_=1649230585743")
              .headers(headers_3)
          );
    
    	  setUp(scn.injectOpen(atOnceUsers(1))).protocols(httpProtocol);
      }
    }
    
    

    五.执行

    在这里插入图片描述
    CMD切换到gatling目录下的bin目录执行gatling.bat脚本
    在这里插入图片描述
    输入数字12执行刚才录制的脚本
    在这里插入图片描述
    等待脚本执行完毕
    在这里插入图片描述
    复制目录浏览器打开查看报告
    在这里插入图片描述

    六.其他控件

    1.思考时间

    pause(1)
    

    2.断言

    check(jsonPath("$.code").is("200"))
    check(bodyString().is("{\"code\":200,\"data\":\"功能方法\"}")
    

    3.关联

    check(bodyString().saveAs("ajax_from_body"))
    check(jsonPath("$.code").saveAs("code"))
    

    4.循环

    during(Duration.ofSeconds(10)).on()
    
    展开全文
  • 性能工具之 Gatling 开发环境搭建

    千次阅读 2021-08-09 22:59:24
    编写 Gatling 脚本需要搭建脚本开发环境,下面演示使用 IDEA 开发环境搭建脚本开发环境。 二、安装插件 打开 IDEA,安装 scala 插件,首次使用,随便创建一个工程,进入idea页面,按:Flie >Settings> Plugins...

    一、前言

    编写 Gatling 脚本需要搭建脚本开发环境,下面演示使用 IDEA 开发环境搭建脚本开发环境。

    二、安装插件

    打开 IDEA,安装 scala 插件,首次使用,随便创建一个工程,进入idea页面,按:Flie >Settings> Plugins,搜索 Scala,点击“install”即可,install 为灰色即为已安装,install 为绿色即为安装可用(未安装)状态,安装之后,restart 一下 IDEA 即可。

    三、新建工程

    • 创建新工程 Create New Project

    • 选择 mavenCreate form archetypeAdd Archetype

    • 输入内容

    在这里插入图片描述

    输入内容:

    GroupId : io.gatling.highcharts
    ArtifactId : gatling-highcharts-maven-archetype
    Version : 填入你想使用的版本号
    

    查找版本号如:
    在这里插入图片描述

    之后的步骤就下一步下一步就行了。

    工程目录如下:

    在这里插入图片描述

    注意:中间 dunsanTest02 是自己写的

    目录结构说明:

    data:存放需要输入的数据
    scala:存放你编写的测试脚本
    Engine:右键运行跟运行
    Recorder:右键运行会弹出录制程序(不建议使用,建议手动开发脚本)
    target:运行测试之后,测试报告存放在此
    

    参考 Demo 代码:

    import io.gatling.core.scenario.Simulation
    import io.gatling.core.Predef._
    import io.gatling.http.Predef._
    
    /**
     * @author 7d
     * @Date: 2021-04-27 20:08
     * @Description: 简单例子
     * @version 1.0
     */
     
    class dunsanTest02 extends Simulation {
    
      object HomeIndex {
        val home = exec(http("home_index") //设置请求名称,可随意定义
          .get("http://localhost:8080/")    //请求资源路径
          .check(status.is(200)) //判断http status
        )
      }
      
     // scenario里的参数:scenario name
     //exec()里的参数就是我们的执行动作,http("本次请求的名称").get("本次http get请求的地址")   
      val page = scenario("性能测试。").exec(HomeIndex.home)
      setUp(
        //设置线程数 运行10秒 during 默认单位秒,如果要用微秒 during(10 millisecond)
        page.inject(constantUsersPerSec(2) during (10))
        // constantUsersPerSec 立马启动的用户数,可以理解为并发数
      )
    }
    
    //repeat(times,counterName)
    // times:循环次数
    // counterName:计数器名称,可选参数,可以用来当当前循环下标值使用,从0开始
    val scn = scenario("BaiduSimulation").repeat(100){
        exec(http("baidu_home").get("/"))
      }
    
    
    //during(duration, counterName, exitASAP)
    // duration:时长,默认单位秒,可以加单位milliseconds,表示毫秒
    // counterName:计数器名称,可选。很少使用
    // exitASAP:默认为true,简单的可以认为当这个为false的时候循环直接跳出,可在循环中进行控制是否继续
    /*
      运行100秒 during 默认单位秒,如果要用微秒 during(100 millisecond)
    */
      val scn = scenario("BaiduSimulation").during(100){
        exec(http("baidu_home").get("/"))
      }
    

    四、运行结果

    run 起来看看:
    在这里插入图片描述

    控制台显示:
    在这里插入图片描述

    运行结果如下:

    在这里插入图片描述

    打开 html 报告:
    在这里插入图片描述

    验证写的脚本是否可以放入 gatling 项目运行,效果如下:

    liwen@ bin % ./gatling.sh
    GATLING_HOME is set to /Users/liwen/Downloads/gatling-charts-highcharts-bundle-3.5.1
    Choose a simulation number:
         [0] computerdatabase.BasicSimulation
         [1] computerdatabase.advanced.AdvancedSimulationStep01
         [2] computerdatabase.advanced.AdvancedSimulationStep02
         [3] computerdatabase.advanced.AdvancedSimulationStep03
         [4] computerdatabase.advanced.AdvancedSimulationStep04
         [5] computerdatabase.advanced.AdvancedSimulationStep05
         [6] dunsanTest02
    6
    Select run description (optional)
    tiaoshibiadu
    Simulation dunsanTest02 started...
    
    ================================================================================
    2021-04-27 18:58:28                                           0s elapsed
    ---- Requests ------------------------------------------------------------------
    > Global                                                   (OK=2      KO=0     )
    > home_index                                               (OK=2      KO=0     )
    
    ---- 性能测试。---------------------------------------------------------------------
    [##########################################################################]100%
              waiting: 0      / active: 0      / done: 2
    ================================================================================
    
    Simulation dunsanTest02 completed in 0 seconds
    Parsing log file(s)...
    Parsing log file(s) done
    Generating reports...
    
    ================================================================================
    ---- Global Information --------------------------------------------------------
    > request count                                          2 (OK=2      KO=0     )
    > min response time                                    379 (OK=379    KO=-     )
    > max response time                                    506 (OK=506    KO=-     )
    > mean response time                                   443 (OK=443    KO=-     )
    > std deviation                                         64 (OK=64     KO=-     )
    > response time 50th percentile                        443 (OK=443    KO=-     )
    > response time 75th percentile                        474 (OK=474    KO=-     )
    > response time 95th percentile                        500 (OK=500    KO=-     )
    > response time 99th percentile                        505 (OK=505    KO=-     )
    > mean requests/sec                                      2 (OK=2      KO=-     )
    ---- Response Time Distribution ------------------------------------------------
    > t < 800 ms                                             2 (100%)
    > 800 ms < t < 1200 ms                                   0 (  0%)
    > t > 1200 ms                                            0 (  0%)
    > failed                                                 0 (  0%)
    ================================================================================
    
    Reports generated in 0s.
    Please open the following file: /Users/liwen/Downloads/gatling-charts-highcharts-bundle-3.5.1/results/dunsantest02-20210427105826635/index.html
    

    五、总结

    大家观察出来,Gatling 在运行的时候不像 JMeter 一样,在运行的时候输入时间与加载方式,Gatling 控制都在脚本中编写。

    更多操作请参考官方文档:https://gatling.io/docs/current/

    相关系列:

    展开全文
  • JetGatling:使加特林载荷测试变得容易 概述 JetGatling提供了一个...v=`curl "https://api.github.com/repos/scw1109/jet-gatling/releases/latest" | grep "tag_name" | awk -F'"' '{print $4}'`; wget https://jit
  • gatling2.1.7

    2015-10-07 21:33:36
    性能测试工具gatling2.1.7, 官网下载太慢,上传到csdn,方便下载,供大家使用
  • 性能优化与压测一压测框架gatling简单使用介绍 压测框架gatling 说到压测,我们最熟悉的可能就是ab命令和jmeter了,确实他们很方便,但是我最近都在用另外一个压测框架,叫gatling,为什么呢,因为他的报告很吸引我...
  • 加特林 什么是加特林? 加特林机是一种负载测试工具。...Gatling在Scala中开发,并基于: 用于非阻塞HTTP的 虚拟用户编排的 ... 有什么问题吗? 阅读。 。 找到了真正的错误? 提出一个。 伙伴
  • 这是测试的项目结构,具体每个文件夹是...新建API测试文件: 文件路径是 src-scala-apitests package apitests import io.gatling.core.Predef._ import io.gatling.core.structure.ChainBuilder import io.gatling....
  • Gatling FrontLine是Gatling的管理界面,其中包括用于集成和自动化的高级指标和高级功能。 使用 首先,到官网下载最新版的gatling: https://repo1.maven.org/maven2/io/gatling/highcharts/gatli
  • Gatling性能测试(一)

    2021-11-01 21:29:57
    Gatling是一款基于Scala 开发的高性能服务器性能测试工具,同时也是一款功能强大的负载测试工具,它为易于使用,高可维护性和高性能而设计。开箱即用,Gatling由于对HTTP协议的出色支持,使其成为负载测试任何HTTP...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,575
精华内容 630
关键字:

gatling

友情链接: flash 3.0飞机 射击.zip