對Gatling早有耳聞,據說比jmeter的性能要好很多,我第一次試用的時候因為本機安裝的jdk版本不對無法跑起來,試用失敗后,因為沒時間就一直沒繼續研究了。我當時是去java官網下載最新的jdk覆蓋安裝后仍然無法跑起來(這有點坑爹),所以大家使用Gatling前如果發現它跑不起來,則最好先卸載本機的jdk再安裝新的。
今天抽時間找一台新機試用了一下,發現還是蠻有趣的,我只用了它的http(get、post)功能,發現和python的httplib用法有點像。Gatling是個綠色軟件,網上介紹已經很多了,解壓后找到“\user-files\simulations”,這里面就是測試用例了,我找了一個自帶的例子,直接修改其代碼來演示了,它的代碼是scala,我沒用過,不過看還是能看得明白的,而且貌似沒有縮進要求,這點爽,呵呵。用例代碼及注釋如下
package computerdatabase import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.duration._ class BasicSimulation extends Simulation { val httpConf = http //表示測試的數據格式以及被測目標等,設置壓力的時候會用到 .baseURL("http://192.168.0.11") // 因為這個,我覺得和python的httplib用法有點類似 .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")//我的用例不需要gzip .userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0") val headers_1 = Map("Content-Type" -> "application/x-www-form-urlencoded") // 表示數據內容格式,可以定義多個,方便不同的用例請求使用,不過建議還是一個接口用例用獨立一個文件來寫吧 val headers_2 = Map("Content-Type" -> "multipart/form-data; boundary=----------------------------2bb6caed7d98") val scn = scenario("Scenario Name") // 場景,有點像python的測試集或者jmeter的線程組,一個用例可以有多個場景的,相應的要對每個場景設置不同的壓力 .exec( http("get's example") // GET請求例子,http只是起到一個聲明(命名)的作用 .get("/api/heartbeat.json?mid=2096d4f158cb4d41a56592c816365786&ver=1.0") ) //.pause(7) // Note that Gatling has recorded real time pauses,暫時沒有試用 .exec( http("post's example") // POST請求例子 .post("/api/getconf.json?mid=ebcd32d5f68e404db1ccc8ff2dacb360&ver=1.0") .headers(headers_1) .body(StringBody("""{ "audit_control_list" : [], "ui" : [], "ws" : [ "base_setting" ], "xp_fix" : [] }""")).asJSON //body 我當前項目中最常用的參數,用"""...."""這樣body內的字符串可以換行,其中換行符實際是“\n” //------------- //.queryParam("name", "Beautiful Computer")//queryParam的效果等同於增加了URL的參數而已,即“POST /api/getconf.json?mid=ebcd32d5f68e404db1ccc8ff2dacb360&ver=1.0&name=Beautiful%20Computer” //------------- //.formParam("name", "Beautiful Computer") //formParam的例子,官方的,沒什么特別 //.formParam("introduced", "2012-05-30") //如果這樣連續寫兩行formParam,實際效果等於post了這個數據“name=Beautiful+Computer&introduced=2012-05-30”,空格居然是個+號,無語 ) setUp(scn.inject(atOnceUsers(1)).protocols(httpConf)) }
注意如果用例中有中文字符則用例文件得改為UTF8編碼。
沒用過recorder,網上說是用來錄制腳本的,我認為如果不是做界面測試盡量不要用錄制方法,無論是它還是loadder runner,因為會有太多無關的代碼被錄制,影響效率。
后面我將繼續介紹它的加壓和變量使用等等。例如用某個隨機數代替其中的某個請求參數。