add each parameter selection strategy.

This commit is contained in:
徐聪
2022-01-05 14:54:07 +08:00
parent ca43c74cad
commit 698aea3082
3 changed files with 21 additions and 14 deletions
+4 -4
View File
@@ -9,10 +9,10 @@
"username-password": "${parameterize(examples/account.csv)}" "username-password": "${parameterize(examples/account.csv)}"
}, },
"parameters_setting": { "parameters_setting": {
"strategy": [ "strategy": {
"random", "user_agent": "sequential",
"sequential" "username-password": "random"
], },
"iteration": 10 "iteration": 10
}, },
"variables": { "variables": {
+3 -1
View File
@@ -4,7 +4,9 @@ config:
user_agent: [ "iOS/10.1", "iOS/10.2" ] user_agent: [ "iOS/10.1", "iOS/10.2" ]
username-password: ${parameterize(examples/account.csv)} username-password: ${parameterize(examples/account.csv)}
parameters_setting: parameters_setting:
strategy: ["random", "sequential"] strategy:
user_agent: "sequential"
username-password: "random"
iteration: 10 iteration: 10
variables: variables:
app_version: v1 app_version: v1
+14 -9
View File
@@ -494,10 +494,14 @@ func findallVariables(raw string) variableSet {
return varSet return varSet
} }
func genCartesianProduct(params []paramsType) paramsType { func genCartesianProduct(paramsMap map[string]paramsType) paramsType {
if len(params) == 0 { if len(paramsMap) == 0 {
return nil return nil
} }
var params []paramsType
for _, v := range paramsMap {
params = append(params, v)
}
var cartesianProduct paramsType var cartesianProduct paramsType
cartesianProduct = params[0] cartesianProduct = params[0]
for i := 0; i < len(params)-1; i++ { for i := 0; i < len(params)-1; i++ {
@@ -512,11 +516,11 @@ func genCartesianProduct(params []paramsType) paramsType {
return cartesianProduct return cartesianProduct
} }
func parseParameters(parameters map[string]interface{}, variablesMapping map[string]interface{}) ([]paramsType, error) { func parseParameters(parameters map[string]interface{}, variablesMapping map[string]interface{}) (map[string]paramsType, error) {
if len(parameters) == 0 { if len(parameters) == 0 {
return nil, nil return nil, nil
} }
var parsedParametersSlice []paramsType parsedParametersSlice := make(map[string]paramsType)
var err error var err error
for k, v := range parameters { for k, v := range parameters {
var parameterSlice paramsType var parameterSlice paramsType
@@ -546,7 +550,7 @@ func parseParameters(parameters map[string]interface{}, variablesMapping map[str
if err != nil { if err != nil {
return nil, err return nil, err
} }
parsedParametersSlice = append(parsedParametersSlice, parameterSlice) parsedParametersSlice[k] = parameterSlice
} }
return parsedParametersSlice, nil return parsedParametersSlice, nil
} }
@@ -599,7 +603,7 @@ func parseSlice(parameterName string, parameterContent interface{}) ([]map[strin
} }
func initParameterIterator(cfg *TConfig, mode string) (err error) { func initParameterIterator(cfg *TConfig, mode string) (err error) {
var parameters []paramsType var parameters map[string]paramsType
parameters, err = parseParameters(cfg.Parameters, cfg.Variables) parameters, err = parseParameters(cfg.Parameters, cfg.Variables)
if err != nil { if err != nil {
return err return err
@@ -614,15 +618,16 @@ func initParameterIterator(cfg *TConfig, mode string) (err error) {
} }
rawValue := reflect.ValueOf(cfg.ParametersSetting.Strategy) rawValue := reflect.ValueOf(cfg.ParametersSetting.Strategy)
switch rawValue.Kind() { switch rawValue.Kind() {
case reflect.Slice: case reflect.Map:
// strategy: ["random", "sequential"], 每个参数对应一个迭代器,每个迭代器随机、顺序选取元素互不影响 // strategy: ["random", "sequential"], 每个参数对应一个迭代器,每个迭代器随机、顺序选取元素互不影响
if len(parameters) != rawValue.Len() { if len(parameters) != rawValue.Len() {
return errors.New("parameters and strategy should have the same length") return errors.New("parameters and strategy should have the same length")
} else { } else {
for i := 0; i < rawValue.Len(); i++ { for _, k := range rawValue.MapKeys() {
key := k.Convert(rawValue.Type().Key())
cfg.ParametersSetting.Iterators = append( cfg.ParametersSetting.Iterators = append(
cfg.ParametersSetting.Iterators, cfg.ParametersSetting.Iterators,
newIterator(parameters[i], rawValue.Index(i).Interface().(string), cfg.ParametersSetting.Iteration), newIterator(parameters[k.Interface().(string)], rawValue.MapIndex(key).String(), cfg.ParametersSetting.Iteration),
) )
} }
} }