Stress / Scenario test sử dụng Gatling

888
10-03-2018
Stress / Scenario test sử dụng Gatling

Giới thiệu

Để tạo nên một service tốt thì việc "stress test" (hay có nghĩa là "test thật lực") là một qui trình không thể thiếu. Bizfly Cloud chia sẻ Stress test tốt có thể giúp phát hiện sớm các bottle neck (hay là các nút thắt) của hệ thống sớm, qua đó giúp chúng ta tránh khỏi các trường hợp như service bị chết "bất đắc kì tử". 
Stress test cũng giúp chúng ta chuẩn bị sớm cho các trường hợp bị tấn công , đặc biệt là DDos, để xem hệ thống của chúng ta có thể chịu được tải lớn nhất là bao nhiê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

Các bạn download Gatling bundle tại đường link sau: http://gatling.io/#/download.
Sau đó giải nén vào một thư mục nào đó, giả sử mình đặt tại


~/GATLING

Record

Step 1

Đầu tiên để làm quen chúng ta sẽ tạo thử một scenario script bằng cách record lại thao tác trên màn hình.
Cách record vô cùng đơn giản, chỉ cần bạn vào thư mục vừa giải nén ở trên, sau đó chạy dòng lệnh tương ứng dưới đây:


bin/recorder.sh #linux

bin/recorder.bat #windows

Chú ý là gatling sử dụng scala, tức là yêu cầu máy của bạn phải cài sẵn java.
Sau khi chạy thì sẽ hiện lên màn hình

Ảnh 3.

Có khá nhiều mục để điền, cơ mà bạn đừng lo, ở step này thì bạn chả phải làm gì cả.

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:

Ảnh 4.

Step 3

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.

Ảnh 5.

Sau khi hoàn thành xong thì bạn ấn nút Stop & Save, những thao tác bạn vừa làm sẽ được lưu tại thư mục 


~/GATLING/user-files/simulations/RecordedSimulation.scala

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.

Ảnh 9.

Kết quả chạy sẽ được report vào một file html nằm ở cuối cùng


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ệ

Ảnh 11.

Kết luận

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

TAGS: scala
SHARE