Кароткі даведнік Gatling - Агульныя функцыі Gatling

Гэты пост служыць хуткім даведачным дапаможнікам для інструмента Gatling для тэсціравання прадукцыйнасці.

Раней мы бачылі, як трэба арганізаваць свой праект Gatling у лагічнай і простай для разумення структуры.

У гэтым пасце мы разгледзім некалькі прыкладаў і выкарыстання некаторых распаўсюджаных функцый Gatling пры стварэнні сцэнарыяў праверкі прадукцыйнасці.


Прыклады Gatling, разгледжаныя ў гэтым пасце:



Простае мадэляванне

import io.gatling.core.Predef._ import io.gatling.http.Predef._ class SimplestSimulation extends Simulation {
setUp(scenario('Homepage')
.exec(http('Home').get('https://devqa.io'))
.inject(atOnceUsers(1))) }


Выкарыстанне HTTP-проксі

setUp(scenario('Proxy on')
.exec(http('World').get('https://devqa.io'))
.inject(atOnceUsers(1)))
.protocols(http.proxy(Proxy('proxy.company.net', 8080))) }

У прыведзеным вышэй прыкладзе proxy.company.net - гэта URL-адрас проксі і 8080 з'яўляецца проксі-портам.




Запыты HTTP

АТРЫМАЦЬ запыт

Просты запыт GET з параметрамі запыту



http('Get Gatling posts')
.get('https://devqa.io')
.queryParam('post', 'gatling')
.queryParam('category', 'performance testing')
.header('Accept-Language', 'en')

POST запыт

Прыклад запыту POST з параметрамі формы, напрыклад адпраўка формы:

http('POST with params')
.post('https://www.example.com/login')
.formParam('firstname', 'David')
.formParam('lastname', 'Brown')
.header('Accept-Language', 'en')

Прыклад запыту POST з карыснай нагрузкай файла, якая павінна быць у src/test/resources/bodies

http('Post with file payload')
.post('https://example.com/users')
.body(RawFileBody('bodyFileName.json')).asJSON
.header('Content-type','application/json')


Сцэнар

Паўзы

нататка: Для таго, каб выкарыстоўваць паўзу, вам трэба дадаць гэты імпарт
import scala.concurrent.duration.DurationInt


scenario('with secode pause')
// ...
.pause(2, 3) // will make a random pause of 2-3 seconds
.pause(2) // will make a fixed pause of 2 seconds
scenario('millisecond pause')
// ...
.pause(200.milliseconds) // fixed pause of 0.2 second


Завесы

scenario('repeat')
.repeat(3)( // repeat 3 times
exec(http('google').get('https://www.example.com'))
)


Ін'екцыя віртуальных карыстальнікаў

val scn=scenario('Virtual users') setUp(
scn.inject(
nothingFor(4.seconds),
atOnceUsers(10),
rampUsers(10) over(5.seconds))

Рампа ўверх

rampUsers(10) over(5.seconds)
// linear rampup
// 10 users added over 5 seconds (1 extra user every 500 ms)
constantUsersPerSec(10) during(5.seconds)
// adds 10 users every second
// (so a total of 50 users after 5 seconds)

Адразу

nothingFor(4.seconds) // no new users added during 4 seconds atOnceUsers(10) // 10 users added immediately // not really recommended since it can hammer down the tested server heavisideUsers(10) over(2.seconds) // better approximation of a peak of users

Праверкі і сцвярджэнні

У Gatling праверкі звычайна выкарыстоўваюцца для праверкі органаў адказу кодаў стану, тады як сцвярджэнні звычайна выкарыстоўваюцца для сцвярджэння тэрмінаў адказаў.

Праверкі

Праверка стану і дадзеных JSON:

http('name').get('/path')
.check(status.is(200))
.check(jsonPath('$.name').is('some name'))

Захаванне дадзеных адказаў у сеансе Gatling

http('name').get('/path')
.check(header('location').saveAs('newLocation'))
.check(jsonPath('$.name').saveAs('name'))
// You can now use $newLocation and $name in your requests :
http('get home').get('/users/${name}')

Сцвярджэнні

setUp(scn).assertions(
global.responseTime.mean.lt(50), // mean resp time < 50 ms
forAll.failedRequests.percent.gt(5) // for each request, < 5% failure )


Кармушкі

Асноўнае выкарыстанне

val feeder1 = Array(
Map('foo' -> 'foo1', 'bar' -> 'bar1'),
Map('foo' -> 'foo2', 'bar' -> 'bar2'),
Map('foo' -> 'foo3', 'bar' -> 'bar3') ) // repeating the values val feeder1a = feeder1.circular val feeder1b = feeder1.random // infinite entries with keys 'value1', 'value2' val feeder2 = Iterator.continually(Map('value1' -> 100, 'value2' -> 'toto')) // infinite random entries val feeder3 = Iterator.continually(Map(
'value1' -> Random.nextInt(100),
'value2' -> Random.alphanumeric.take(4)) ) // using the feeder to build the URLs scenario('scenario name')
.feed(feeder)
.exec(http('request name')
.get('/path/${value1}') )

Пашыранае выкарыстанне

// reading a csv file to build a feeder val feeder = csv('data.csv') // the csv file must have a header row which defines the keys and be comma (,) separated // filling a template file with the content of a feeder scn.feed(feeder).exec(
http('request name')
.post('https://www.example.com')
.body(ElFileBody('filename.xml')).asXML))