mirror of
https://github.com/httprunner/httprunner.git
synced 2026-07-27 00:37:02 +08:00
feat: set step loops with expression variable
This commit is contained in:
48
runner.go
48
runner.go
@@ -11,6 +11,7 @@ import (
|
||||
"os"
|
||||
"os/signal"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
"syscall"
|
||||
"testing"
|
||||
@@ -707,14 +708,9 @@ func (r *SessionRunner) RunStep(step IStep) (stepResult *StepResult, err error)
|
||||
log.Info().Str("step", stepName).Str("type", stepType).Msg("run step start")
|
||||
|
||||
// run times of step
|
||||
loopTimes := step.Config().Loops
|
||||
if loopTimes < 0 {
|
||||
log.Warn().Int("loops", loopTimes).Msg("loop times should be positive, set to 1")
|
||||
loopTimes = 1
|
||||
} else if loopTimes == 0 {
|
||||
loopTimes = 1
|
||||
} else if loopTimes > 1 {
|
||||
log.Info().Int("loops", loopTimes).Msg("run step with specified loop times")
|
||||
loopTimes, err := r.getLoopTimes(step)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "failed to get loop times")
|
||||
}
|
||||
|
||||
// run step with specified loop times
|
||||
@@ -840,3 +836,39 @@ func (r *SessionRunner) GetSessionVariables() map[string]interface{} {
|
||||
func (r *SessionRunner) GetTransactions() map[string]map[TransactionType]time.Time {
|
||||
return r.transactions
|
||||
}
|
||||
|
||||
func (r *SessionRunner) getLoopTimes(step IStep) (int, error) {
|
||||
loops := step.Config().Loops
|
||||
if loops == nil {
|
||||
// default run once
|
||||
return 1, nil
|
||||
}
|
||||
|
||||
loopTimes, err := loops.Value()
|
||||
if err != nil {
|
||||
parsed, err := r.caseRunner.parser.ParseString(
|
||||
*loops.StringValue, step.Config().Variables)
|
||||
if err != nil {
|
||||
return 0, errors.Wrap(err, "failed to parse loop times")
|
||||
}
|
||||
switch v := parsed.(type) {
|
||||
case int:
|
||||
loopTimes = v
|
||||
case string:
|
||||
n, err := strconv.Atoi(v)
|
||||
if err != nil {
|
||||
return 0, errors.Wrap(err, "failed to parse loop times")
|
||||
}
|
||||
loopTimes = n
|
||||
}
|
||||
}
|
||||
if loopTimes < 0 {
|
||||
return 0, fmt.Errorf("loop times should be positive, got %d", loopTimes)
|
||||
} else if loopTimes == 0 {
|
||||
loopTimes = 1
|
||||
} else if loopTimes > 1 {
|
||||
log.Info().Int("loops", loopTimes).Msg("set multiple loop times")
|
||||
}
|
||||
|
||||
return loopTimes, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user