From f7efadf2073162d7c3d17a8b44c455ec7eae6596 Mon Sep 17 00:00:00 2001
From: debugtalk <mail@debugtalk.com>
Date: Mon, 15 Nov 2021 15:12:21 +0800
Subject: [PATCH] change: add session variables

---
 boomer.go    |  3 +--
 runner.go    | 20 ++++++++++----------
 step_test.go |  5 ++---
 3 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/boomer.go b/boomer.go
index fdeff43..f9c603e 100644
--- a/boomer.go
+++ b/boomer.go
@@ -43,11 +43,10 @@ func (b *Boomer) convertBoomerTask(testcase *TestCase) *boomer.Task {
 		Weight: testcase.Config.Weight,
 		Fn: func() {
 			config := &testcase.Config
-			extractedVariables := make(map[string]interface{})
 			for _, step := range testcase.TestSteps {
 				var err error
 				start := time.Now()
-				stepData, err := runner.runStep(step, config, extractedVariables)
+				stepData, err := runner.runStep(step, config)
 				elapsed := time.Since(start).Nanoseconds() / int64(time.Millisecond)
 				if err == nil {
 					boomer.RecordSuccess(step.Type(), step.Name(), elapsed, stepData.ResponseLength)
diff --git a/runner.go b/runner.go
index c630c5d..30f7832 100644
--- a/runner.go
+++ b/runner.go
@@ -36,13 +36,15 @@ func NewRunner(t *testing.T) *Runner {
 			},
 			Timeout: 30 * time.Second,
 		},
+		sessionVariables: make(map[string]interface{}),
 	}
 }
 
 type Runner struct {
-	t      *testing.T
-	debug  bool
-	client *http.Client
+	t                *testing.T
+	debug            bool
+	client           *http.Client
+	sessionVariables map[string]interface{}
 }
 
 func (r *Runner) SetDebug(debug bool) *Runner {
@@ -88,10 +90,8 @@ func (r *Runner) runCase(testcase *TestCase) error {
 
 	log.Info().Str("testcase", config.Name).Msg("run testcase start")
 
-	extractedVariables := make(map[string]interface{})
-
 	for _, step := range testcase.TestSteps {
-		_, err := r.runStep(step, config, extractedVariables)
+		_, err := r.runStep(step, config)
 		if err != nil {
 			return err
 		}
@@ -101,12 +101,12 @@ func (r *Runner) runCase(testcase *TestCase) error {
 	return nil
 }
 
-func (r *Runner) runStep(step IStep, config *TConfig, extractedVariables map[string]interface{}) (stepData *StepData, err error) {
+func (r *Runner) runStep(step IStep, config *TConfig) (stepData *StepData, err error) {
 	log.Info().Str("step", step.Name()).Msg("run step start")
 
 	// override variables
-	// step variables > extracted variables from previous steps
-	stepVariables := mergeVariables(step.ToStruct().Variables, extractedVariables)
+	// step variables > session variables (extracted variables from previous steps)
+	stepVariables := mergeVariables(step.ToStruct().Variables, r.sessionVariables)
 	// step variables > testcase config variables
 	stepVariables = mergeVariables(stepVariables, config.Variables)
 
@@ -139,7 +139,7 @@ func (r *Runner) runStep(step IStep, config *TConfig, extractedVariables map[str
 
 	// update extracted variables
 	for k, v := range stepData.ExportVars {
-		extractedVariables[k] = v
+		r.sessionVariables[k] = v
 	}
 
 	log.Info().
diff --git a/step_test.go b/step_test.go
index 2aea0c2..1f2e56e 100644
--- a/step_test.go
+++ b/step_test.go
@@ -77,12 +77,11 @@ func TestRunRequestRun(t *testing.T) {
 	config := &TConfig{
 		BaseURL: "https://postman-echo.com",
 	}
-	extractedVariables := make(map[string]interface{})
 	runner := NewRunner(t).SetDebug(true)
-	if _, err := runner.runStep(stepGET, config, extractedVariables); err != nil {
+	if _, err := runner.runStep(stepGET, config); err != nil {
 		t.Fatalf("tStep.Run() error: %s", err)
 	}
-	if _, err := runner.runStep(stepPOSTData, config, extractedVariables); err != nil {
+	if _, err := runner.runStep(stepPOSTData, config); err != nil {
 		t.Fatalf("tStepPOSTData.Run() error: %s", err)
 	}
 }