From 659b6021223b1ad8e8b0af91b0bff3333bfa4778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E8=81=AA?= Date: Tue, 4 Jan 2022 22:00:47 +0800 Subject: [PATCH] feat: data-driven. --- boomer.go | 3 ++- models.go | 2 +- parser.go | 21 +++++++++++---------- runner.go | 5 +++-- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/boomer.go b/boomer.go index eae914ea..5163fce5 100644 --- a/boomer.go +++ b/boomer.go @@ -76,7 +76,8 @@ func (b *hrpBoomer) convertBoomerTask(testcase *TestCase) *boomer.Task { if err := copier.Copy(caseConfig, cfg); err != nil { log.Error().Err(err).Msg("copy config data failed") } - for _, it := range cfg.ParametersSetting.Iterator { + // iterate through all parameter iterators and update case variables + for _, it := range cfg.ParametersSetting.Iterators { if it.HasNext() { caseConfig.Variables = mergeVariables(it.Next(), caseConfig.Variables) } diff --git a/models.go b/models.go index cc55d77a..b7c7b915 100644 --- a/models.go +++ b/models.go @@ -32,7 +32,7 @@ type TConfig struct { type TParamsConfig struct { Strategy interface{} `json:"strategy,omitempty" yaml:"strategy,omitempty"` Iteration int `json:"iteration,omitempty" yaml:"iteration,omitempty"` - Iterator []*Iterator `json:"parameterIterator,omitempty" yaml:"parameterIterator,omitempty"` + Iterators []*Iterator `json:"parameterIterator,omitempty" yaml:"parameterIterator,omitempty"` //保存参数的迭代器 } const ( diff --git a/parser.go b/parser.go index 7180b3f8..f56bf973 100644 --- a/parser.go +++ b/parser.go @@ -606,41 +606,42 @@ func initParameterIterator(cfg *TConfig, mode string) (err error) { } // parse config parameters setting if cfg.ParametersSetting == nil { - cfg.ParametersSetting = &TParamsConfig{Iterator: []*Iterator{}} + cfg.ParametersSetting = &TParamsConfig{Iterators: []*Iterator{}} } + // boomer模式下不限制迭代次数 if mode == "boomer" { cfg.ParametersSetting.Iteration = -1 } rawValue := reflect.ValueOf(cfg.ParametersSetting.Strategy) switch rawValue.Kind() { case reflect.Slice: - // strategy: ["random", "sequential"] + // strategy: ["random", "sequential"], 每个参数对应一个迭代器,每个迭代器随机、顺序选取元素互不影响 if len(parameters) != rawValue.Len() { return errors.New("parameters and strategy should have the same length") } else { for i := 0; i < rawValue.Len(); i++ { - cfg.ParametersSetting.Iterator = append( - cfg.ParametersSetting.Iterator, + cfg.ParametersSetting.Iterators = append( + cfg.ParametersSetting.Iterators, newIterator(parameters[i], rawValue.Index(i).Interface().(string), cfg.ParametersSetting.Iteration), ) } } case reflect.String: - // strategy: "random" + // strategy: random, 仅生成一个的迭代器,该迭代器在参数笛卡尔积slice中随机选取元素 if len(rawValue.String()) == 0 { cfg.ParametersSetting.Strategy = strategySequential } else { cfg.ParametersSetting.Strategy = strings.ToLower(rawValue.String()) } - cfg.ParametersSetting.Iterator = append( - cfg.ParametersSetting.Iterator, + cfg.ParametersSetting.Iterators = append( + cfg.ParametersSetting.Iterators, newIterator(genCartesianProduct(parameters), cfg.ParametersSetting.Strategy.(string), cfg.ParametersSetting.Iteration), ) default: - // default strategy: sequential + // default strategy: sequential, 仅生成一个的迭代器,该迭代器在参数笛卡尔积slice中顺序选取元素 cfg.ParametersSetting.Strategy = strategySequential - cfg.ParametersSetting.Iterator = append( - cfg.ParametersSetting.Iterator, + cfg.ParametersSetting.Iterators = append( + cfg.ParametersSetting.Iterators, newIterator(genCartesianProduct(parameters), cfg.ParametersSetting.Strategy.(string), cfg.ParametersSetting.Iteration), ) } diff --git a/runner.go b/runner.go index d8f7543d..07c32789 100644 --- a/runner.go +++ b/runner.go @@ -143,8 +143,9 @@ func (r *caseRunner) run() error { } cfg := config.ToStruct() log.Info().Str("testcase", config.Name()).Msg("run testcase start") - for it := cfg.ParametersSetting.Iterator[0]; it.HasNext(); { - for _, it = range cfg.ParametersSetting.Iterator { + for it := cfg.ParametersSetting.Iterators[0]; it.HasNext(); { + // iterate through all parameter iterators and update case variables + for _, it = range cfg.ParametersSetting.Iterators { if it.HasNext() { cfg.Variables = mergeVariables(it.Next(), cfg.Variables) }