From 8fc1fad3956e4126fc129d01e3e2d99e601ae85d Mon Sep 17 00:00:00 2001 From: debugtalk Date: Wed, 13 Apr 2022 15:25:13 +0800 Subject: [PATCH] refactor: initParameterIterator --- hrp/boomer.go | 19 ++++++------------- hrp/runner.go | 27 ++++++++++++++++----------- hrp/session.go | 4 ++-- 3 files changed, 24 insertions(+), 26 deletions(-) diff --git a/hrp/boomer.go b/hrp/boomer.go index fc605eb3..4b96103f 100644 --- a/hrp/boomer.go +++ b/hrp/boomer.go @@ -53,12 +53,6 @@ func (b *HRPBoomer) Run(testcases ...ITestCase) { } for _, testcase := range testCases { - cfg := testcase.Config - err = initParameterIterator(cfg, "boomer") - if err != nil { - log.Error().Err(err).Msg("failed to init parameter iterator") - os.Exit(1) - } rendezvousList := initRendezvous(testcase, int64(b.GetSpawnCount())) task := b.convertBoomerTask(testcase, rendezvousList) taskSlice = append(taskSlice, task) @@ -78,9 +72,7 @@ func (b *HRPBoomer) Quit() { } func (b *HRPBoomer) convertBoomerTask(testcase *TestCase, rendezvousList []*Rendezvous) *boomer.Task { - config := testcase.Config - - // each testcase has its own session runner + // init session runner for testcase sessionRunner, err := b.hrpRunner.NewSessionRunner(testcase) if err != nil { log.Error().Err(err).Msg("failed to create session runner") @@ -91,6 +83,7 @@ func (b *HRPBoomer) convertBoomerTask(testcase *TestCase, rendezvousList []*Rend b.plugins = append(b.plugins, sessionRunner.parser.plugin) b.pluginsMutex.Unlock() } + sessionRunner.resetSession() // broadcast to all rendezvous at once when spawn done go func() { @@ -101,11 +94,11 @@ func (b *HRPBoomer) convertBoomerTask(testcase *TestCase, rendezvousList []*Rend }() return &boomer.Task{ - Name: config.Name, - Weight: config.Weight, + Name: testcase.Config.Name, + Weight: testcase.Config.Weight, Fn: func() { - testcaseSuccess := true // flag whole testcase result - var transactionSuccess = true // flag current transaction result + testcaseSuccess := true // flag whole testcase result + transactionSuccess := true // flag current transaction result var parameterVariables map[string]interface{} // iterate through all parameter iterators and update case variables diff --git a/hrp/runner.go b/hrp/runner.go index 5c4cd35c..9af9c80f 100644 --- a/hrp/runner.go +++ b/hrp/runner.go @@ -152,26 +152,22 @@ func (r *HRPRunner) Run(testcases ...ITestCase) error { // run testcase one by one for _, testcase := range testCases { - // each testcase has its own session runner sessionRunner, err := r.NewSessionRunner(testcase) if err != nil { log.Error().Err(err).Msg("[Run] init session runner failed") return err } - defer sessionRunner.parser.plugin.Quit() + defer func() { + if sessionRunner.parser.plugin != nil { + sessionRunner.parser.plugin.Quit() + } + }() - cfg := testcase.Config - // parse config parameters - err = initParameterIterator(cfg, "runner") - if err != nil { - log.Error().Interface("parameters", cfg.Parameters).Err(err).Msg("parse config parameters failed") - return err - } // 在runner模式下,指定整体策略,cfg.ParametersSetting.Iterators仅包含一个CartesianProduct的迭代器 - for it := cfg.ParametersSetting.Iterators[0]; it.HasNext(); { + for it := sessionRunner.parsedConfig.ParametersSetting.Iterators[0]; it.HasNext(); { var parameterVariables map[string]interface{} // iterate through all parameter iterators and update case variables - for _, it := range cfg.ParametersSetting.Iterators { + for _, it := range sessionRunner.parsedConfig.ParametersSetting.Iterators { if it.HasNext() { parameterVariables = it.Next() } @@ -210,6 +206,8 @@ func (r *HRPRunner) Run(testcases ...ITestCase) error { return nil } +// NewSessionRunner creates a new session runner for testcase. +// each testcase has its own session runner func (r *HRPRunner) NewSessionRunner(testcase *TestCase) (*SessionRunner, error) { sessionRunner := &SessionRunner{ testCase: testcase, @@ -230,5 +228,12 @@ func (r *HRPRunner) NewSessionRunner(testcase *TestCase) (*SessionRunner, error) return nil, errors.Wrap(err, "parse testcase config failed") } + // parse testcase config parameters + err = initParameterIterator(sessionRunner.parsedConfig, "runner") + if err != nil { + log.Error().Interface("parameters", sessionRunner.parsedConfig.Parameters).Err(err).Msg("parse config parameters failed") + return nil, errors.Wrap(err, "parse testcase config parameters failed") + } + return sessionRunner, nil } diff --git a/hrp/session.go b/hrp/session.go index b31603c2..a97ae94f 100644 --- a/hrp/session.go +++ b/hrp/session.go @@ -124,14 +124,14 @@ func (r *SessionRunner) parseConfig(variables map[string]interface{}) error { // parse config name parsedName, err := r.parser.ParseString(cfg.Name, parsedVariables) if err != nil { - return err + return errors.Wrap(err, "parse config name failed") } r.parsedConfig.Name = convertString(parsedName) // parse config base url parsedBaseURL, err := r.parser.ParseString(cfg.BaseURL, parsedVariables) if err != nil { - return err + return errors.Wrap(err, "parse config base url failed") } r.parsedConfig.BaseURL = convertString(parsedBaseURL)