本文使用Gatling Scala 进行web测试
安装Gatling(加特林)
1.下载Gatling(加特林)
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端试一遍各个方法 就可以记录出请求脚本