【距离上次的文章,已经过去快3个月了。懒癌犯了,也没啥动力写。】

前言

乌鸦半路出家,对于某一工具的测试结果无法信任,无论结果如何,总感觉是自己做的不对。之前尝试过:

  • lr,太臃肿,99%的功能用不上。
  • ab,安装apache的附属品,windows安装失败。
  • locust,基于python,号称能发起百万级并发。但是,对比测试结果的时候,跟jmeter和gatling差一个数量级。

有至少两个产品的测试结果,能给自己一些自信。

gatling的初次尝试还比较顺利,录制、运行,修改脚本都比较顺畅,重点和难点就是对于脚本的维护,基于scala语言的脚本的相关的API还得重新学习。懒癌又犯了。。。

本来想写一个初体验教程,然后发现了testerhome上有一波质量上乘的教程,还是做搬运工吧。。。

Gatling 文档翻译 (一)-QuickStart

Gatling 文档翻译 (二)-Advanced Tutorial

Gatling 官网教程翻译之 Simulation Setup

Gatling 官网教程翻译之 Concepts

Gatling 官网翻译之高级教程

Windows 下的 Gatling 学习笔记第一季

Windows 下的 Gatling 学习笔记第二季

Windows 下的 Gatling 学习笔记第三季

gatling

干货

乌鸦懒癌犯了,想必其他小伙伴也有懒癌重度患者。原计划是使用freemaker和模板,通过输入几个参数直接生成可以使用gatling脚本,看了下freemaker,算了,还是先做模板,然后手工替换指定的几个参数吧。

这个脚本的作用是从csv读取数据,以post+body的方式发送。

https://github.com/wang153723482/HelloWorld_gatling/

/*
* 按照setp1-3修改相关参数,将文件放在 $GATLING_HOME/user-files/simulations/{package} 下
* 例如 package 是 com.wangc ,那文件应该存放在 $GATLING_HOME/user-files/simulations/com/wangc 下
*/
//step1.修改包名
package com.wangc

import scala.concurrent.duration._

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

//setp2.修改类名
class s7_post_json_csv_duration extends Simulation {

    //setp3.修改参数
    // start 参数修改部分 start
    //csv的列头
    val csvHeader = "json_date"
    //准备充足的数据,如果csv数据不够会报错,无法生成报告
    //可以使用绝对路径,或者放在 $GATLING_HOME/user-files/data 下使用相对路径
    val csvFilePath = "/home/gatling/foo.csv"
    //服务器的ip和端口
    val baseURL = "http://127.0.0.1:8080"
    //请求的路径
    val requestPath = "/index_do_json.jsp"
    //虚拟用户数
    val vu = 3
    //启动上述用户的时间(秒)
    val rampup = 1
    //持续时间(秒)
    val duration = 2
    // end 参数修改部分 end
    val csvFeeder = csv(csvFilePath).queue

    val httpConf = http
        .baseURL(baseURL)
        .contentTypeHeader("application/json")

    val requestA = feed(csvFeeder).
        exec(
            http("requestA")
            .post(requestPath)
            .body(StringBody("${"+csvHeader+"}"))
        )

    val scn = scenario("scn_0").during(duration){
        requestA
    }

    setUp(scn.inject(rampUsers(vu) over(rampup))).protocols(httpConf)
}