Stress / Scenario test sử dụng Gatling
Giới thiệu
Gatling là gì
Gatling là hệ thống stress test sử dụng ngôn ngữ scala, dựa trên nền tảng là akka, netty. Mặc dù viết bằng scala, nhưng các bạn đừng hoảng sợ vội, gatling là một trong những tool dễ dùng nhất mà mình từng biết.
Chức năng của gatling
• Test theo scenario sử dụng scenario script viết bằng scala (gatling script cực kì dễ viết)
• Report kết quả bằng html file với giao diện đẹp và rất dễ nhìn
• Trang bị sẵn "recorder" giúp các bạn có thể tạo scenario bằng việc "record" lại các thao tác trên browser
Cài đặt và sử dụng
~/GATLING
Record
Step 1
bin/recorder.sh #linux
bin/recorder.bat #windows
Step 2
Việc tiếp theo bạn phải làm là setting proxy cho browser.
Tại sao lại cần làm việc này? Lý do là vì gatling sẽ record lại thao tác của bạn nhờ http request thông qua proxy server mà chính nó dựng lên, rất thú vị phải không. Gatling về cơ bản sẽ dựng 1 proxy server bên trong chính nó, với port là Listening port trong hình ở trên. Khi bạn config browser của bạn sử dụng proxy này, mọi thao tác http request sẽ được gatling bắt lại, sau đó dựa vào đó để tạo nên scenario script.
Mình sẽ setup proxy trên firefox khá đơn giản như hình dưới đây:
Bạn click nút start trên gatling, và sau đó thao tác một số thao tác bất kì trên firefox. Để test thì mình sẽ làm thử các thao tác sau:
• Vào google
• Search từ khoá kipalog
• Vào trang kipalog để xem.
Bạn sẽ thấy trên màn hình gatling hiện ra tất cả các thao tác bạn vừa làm, cả thời gian chờ giữa các thao tác.
Mở thừ file ra xem bạn sẽ thấy nội dung như sau:
import scala.concurrent.duration._
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.jdbc.Predef._
class RecordedSimulation extends Simulation {
val httpProtocol = http
.baseURL("http://google.com")
.inferHtmlResources()
.acceptHeader("image/png,image/*;q=0.8,*/*;q=0.5")
.acceptEncodingHeader("gzip, deflate")
.acceptLanguageHeader("ja,en-US;q=0.7,en;q=0.3")
.connection("keep-alive")
.userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0")
val headers_0 = Map("Accept" -> "text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8")
val headers_2 = Map("Accept" -> "*/*")
val headers_4 = Map(
"Accept" -> "application/json, text/plain, */*",
"X-XSRF-TOKEN" -> "t56ufTNRqOAPaE51Z AaqvvIZMQKbi5z4 bOrmVlVI0=")
val uri1 = "google.com"
val uri2 = "js-agent.newrelic.com"
val uri3 = "ktmt.github.io"
val uri4 = "http://www.google-analytics.com"
val uri5 = "bam.nr-data.net"
val uri6 = "http://kipalog.com"
val uri7 = "ruby.org.vn"
val scn = scenario("RecordedSimulation")
.exec(http("request_0")
.get("/")
.headers(headers_0)
.resources(http("request_1")
.get(uri6 "/")
.headers(headers_0),
http("request_2")
.get(uri4 "/analytics.js")
.headers(headers_2)
.check(status.is(304)),
http("request_3")
.get(uri4 "/r/collect?v=1&_v=j37&a=1117594451&t=pageview&_s=1&dl=http://kipalog.com/posts&dr=http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CB0QFjAAahUKEwjr0IvpvtrGAhWmLKYKHdkVAMo&url=http://kipalog.com/&ei=0u6kVeufHKbZmAXZq4DQDA&usg=AFQjCNHNWTXwkfkeUuWoub-_x5JkQtSJ5A&bvm=bv.97653015,d.dGo&ul=ja&de=UTF-8&dt=Kipalog&sd=24-bit&sr=1440x900&vp=1440x745&je=1&_u=AACAAEABI~&jid=1940449042&cid=521737232.1436853580&tid=UA-53121223-2&_r=1&z=1907358178"),
http("request_4")
.get(uri6 "/posts/pagination?filter=top&page=1")
.headers(headers_4),
http("request_5")
.get("http://" uri3 "/images/logo.jpg")
.check(status.is(304)),
http("request_6")
.get("http://" uri7 "/images/ruby-vietnam-logo.png?1418271887"),
http("request_7")
.get("http://" uri2 "/nr-632.min.js")
.headers(headers_2)
.check(status.is(304)),
http("request_8")
.get("http://" uri5 "/1/d5ddd9fcfb?a=4188188&pl=1436872404158&v=632.2b17625&to=dVoKEBQKXV0AFhoRCkVBF0sPC1VUHQ==&ap=1869&be=2431&fe=1255&dc=94&f=[]&perf={"timing":{"of":1436872404158,"n":0,"dl":2422,"di":2508,"ds":2525,"de":2632,"dc":3685,"l":3685,"le":3686,"r":0,"re":283,"f":283,"dn":283,"dne":283,"c":283,"ce":283,"rq":284,"rp":2421,"rpe":2421},"navigation":{"ty":255,"rc":1}}&jsonp=NREUM.setToken")
.headers(headers_2)))
setUp(scn.inject(atOnceUsers(1))).protocols(httpProtocol)
}%
Bạn nhìn nội dung là có thể lờ mờ đoán được cách viết scenario cho gatling rồi.
Run Scenario
Bước tiếp theo sẽ là, bạn sử dụng file scenario vừa tạo ở trên để chạy stress test. Cách chạy cũng rất đơn giản, bạn chỉ cần chạy file bash:
~/GATLING/bin/gatling.sh
Choose a simulation number:
[0] RecordedSimulation
[1] computerdatabase.BasicSimulation
[2] computerdatabase.advanced.AdvancedSimulationStep01
[3] computerdatabase.advanced.AdvancedSimulationStep02
[4] computerdatabase.advanced.AdvancedSimulationStep03
[5] computerdatabase.advanced.AdvancedSimulationStep04
[6] computerdatabase.advanced.AdvancedSimulationStep05
//Bạn chọn 0
Sau đó chỉ cần enter cho đến khi script được chạy.
Please open the following file: results/recordedsimulation-1436872870628/index.html
Mở file html ra bạn sẽ thấy một report rất chi tiết bao gồm: Số lượng request gửi, số lượng request thất bại, tỉ lệ
Với gatling các bạn có thể tạo stress test scenario vô cùng dễ dàng.
Hy vọng với gatling chúng ta có thể bỏ xó được anh bạn jmeter vừa cổ lỗ vừa khó dùng (phải viết scenario bằng xml orz).
>> Xem thêm: Những điều bạn đã biết, và chưa biết về Variance và Functor trong Scala