package Ġde . sc and io . e 4 . test packages Ċ Ċ import Ġch . qos . log back . classic . Level Ċ import Ġch . qos . log back . classic . Logger Context Ċ import Ġde . sc and io . e 4 . E 4 Env Ċ import Ġde . sc and io . e 4 . worker . client . No op Web Client Ċ import Ġde . sc and io . e 4 . worker . collections . Action Collection Ċ import Ġde . sc and io . e 4 . worker . interfaces . Action Ċ import Ġde . sc and io . e 4 . worker . interfaces . Test Package Ċ import Ġde . sc and io . e 4 . worker . interfaces . Web Client Ċ import Ġde . sc and io . e 4 . worker . util . Util Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . slf 4 j . LoggerFactory . get I LoggerFactory ĊĊ Ċ abstract Ġclass ĠTest Package Test Run Ġ{ ĊĊĠĠĠ Ġval Ġlogger Context Ġ= Ġget I LoggerFactory () Ġas ĠLogger Context ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( java Class ) ĊĊĠĠĠ Ġprotected Ġvar Ġscreenshot Count Ġ= Ġ 0 ĊĠĠĠ Ġprotected Ġval Ġutil : ĠUtil ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . util Ġ= ĠUtil () ĊĠĠĠĠĠĠĠ Ġset LogLevel (" org . apache ", ĠLevel . ERROR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġset LogLevel ( package Path : ĠString , Ġlevel : ĠLevel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger Context . getLogger ( package Path ). level Ġ= Ġlevel ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġexecute Test Package ( test Package : ĠTest Package , Ġhow Many Times : ĠInt Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" ================================================ ============ ==" ) ĊĠĠĠĠĠĠĠ Ġlog . info (" START Ġexecuting Ġ${ test Package . virtual Users . size } Ġvirtual Ġusers ") ĊĊĠĠĠĠĠĠĠ Ġrepeat ( how Many Times ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" ==> ĠNEXT ĠRUN : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( virtual User Class Ġin Ġtest Package . virtual Users ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvirtual User Ġ= Ġvirtual User Class . newInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Executing Ġvirtual Ġuser Ġ${ virtual User . java Class . simple Name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmeasurement Ġ= Ġexecute Actions ( virtual User . actions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info ("[ MEAS URE ] ĠTotal Ġtime Ġtaken Ġfor ĠVirtual User Ġ${ virtual User . java Class . simple Name }: Ġ${ measurement . total Time Taken } Ġ( Total Ġactions Ġrun : Ġ${ measurement . num Actions Run } Ġ- ĠActions Ġexcluded Ġfrom Ġmeasurement : Ġ${ measurement . num Excluded Actions }) ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . info (" DONE Ġexecuting Ġ${ test Package . virtual Users . size } Ġvirtual Ġusers ") ĊĠĠĠĠĠĠĠ Ġlog . info (" ================================================ ============ ==" ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġexecute Test Package Prepare ( test Package : ĠTest Package ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" ================================================ ============ ==" ) ĊĠĠĠĠĠĠĠ Ġlog . info (" START Ġexecuting Ġ${ test Package . setup Actions . size } Ġsetup Ġactions ") ĊĠĠĠĠĠĠĠ Ġexecute Actions ( test Package . setup Actions ) ĊĠĠĠĠĠĠĠ Ġlog . info (" DONE Ġexecuting Ġsetup Ġactions ") ĊĠĠĠĠĠĠĠ Ġlog . info (" ================================================ ============ ==" ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġexecute Action ( action : ĠAction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġweb Client : ĠWeb Client Ġ= ĠNo op Web Client () ĊĠĠĠĠĠĠĠ Ġif Ġ(! action . is Rest Only ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġweb Client Ġ= ĠE 4 Env . new Admin Test Web Client () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrest Con fluence Ġ= ĠE 4 Env . new Admin Test RestClient () ĊĠĠĠĠĠĠĠ Ġlog . info (" Executing Ġaction Ġ${ action . java Class . simple Name }") ĊĠĠĠĠĠĠĠ Ġval Ġruntime Name Ġ= Ġ" after action -${ action . java Class . simple Name }" ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction . execute ( web Client , Ġrest Con fluence ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Time Ġtaken : Ġ${ action . time Taken }") ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! action . is Rest Only ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Client . take Screenshot ( runtime Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Client . dump Html ( runtime Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Client . quit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġexecute Actions ( actions : ĠAction Collection ): ĠMeasurement Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtotal Time Taken : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġnum Excluded Actions Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġnum Actions Run Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( action Ġin Ġactions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġweb Client : ĠWeb Client ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action . is Rest Only ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Client Ġ= ĠNo op Web Client () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Client Ġ= ĠE 4 Env . new Admin Test Web Client () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrest Client Ġ= ĠE 4 Env . new Admin Test RestClient () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Executing Ġaction Ġ${ action . java Class . simple Name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction . execute ( web Client , Ġrest Client ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! actions . is Excluded From Measurement ( action )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Time Taken Ġ+= Ġaction . time Taken ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Actions Run Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Time Ġtaken Ġfor Ġaction Ġ${ action . java Class . simple Name }: Ġ${ action . time Taken }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnum Excluded Actions Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġruntime Name Ġ= Ġ" after action -${ action . java Class . simple Name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Client . take Screenshot ( runtime Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Client . dump Html ( runtime Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġweb Client . quit () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠMeasurement ( total Time Taken , Ġnum Excluded Actions , Ġnum Actions Run ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġshot ( web Client : ĠWeb Client ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . screenshot Count Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġthis . util . take Screenshot ( web Client . web Driver , Ġ"${ E 4 Env . OUT _ DIR }/ $ screenshot Count - test - run . png ") ĊĠĠĠĠĠĠĠ Ġprint ( path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠMeasurement ( val Ġtotal Time Taken : ĠLong , Ġval Ġnum Excluded Actions : ĠInt , Ġval Ġnum Actions Run : ĠInt ) Ċ Ċ }