Gatling 测试工具 快速开始

543 阅读2分钟

本文使用Gatling Scala 进行web测试

安装Gatling(加特林)

1.下载Gatling(加特林)

gatling.io/

2.配置环境变量

  • 变量名:GATLING_HOME
  • 变量值:X:\XXXX\gatling-charts-highcharts-bundle-X.X.X
  • Path %GATLING_HOME%\bin

安装Scala SDK

1.下载Scala msi(windows 安装这个或者zip)

默认文件夹有带(X86) 选择不带括号的那个文件夹

选择好盘符 next install就行

2.配置环境变量

  • 变量名:SCALA_HOME
  • 变量值:X:\XXXX\scala
  • Path %SCALA_HOME%\bin
在cmd 输入Scala 显示 Welcome to Scala
  • 如果显示 此时不应有 \scala\bin..\lib\jline-3.14.1.jar。说明路径里有特殊字符括号 默认的文件夹就有(X86)

先配置SDK

1.Scala SDK 在idea中配置

  • 选择 Project Structure 就是右上角停止旁边的那个图标
  • 弹窗左侧Global Libraries 选择绿色小加号 选择Scala的根目录点OK就行

请求代码

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

import scala.concurrent.duration.FiniteDuration

/**
  * @author yezixun
  * @date 2020/6/8 17:55
  */
class ApiGatlingSimulationTest extends Simulation {

  val scn = scenario("AddStudent").repeat(10, "n") {//请求接口10次
    exec(
      http("GetStudent-API")
        .post("http://192.168.1.82:8021/sysUsers/create")
        .header("Content-Type", "application/json")
        .body(StringBody("""{"userName":"merengues","passWord":"123"}"""))
        .check(status.is(200))
    )
  }
  setUp(scn.inject(atOnceUsers(1))).maxDuration(FiniteDuration.apply(5 , "minutes")) //5为此次测试时间
}

创建maven项目 写一个测试demo

创建maven骨架

GroupId:io.gatling.highcharts
ArtifactId: gatling-highcharts-maven-archetype
# 目前我用的是3.0.3
Version: 3.0.3

pom修改

骨架自动会引入相关的jar包 这里添加一个

 <!-- 测试脚本class -->      <simulationClass>GatlingDemoTest</simulationClass>
<plugin>
        <groupId>io.gatling</groupId>
        <artifactId>gatling-maven-plugin</artifactId>
        <version>${gatling-maven-plugin.version}</version>
        <configuration>
           <!-- 测试脚本 -->
           <simulationClass>GatlingDemoTest</simulationClass>
           <!-- 结果输出地址 可不用配置此项 直接在target 里找到对应的生成文件 -->
           <!--<resultsFolder>C:\Users\yezix\Documents</resultsFolder>-->
       </configuration>
      </plugin>

scala class 创建

对百度进行请求测试

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

import scala.concurrent.duration._
/**
  * @author yezixun
  *  2020/6/8 21:07
  */
class GatlingDemoTest extends Simulation {

  // 设置请求的根路径
  val httpConf = http.baseUrl("https://www.baidu.com")
  /*
  运行10秒 during 默认单位秒,如果要用微秒 during(100 millisecond)
  */
  val scn = scenario("BaiduSimulation").during(10){
    exec(http("baidu_home").get("/"))
  }
  // 设置线程数
  setUp(scn.inject(atOnceUsers(10)).protocols(httpConf))

}

这个是接口登录


  //给年龄字段添加一个随机数Feeder
  //使用Feeder的原因:按照gatling的官方文档的解释,由于DSL会预编译,在整个执行过程中是静态的。因此Random在运行过程中就已经静态化了,不会再执行。
  //参考:https://www.jianshu.com/p/7f7a57a8c2bb
  val randomIdFeeder =
  Iterator.continually(Map("age" ->
    (scala.util.Random.nextInt(50))))

  //设置请求的根路径
  //这里是在接口的的服务地址
  val httpConf = http.baseUrl("http://127.0.0.1:6001")

  /*
    运行秒数 during 默认单位秒,如果要用微秒 during(1000 millisecond)
    下面内容可以参考:
    脚本结果:https://gatling.io/docs/current/general/concepts/
    post请求:https://gatling.io/docs/current/http/http_request/
    check:https://gatling.io/docs/current/http/http_check/#http-check
   */
  val scn = scenario("GatlingDemoTest")
    .during(10) {
      forever(
        feed(randomIdFeeder)
          .exec(http("LoginCheck")
            .post("/admin/login")
            .header("Content-Type", "application/json")
            .body(StringBody("""{"account":"admin","password":"xxxxx","clientType":"app"}""")).asJson
            .check(status.is(200))
            .check(jsonPath("$.code").is("200"))
            .check(jsonPath("$.desc").is("登录成功"))
          )
      )
    }
  /*
    设置并发
    参考
    https://gatling.io/docs/current/general/simulation_setup/
    */
  setUp(
    scn.inject(
      //在10秒内以线性斜坡方式完成注入10的用户,不是一下子注入20个,而是逐步增加(线性)。可以从报告看出。
      rampUsers(20) during (20 seconds)
    ).protocols(httpConf)
  )

Gatling 功能强大,比如可以进行代理仿真

(可以代理浏览器 对测试服接口调用做记录并生成脚本,不需要自己编写代码)

之后可以直接先在web端试一遍各个方法 就可以记录出请求脚本