mirror of
https://github.com/httprunner/httprunner.git
synced 2026-08-28 19:47:14 +08:00
add each parameter selection strategy.
This commit is contained in:
@@ -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": {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user