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

View File

@@ -9,10 +9,10 @@
"username-password": "${parameterize(examples/account.csv)}"
},
"parameters_setting": {
"strategy": [
"random",
"sequential"
],
"strategy": {
"user_agent": "sequential",
"username-password": "random"
},
"iteration": 10
},
"variables": {

View File

@@ -4,7 +4,9 @@ config:
user_agent: [ "iOS/10.1", "iOS/10.2" ]
username-password: ${parameterize(examples/account.csv)}
parameters_setting:
strategy: ["random", "sequential"]
strategy:
user_agent: "sequential"
username-password: "random"
iteration: 10
variables:
app_version: v1

View File

@@ -494,10 +494,14 @@ func findallVariables(raw string) variableSet {
return varSet
}
func genCartesianProduct(params []paramsType) paramsType {
if len(params) == 0 {
func genCartesianProduct(paramsMap map[string]paramsType) paramsType {
if len(paramsMap) == 0 {
return nil
}
var params []paramsType
for _, v := range paramsMap {
params = append(params, v)
}
var cartesianProduct paramsType
cartesianProduct = params[0]
for i := 0; i < len(params)-1; i++ {
@@ -512,11 +516,11 @@ func genCartesianProduct(params []paramsType) paramsType {
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 {
return nil, nil
}
var parsedParametersSlice []paramsType
parsedParametersSlice := make(map[string]paramsType)
var err error
for k, v := range parameters {
var parameterSlice paramsType
@@ -546,7 +550,7 @@ func parseParameters(parameters map[string]interface{}, variablesMapping map[str
if err != nil {
return nil, err
}
parsedParametersSlice = append(parsedParametersSlice, parameterSlice)
parsedParametersSlice[k] = parameterSlice
}
return parsedParametersSlice, nil
}
@@ -599,7 +603,7 @@ func parseSlice(parameterName string, parameterContent interface{}) ([]map[strin
}
func initParameterIterator(cfg *TConfig, mode string) (err error) {
var parameters []paramsType
var parameters map[string]paramsType
parameters, err = parseParameters(cfg.Parameters, cfg.Variables)
if err != nil {
return err
@@ -614,15 +618,16 @@ func initParameterIterator(cfg *TConfig, mode string) (err error) {
}
rawValue := reflect.ValueOf(cfg.ParametersSetting.Strategy)
switch rawValue.Kind() {
case reflect.Slice:
case reflect.Map:
// 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++ {
for _, k := range rawValue.MapKeys() {
key := k.Convert(rawValue.Type().Key())
cfg.ParametersSetting.Iterators = append(
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),
)
}
}