У гэтым паведамленні тлумачыцца, як зрабіць аўтэнтыфікацыю Oauth2 з Gatling.
У гэтым прыкладзе мы адпраўляем запыт на стварэнне карыстальніка. Аднак канчатковая кропка карыстальніка абаронена і патрабуе access_token.
Спачатку мы атрымаем маркер bearer_token або access_token, а потым адправім яго ў выглядзе загалоўка да наступнага запыту API для стварэння карыстальніка.
Каб праілюстраваць гэта, мы будзем выкарыстоўваць тую ж структуру праекта для Gatling, якую мы пабудавалі раней:
Структура тэсціравання прадукцыйнасці з Gatling і Maven
Калі мы будзем прытрымлівацца крокаў у прыведзеным вышэй паведамленні, мы атрымаем наступную структуру праекта:
Спачатку мы вызначаем параметры OAuth 2.0 у Configuration.scala
файл аб'екта пад канфігурацыі тэчка:
object Configuration { val environment: String = System.getProperty('environment') val clientId: String = System.getProperty('CLIENT_ID') val clientSecret: String = System.getProperty('CLIENT_SECRET') val apiURL: String = 'https://some-sub-domain.' + environment + 'some-domain.com/api' var tokenPath: String = 'https://some-sub-domain' + environment + '.eu.auth0.com/oauth/token' val userPath = '/identity/iaa/v1/users' }
нататка:Звычайна навакольнае асяроддзе, client_id і client_secrets экспартуюцца ў машыне, дзе будуць працаваць тэсты, таму мы можам выкарыстоўваць System.getProperty () чытаць значэнні.Цяпер нам трэба напісаць код, які адпраўляе запыт на сервер аўтарызацыі, каб атрымаць маркер на прад'яўніка.
Гэты файл AuthRequest.scala
захоўваецца пад запыты папка ў нашай структуры праекта.
import java.io.{BufferedWriter, FileWriter} import config.Configuration import io.gatling.core.Predef._ import io.gatling.http.Predef._ object AuthRequest { val getAccessToken = exec(http('Get access token')
.post(Configuration.tokenPath)
.body(StringBody(
s'''{
'client_id': '${Configuration.clientId}',
'client_secret': '${Configuration.clientSecret}',
'audience': 'https://some-domain-name.com/user',
'grant_type': 'client_credentials',
'scope': 'user:admin'
}'''
))
.asJson
.headers(Map('Content-Type' -> 'application/json'))
.check(status.is(200))
.check(jsonPath('$.access_token').saveAs('access_token')))
.exec {
session =>
val fw = new BufferedWriter(new FileWriter('access_token.txt', true))
try {
fw.write(session('access_token').as[String] + '
')
}
finally fw.close()
session
} }
У прыведзеным вышэй фрагменце кода мы таксама захоўваем access_token ў файл.
Вышэйзгаданы званок проста атрымлівае access_token.
Нам патрэбны яшчэ адзін запыт на стварэнне карыстальніка, адправіўшы access_token у якасці загалоўка.
Наш запыт карыстальніка знаходзіцца ў файле UserRequests.scala
і захоўваецца пад запыты тэчку.
import config.Configuration.{apiURL, userPath} import io.gatling.core.Predef._ import io.gatling.http.Predef._ object UserRequests { private val auth0Headers = Map(
'Accept' -> 'application/json, text/javascript, */*; q=0.01',
'Content-Type' -> 'application/json',
'Authorization' -> 'Bearer ${access_token}') val createUser = exec(http('Create user')
.post(apiURL + userPath)
.headers(auth0Headers)
.body(ElFileBody('createUser.json'))
.check(status.is(201))) }
Цяпер выпісваем аб'ект сцэнарыя. У гэтым прыкладзе наш аб'ект называецца UserScenarios.scala
і захоўваецца пад сцэнар тэчку.
import requests.{AuthRequest, UserRequests} import io.gatling.core.Predef._ object UserScenarios { var userIds:Array[Map[String,String]] =
(100 to 900).toArray map ( x => { Map( 'userId' -> x.toString) }) val getAccessToken = scenario('Get token')
.exec(AuthRequest.getAccessToken) val createUserScenario = scenario('Create user')
.feed(userIds.circular)
.exec(UserAuthZRequest.getAccessToken)
.exec(UserRequests.createUser) }
Апісаны вышэй запыт адпраўляе запыт POST на стварэнне карыстальніка з маркерам доступу_адказчыкам у якасці носьбіта ў загалоўку.
Нарэшце, наш файл мадэлявання называецца UserSimulation.scala
захоўваецца пад мадэляванне тэчку.
import scenario.UserScenarios import io.gatling.core.Predef._ import scala.concurrent.duration._ class UserSimulation extends Simulation { setUp(
UserScenarios.createUserScenario.inject(rampUsers(250) during (15 minutes)), ) }
Для запуску тэстаў, якія мы выкарыстоўваем
mvn clean gatling:test