diff --git a/hrp/runner.go b/hrp/runner.go index 109dd479..1879c441 100644 --- a/hrp/runner.go +++ b/hrp/runner.go @@ -490,8 +490,11 @@ func (r *SessionRunner) Start(givenVars map[string]interface{}) (summary *TestCa default: // parse step struct err = r.parseStepStruct(step) - if err != nil && r.caseRunner.hrpRunner.failfast { - return summary, errors.Wrap(err, "parse step struct failed") + if err != nil { + log.Error().Err(err).Msg("parse step struct failed") + if r.caseRunner.hrpRunner.failfast { + return summary, errors.Wrap(err, "parse step struct failed") + } } stepName := step.Name() @@ -570,8 +573,8 @@ func (r *SessionRunner) Start(givenVars map[string]interface{}) (summary *TestCa func (r *SessionRunner) parseStepStruct(step IStep) error { stepStruct := step.Struct() - // parse step variables: merges step variables with config variables and session variables - // override variables, step variables > session variables (extracted variables from previous steps) + // update step variables: merges step variables with config variables and session variables + // variables priority: step variables > session variables (extracted variables from previous steps) overrideVars := mergeVariables(stepStruct.Variables, r.sessionVariables) // step variables > testcase config variables overrideVars = mergeVariables(overrideVars, r.caseRunner.Config.Variables) @@ -600,6 +603,16 @@ func (r *SessionRunner) parseStepStruct(step IStep) error { if !ok { return errors.New("validator type error") } + // parse validator check + // FIXME: validate with current step's extracted variables + // check, err := r.caseRunner.parser.Parse( + // validator.Check, stepStruct.Variables) + // if err != nil { + // return errors.Wrap(err, "failed to parse validator check") + // } + // validator.Check, _ = check.(string) + + // parse validator expect validator.Expect, err = r.caseRunner.parser.Parse( validator.Expect, stepStruct.Variables) if err != nil { diff --git a/hrp/runner_test.go b/hrp/runner_test.go index 3213c13d..c3bff944 100644 --- a/hrp/runner_test.go +++ b/hrp/runner_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/rs/zerolog/log" + "github.com/stretchr/testify/assert" "github.com/httprunner/httprunner/v4/hrp/internal/code" ) @@ -222,3 +223,41 @@ func TestRunCaseWithRefAPI(t *testing.T) { t.Fatal() } } + +func TestSessionRunner(t *testing.T) { + testcase := TestCase{ + Config: NewConfig("TestCase"). + WithVariables(map[string]interface{}{ + "a": 12.3, + "b": 3.45, + "varFoo": "${max($a, $b)}", + }), + TestSteps: []IStep{ + NewStep("check variables"). + WithVariables(map[string]interface{}{ + "a": 12.3, + "b": 34.5, + "varFoo": "${max($a, $b)}", + }). + GET("/hello"). + Validate(). + AssertEqual("status_code", 200, "check status code"), + // AssertEqual("$varFoo", "$b", "check varFoo value"), + }, + } + + caseRunner, _ := NewRunner(t).NewCaseRunner(testcase) + sessionRunner := caseRunner.NewSession() + step := testcase.TestSteps[0] + if !assert.Equal(t, step.Struct().Variables["varFoo"], "${max($a, $b)}") { + t.Fatal() + } + + err := sessionRunner.parseStepStruct(step) + if err != nil { + t.Fatal() + } + if !assert.Equal(t, step.Struct().Variables["varFoo"], 34.5) { + t.Fatal() + } +} diff --git a/hrp/step_mobile_ui.go b/hrp/step_mobile_ui.go index 75435941..c2629902 100644 --- a/hrp/step_mobile_ui.go +++ b/hrp/step_mobile_ui.go @@ -326,7 +326,7 @@ func (s *StepMobile) Sleep(n float64) *StepMobile { // SleepRandom specify random sleeping seconds after last action // params have two different kinds: -// 1. [min, max] : min and max are float64 time range boudaries +// 1. [min, max] : min and max are float64 time range boundaries // 2. [min1, max1, weight1, min2, max2, weight2, ...] : weight is the probability of the time range func (s *StepMobile) SleepRandom(params ...float64) *StepMobile { s.obj().Actions = append(s.obj().Actions, uixt.MobileAction{