diff --git a/hrp/parameters.go b/hrp/parameters.go index 9b263696..33631c2d 100644 --- a/hrp/parameters.go +++ b/hrp/parameters.go @@ -13,7 +13,7 @@ import ( type TParamsConfig struct { Strategy iteratorStrategy `json:"strategy,omitempty" yaml:"strategy,omitempty"` // overall strategy - Strategies map[string]iteratorStrategy `json:"strategies,omitempty" yaml:"strategies,omitempty"` // map[string]string、string + Strategies map[string]iteratorStrategy `json:"strategies,omitempty" yaml:"strategies,omitempty"` // individual strategies for each parameters Limit int `json:"limit,omitempty" yaml:"limit,omitempty"` } @@ -107,8 +107,8 @@ type ParametersIterator struct { hasNext bool // cache query result sequentialParameters Parameters // cartesian product for sequential parameters randomParameterNames []string // value is parameter names - limit int - index int + limit int // limit count for iteration + index int // current iteration index } // SetUnlimitedMode is used for load testing @@ -145,11 +145,6 @@ func (iter *ParametersIterator) Next() map[string]interface{} { return nil } - if len(iter.data) == 0 { - iter.hasNext = false - return nil - } - var selectedParameters map[string]interface{} if len(iter.sequentialParameters) == 0 { selectedParameters = make(map[string]interface{}) diff --git a/hrp/parameters_test.go b/hrp/parameters_test.go index f54516c3..e4bac50a 100644 --- a/hrp/parameters_test.go +++ b/hrp/parameters_test.go @@ -248,6 +248,59 @@ func TestInitParametersIteratorCount(t *testing.T) { } } +func TestInitParametersIteratorUnlimitedCount(t *testing.T) { + configParameters := map[string]interface{}{ + "username-password": fmt.Sprintf("${parameterize(%s/account.csv)}", hrpExamplesDir), // 3 + "user_agent": []interface{}{"iOS/10.1", "iOS/10.2"}, // 2 + "app_version": []interface{}{4.0}, // 1 + } + testData := []struct { + cfg *TConfig + }{ + // default, no parameters setting + { + &TConfig{ + Parameters: configParameters, + ParametersSetting: &TParamsConfig{}, + }, + }, + + // no parameters + // also will generate one empty item + { + &TConfig{ + Parameters: nil, + ParametersSetting: nil, + }, + }, + } + for _, data := range testData { + iterator, err := initParametersIterator(data.cfg) + if !assert.Nil(t, err) { + t.Fatal() + } + // set unlimited mode + iterator.SetUnlimitedMode() + if !assert.Equal(t, -1, iterator.limit) { + t.Fatal() + } + + for i := 0; i < 100; i++ { + if !assert.True(t, iterator.HasNext()) { + t.Fatal() + } + iterator.Next() // consume next parameters + } + if !assert.Equal(t, 100, iterator.index) { + t.Fatal() + } + // should also have next + if !assert.True(t, iterator.HasNext()) { + t.Fatal() + } + } +} + func TestInitParametersIteratorContent(t *testing.T) { configParameters := map[string]interface{}{ "username-password": fmt.Sprintf("${parameterize(%s/account.csv)}", hrpExamplesDir), // 3 diff --git a/hrp/session.go b/hrp/session.go index 8172d2ab..05621d09 100644 --- a/hrp/session.go +++ b/hrp/session.go @@ -112,7 +112,7 @@ func (r *SessionRunner) MergeStepVariables(vars map[string]interface{}) (map[str // updateConfigVariables updates config variables with given variables. // this is used for data driven func (r *SessionRunner) updateConfigVariables(parameters map[string]interface{}) { - if parameters == nil { + if len(parameters) == 0 { return }